MacOS cmd tab增强

问题背景

在日常使用mac时,经常会使用cmd w关闭窗口或是cmd m最小化窗口,但是使用cmd wcmd m后,会导致在cmd tab时,虽然会显示该应用,但是无法重新唤起窗口。

比如,使用cmd w关闭spotify或者chatgpt后,cmd tab无法唤醒。

解决方法初探

  1. 尝试搜索cmd tab的增强方案,比如 HyperSwitch, Witch, AltTab等软件,但是无法实现需求
  2. 改变使用习惯,不使用cmd wcmd m,而是cmd h,但是cmd h需要两只手按,而cmd w只需要单手,所以也不方便。

Hammerspoon搭配Lua脚本

Hammerspoon 是一款 macOS 自动化工具,可以通过 Lua 脚本控制和增强系统行为。它就像是 macOS 的“自动化万能遥控器”,功能非常强大但也偏技术向。

具体步骤:

  1. 安装软件

  2. 右键菜单 Open Config 打开配置文件

    image-20250612012357727

  3. 添加脚本

    -- 需要管理的 App 列表(可按需扩展)
    local managedApps = {
        ["Spotify"] = "com.spotify.client",
        ["ChatGPT"] = "com.openai.chat"
    }
    
    -- 保存上次切换的 App,避免重复处理
    local lastAppName = nil
    
    -- 应用切换监听器
    hs.application.watcher.new(function(appName, eventType, app)
        if eventType == hs.application.watcher.activated then
            -- 避免重复处理相同 App
            if appName == lastAppName then return end
            lastAppName = appName
    
            -- 延迟执行以等待系统切换完成
            hs.timer.doAfter(0.05, function()
                local frontApp = hs.application.frontmostApplication()
                if not frontApp then return end
    
                -- 如果是被管理的 App,则尝试恢复窗口
                if managedApps[appName] then
                    local mainWin = frontApp:mainWindow()
    
                    -- 情况1:窗口存在但被最小化
                    if mainWin and mainWin:isMinimized() then
                        mainWin:unminimize()
                        mainWin:focus()
    
                    -- 情况2:主窗口不存在(可能被 Cmd+W 关闭)
                    elseif not mainWin then
                        hs.timer.doAfter(0.05, function()
                            hs.application.launchOrFocusByBundleID(managedApps[appName])
                        end)
                    end
                end
            end)
        end
    end):start()
    
  4. 右键菜单 Reload Config 打开配置文件

如何添加其他APP:

  • 获取 App 的 Bundle ID:
osascript -e 'id of app "App名称"'

例如:

osascript -e 'id of app "WeChat"'
# 输出: com.tencent.xinWeChat
  • 在 managedApps 中添加:
["App显示名"] = "App的BundleID"
posted @ 2025-06-12 01:32  Miaops  阅读(90)  评论(0)    收藏  举报