前一段时间更新了MacOS 14 Sonoma之后,到今天想用 Command + ` 来切换窗口的时候发现怎么按都不行,上苹果社区看发现很多人都表示遇到了这个问题,但是都没有解决办法。后来去reddit看了一下,找到一个老哥用Hammerspoon——类似于Windows那边的AutoHotkey,可以自己写lua脚本调用macos的API实现一些操作——来手工实现这个快捷键本来应有的功能(中文叫做“将焦点移到下一个窗口”,英文是“move focus to next window”)。原帖在这:Mesieu: I’m going to fix this through Hammerspoon…。
安装HammerSpoon直接上github:Releases,下载zip之后双击解压,再手动移动到Finder的“应用程序”里面,然后双击打开,钩上登录自启动(Launch Hammerspoon at login),然后点击“Enable Accessibility”前往设置App启用辅助功能:
然后就是设置脚本了,点击状态栏的锤子图标,选择Open Config就会用默认的文本编辑器打开一个窗口用来编辑init.lua
,我们暂时没有其他功能需要用所以就直接把这个Command + `的功能的脚本塞进去就行。
我改了一下原作者的脚本里绑定的快捷键,直接改成了 Command + ` :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function getOrderedWindowsOfCurrentApp()
local currentWindow = hs.window.focusedWindow()
local appWindows = currentWindow:application():allWindows()
-- Filter out minimized windows and sort by window id
local orderedWindows = {}
for _, win in pairs(appWindows) do
if not win:isMinimized() then
table.insert(orderedWindows, win)
end
end
table.sort(orderedWindows, function(a, b) return a:id() < b:id() end)
return orderedWindows, currentWindow
end
function switchToNextWindowOfSameApp()
local orderedWindows, currentWindow = getOrderedWindowsOfCurrentApp()
for i, win in ipairs(orderedWindows) do
if win == currentWindow then
local nextWindow = orderedWindows[i + 1] or orderedWindows[1]
nextWindow:focus()
break
end
end
end
function switchToPreviousWindowOfSameApp()
local orderedWindows, currentWindow = getOrderedWindowsOfCurrentApp()
for i, win in ipairs(orderedWindows) do
if win == currentWindow then
local previousWindow = orderedWindows[i - 1] or orderedWindows[#orderedWindows]
previousWindow:focus()
break
end
end
end
hs.hotkey.bind('cmd', '`', switchToNextWindowOfSameApp)
hs.hotkey.bind({'cmd', 'shift'}, '`', switchToPreviousWindowOfSameApp)
保存之后点击状态栏的锤子图标选择Reload Config,然后在设置App的 键盘-键盘快捷键-键盘 里面把将焦点移动到下一个窗口的勾取消掉。
这个时候按Command + `就可以实现切换同一应用程序的窗口的功能了。