Macos Stage 快捷键

2023-08-18
2 min read

mac stage manager 提供了一个真正无打扰的工作环境.

最近使用 macos 的 stage manager, 感觉十分清爽. stage manager 提供了一个真正无打扰的环境, 在此模式下可以屏蔽其他的窗口, 只显示当前窗口. 甚至可以屏蔽桌面的文件, 因此好看的壁纸可以 “无污染” 的展示了. 不过非常可惜的是, stage manager 未提供切换不同 application 的快捷键设置. 倘若使用 Alfred 等软件又无法一键切换应用, 幸运的是我们可以使用 mac 提供的 Automator 来实现一键切换应用.

content

尝试一

首先, 打开 Automator.app > File new (command N) > Quick Action > Run AppleScript
输入如下代码, 并使用播放按键, 进行简单测试. 如果能成功切换至 Emacs 说明程序生效了.
接下来将此 Automator 程序保存并命名 OpenEmacs

1  on run {input, parameters}
2  
3  	(* Your script goes here *)
4  	tell application "Emacs"
5  		activate
6  	end tell
7  
8  end run

其次,我们为 OpenEamcs 设置一个快捷键. 打开 System Settings.app > Keyboard > Keyboard Shortcuts > Service > General
选择 OpenEmacs 并设置快捷键. 保存后使用快捷键进行测试.

我自己将 command + R 设置为 Chrome 的快捷键. 将 command + K 设置为 Emacs 的快捷键.

注意 Keyboard 的快捷键可能和系统的快捷键以及和app内置的快捷键冲突,
经测试发现 Keyboard 的快捷键有先级比较低, 如过冲突则按键事件无法抵达 Automator.
因此需要根据大家的应用情况设置合理的快捷键

尝试二

其灵感来源于某个APP, 可以使用一个组合键来对某个应用进行 Toggle Visual. Toggle 这个单词大家应该不陌生, 就是切换的意思.
使用同一个按键当应用此时正打开的时则将其隐藏, 当此时应用正隐藏时将其放在桌面最上层.
在我的 laptop 上, 我将 Emacs 绑定至 command + kChrome 绑定至 command + h, 键位冲突较少可供大家参考.

1  tell application "System Events"
2  	if visible of application process "Emacs" is true then
3  		set visible of application process "Emacs" to false
4  	else
5  		tell application "Emacs" to activate
6  	end if
7  end tell

尝试三

尝试二的优化, 尝试二使用了 applescript 带来的问题是, 切换应用的速度明显能感觉到有延迟.网上搜索到了使用 hammerspoon 的方案, 亲自测试了下速度非常快, 可以说是终级解决方案了.

toggleApp = function(appName, launch)
  launch = launch or false
  local app = hs.application.get(appName)
  if app then
      if app:isFrontmost() then
          app:hide()
      else
          app:activate()
      end
  else
      if launch then
          hs.application.launchOrFocus(appName)
      else
          hs.alert.show("App '" .. appName .. "' is not loaded!")
      end
  end
end

hs.hotkey.bind({"cmd"}, "K", function()
    toggleApp("Emacs")
end)


hs.hotkey.bind({"cmd"}, "F", function()
    toggleApp("Finder")
end)

hs.hotkey.bind({"cmd"}, "R", function()
    toggleApp("Google Chrome")
end)