Mac上command+`失效的临时解决办法

于 2024-01-10 发布

前一段时间更新了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启用辅助功能:

Hammerspoon Preferences

辅助功能

然后就是设置脚本了,点击状态栏的锤子图标,选择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 + `就可以实现切换同一应用程序的窗口的功能了。