首页 » 前端 » Lua » 正文

macOS 一键打开/切换到 App(替代 Cmd + Tab)

发布者:站点默认
2020/01/11 浏览数(1,202) 分类:Lua, macOS macOS 一键打开/切换到 App(替代 Cmd + Tab)已关闭评论

20200804更新

GitHub


说明

用快捷键打开指定 APP,如果已经打开就在这个 APP 打开的窗口中循环切换。

快捷键为“CapsLock + 字母”,详见下表(可自定义)。单按 CapsLock 还是本身的锁定大小写功能。

CapsLock + e 打开 Finder.app
CapsLock + t 打开 Terminal.app
CapsLock + a 打开 Affinity Photo.app
CapsLock + b 打开 Bear.app
CapsLock + d 打开 DBeaver.app
CapsLock + f 打开 Fork.app
CapsLock + g 打开 Google Chrome.app
CapsLock + m 打开 Activity Monitor.app
CapsLock + o 打开 wpsoffice.app
CapsLock + q 打开 QQ.app
CapsLock + s 打开 System Preferences.app
CapsLock + v 打开 Visual Studio Code.app
CapsLock + w 打开 wechatwebdevtools.app
CapsLock + x 打开 Xcode.app

其它设置:

CapsLock + /         显示所有的 CapsLock 快捷建,“/”在“?”键上,可以理解为 CapsLock + ?
CapsLock + shift + t 在终端中打开 finder 里选中的文件夹(这项在系统设置里键盘的快捷方式中设置)
CapsLock + r         F5,部分 App 上的刷新不是 cmd+r 而是 F5,而 F5 可能藏在 touchbar 里
CapsLock + space     打开 Spotlight 搜索,要先在设置中将 cmd+space 换成 cmd+opt+ctrl+space

预览快捷键提醒:

需要的软件

Hammerspoon        - 用快捷键打开指定 APP
Karabiner-Elements - 按下 CapsLock 变成按下 Ctrl + Option + Command(单按还是大小写锁定)

配置文件

Hammerspoon 的配置 ~/.hammerspoon/init.lua

--[[
建议将下边的代码放入 hotkey.lua 中
然后在 init.lua 中使用 require "hotkey" 来引入
init.lua 中尽量放一些全局的配置
--]]

-- 需要打开的常用工具
apps = {
  {key = 'e', app = '/System/Library/CoreServices/Finder.app'},
  {key = 't', app = '/System/Applications/Utilities/Terminal.app'},
  {key = 'a', app = '/Applications/Affinity Photo.app'},
  {key = 'b', app = '/Applications/Bear.app'},
  {key = 'd', app = '/Applications/DBeaver.app'},
  {key = 'f', app = '/Applications/Fork.app'},
  {key = 'g', app = '/Applications/Google Chrome.app'},
  {key = 'm', app = '/System/Applications/Utilities/Activity Monitor.app'},
  {key = 'o', app = '/Applications/wpsoffice.app'},
  {key = 'q', app = '/Applications/QQ.app'},
  {key = 's', app = '/System/Applications/System Preferences.app'},
  {key = 'v', app = '/Applications/Visual Studio Code.app'},
  {key = 'w', app = '/Applications/wechatwebdevtools.app'},
  {key = 'x', app = '/Applications/Xcode.app'}
}

--  打开/切换到App(可以在当前 APP 的窗口间切换)
local launchOrFocusWindowByPath = function(path)
  return function()
    local curApp = hs.application.frontmostApplication()
    if curApp:path() == path then -- 当前 APP 就是要打开的 APP 时找到当前 APP 的下一个窗口
      -- APP 的所有窗口(不含 toast、scrollarea 等窗体)
      local wins = hs.fnutils.filter(curApp:allWindows(), function(item)
        return item:role() == "AXWindow"
      end)
      -- APP 没有窗口或只有一个窗口时直接返回(关闭所有窗口后程序并没有退出,所以写的是 <= 而不是 =,finder 有一个窗口是“桌面”)
      if #wins <= 1 then
        return
      end
      -- 显示当前 APP 的下一个窗口
      local curWin = curApp:focusedWindow()
      table.sort(wins, function(x, y)
        return x:id() < y:id()
      end)
      wins[#wins + 1] = wins[1] -- 把第一个窗口追加到末尾,用于当前窗口是最后一个窗口时可以快速找到下一个窗口
      for k, v in ipairs(wins) do
        if v:id() == curWin:id() then
          wins[k + 1]:focus()
          return
        end
      end
    else -- 当前 APP 不是要打开的 APP 时直接切到 APP 不用切换 APP 的窗口
      hs.application.launchOrFocus(path)
    end
  end
end

-- 为常用工具绑定快捷键
hs.fnutils.each(
  apps,
  function(entry)
    hs.hotkey.bind(
      {'ctrl', 'alt', 'cmd'},
      entry.key,
      nil,
      -- function()
      --   hs.application.launchOrFocus(entry.app)
      -- end
      launchOrFocusWindowByPath(entry.app)
    )
  end
)

alertStyle = {
  strokeColor = {white = 1, alpha = 0.25 },
  radius   = 5,
  textFont = 'Monaco',
  textSize = 16,
  atScreenEdge = 0
}

-- 获得当前 APP 的信息
hs.hotkey.bind(
  {'ctrl', 'alt', 'cmd'},
  '.',
  function()
    hs.alert.closeAll()
    hs.alert.show(
      string.format(
        '%s\n%s\n%s\n%sj',
        hs.window.focusedWindow():application():title(),
        hs.application.frontmostApplication():bundleID(),
        hs.window.focusedWindow():application():path(),
        hs.keycodes.currentSourceID()
      ),
      alertStyle
    )
  end
)

-- 显示可用快捷键清单
hs.hotkey.bind(
  {'ctrl', 'alt', 'cmd'},
  '/',
  function()
    hs.alert.closeAll();
    local info = ''
    if hs.application.frontmostApplication():path() == '/System/Library/CoreServices/Finder.app' then
      info = info .. 'Caps-T Terminal Here\n'
    end
    for k, v in ipairs(apps) do
      info = info .. 'Caps-' .. v.key .. ' ' .. string.match(v.app, '/([%w%s]+).app$') .. '\n'
    end
    info = info .. 'Caps-r F5' -- 最后一项加 \n 会多一个空行
    hs.alert.show(
      info,
      alertStyle
    )
  end
)

Karabiner-Elements 的配置 ~/.config/karabiner/assets/complex_modifications/capslock-enhancement.json

{
  "title": "CapsLock Enhancement",
  "rules": [
    {
      "description": "Hyper: 按住 CapsLock",
      "manipulators": [
        {
          "from": {
            "key_code": "caps_lock",
            "modifiers": {
              "optional": ["any"]
            }
          },
          "to": [
            {
              "key_code": "right_control",
              "modifiers": ["right_command", "right_option"]
            }
          ],
          "to_if_alone": {
            "hold_down_milliseconds": 100,
            "key_code": "caps_lock"
          },
          "type": "basic"
        }
      ]
    },
    {
      "description": "CapsLock + r to F5",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "r",
            "modifiers": {
              "mandatory": [
                "right_command",
                "right_control",
                "right_option"
              ]
            }
          },
          "to": [
            {
              "key_code": "f5"
            }
          ]
        }
      ]
    }
  ]
}

Win 一键打开/切换到 App(替代 Alt + Tab)

点击返回顶部
  1. 留言
  2. 联系方式