截止 20250301 仍在正常使用中。
说明
用快捷键打开指定 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"
}
]
}
]
}
]
}

