美国作家 H. Jackson Brown Jr. 说过一句很有名的话:

Never make fun of someone who speaks broken English. It means they know another language.

永远不要取笑说蹩脚英语的人,因为这意味着他们懂另一门语言。

尽管这是一句给英语母语者的告诫,很多英语母语者对此也表示非常赞同,然而我第一次看见这句话时,心里却充满了对英语母语者的羡慕,因为他们可以几乎不需要切换键盘输入法。而作为一名中文母语者,在电子输入设备上切换英文和中文输入法,则是我每天的高频操作。

macOS 提供了切换输入法和浏览器的系统级方法,比如通过快捷键「轮换」输入法,或者使用 Caps Lock 键切换输入法。

macOS 系统提供的切换输入法的方法
macOS 系统提供的切换输入法的方法

然而,系统级的方案并不完美,基本上只是「还能用」的水平,当前使用的到底是哪种输入法,很多时候还是得靠「盲猜」,无法满足我的需求。正因如此,很多切换输入法的第三方应用应运而生,它们一般提供了更为丰富的功能,比如为每种输入法自定义一个快捷键,记住上次使用的输入法,显示当前的输入法,根据应用切换输入法等:

与切换输入法类似,切换系统默认浏览器也具有相同的问题。一般情况下,我们只能在 系统设置中进行修改。

在系统设置中切换默认浏览器
在系统设置中切换默认浏览器

与切换输入法不同的是,我们还可以直接在浏览器内的设置中将其设置为系统默认浏览器。

在 Google Chrome 中将其设置为系统默认浏览器
在 Google Chrome 中将其设置为系统默认浏览器

然而,这两种方法都需要打开特定的应用程序,操作起来很麻烦。大概正是基于这样的痛点,市面上同样也有专门用于切换 macOS 默认浏览器的应用,比如:

不过这几个 App 都是收费应用,对于切换默认浏览器这个简单的功能来说,价格也实在算不上便宜。

我派很多用户的原则是首选使用系统自带应用,也就是第一方应用,对于第三方应用表示谨慎。与此相比,我的原则稍微有一点不同:尽量使用高质量的应用,不论是第一方还是第三方的。按照我的标准,不少专门用于切换输入法和浏览器的应用都不能算是高质量的第三方应用,而它们提供的功能实际上可以通过高质量的应用来完成。

基于以上原因,本文尝试使用 macOS 自动化领域的佼佼者——Keyboard Maestro 来实现快捷切换输入法和浏览器的功能。需要指出的是,Keyboard Maestro 并非一个免费的应用,官网售价 36 美元,但考虑到 Keyboard Maestro 能够实现的丰富功能,个人认为这个价格相当值得,因此非常推荐入手。

切换输入法

在使用 Keyboard Maestro 切换输入法之前,我用的是 macOS 上强大的改键工具 Karabiner-Elements,并搭配 GitHub 上的 一个配置,可以实现「短按左 ⌘ Command 键切换为中文输入法,短按左 ⌥ Option 键切换为英文输入法」。我很喜欢这种方式,因为它让英文和中文输入法分别有了一个对应的快捷键,让我不用盲猜当前是什么输入法。形成肌肉记忆之后,输入英文前,短按一下左 ⌥ Option 键,输入中文前,短按一下左 ⌘ Command 键,打字时基本上不会出错。

使用 Karabiner-Elements 切换输入法
使用 Karabiner-Elements 切换输入法

然而,如这个配置文件所写的那样,这个方法的问题在于「可能会出现切换失败的情况」,我在实际使用过程中也经常遇到切换失败或延迟的情况,非常影响打字效率。也正是由于存在这个问题,我一直在寻找快捷准确地切换输入法的方法,于是将目光转向了 Keyboard Maestro。

Keyboard Maestro 中有一个叫作「Set Keyboard Layout」的动作,用于设置系统中已开启的输入法。与 Karabiner-Elements 相比,这个动作相当快速而且十分准确,我从没有遇到延迟或切换失败的情况。为了使用它,我们只需设置一个触发条件,就可以实现切换输入法的功能。你可以按照上面提到的 Kawa 那样,在 Keyboard Maestro 中选择触发条件为「Hot Key Trigger」,为每种输入法设置一个单独的快捷键(不仅限于英文和中文),但这种触发方式只能是组合快捷键,不能是单独的一个 ⌘ 或 ⌥ 等修饰键(Modifier Keys)。

由于切换输入法是一个相当高频的操作,为了找回熟悉的快捷切换方式,我没有使用快捷键触发,而选择的触发条件是「USB Device Key Trigger」,因为这样可以实现「短按左 ⌘ Command 键,切换为中文双拼输入法,短按左 ⌥ Option 键,切换为英文 ABC 输入法」,如下图所示。

短按左 ⌘ Command 键,切换为中文双拼输入法,短按左 ⌥ Option 键,切换为英文 ABC 输入法
短按左 ⌘ Command 键,切换为中文双拼输入法,短按左 ⌥ Option 键,切换为英文 ABC 输入法

需要提醒的是,上面的 Keyboard Maestro 宏之所以会显示「Karabiner DriverKit VirtualHIDKeyboard 1.6.0」,是因为我安装了 Karabiner-Elements。另外,由于 ⌘ Command 是组合快捷键的修饰键,按下其他快捷键的时候也会触发切换输入法的操作,比如按下左边的 ⌘ Command + A,也会将当前输入法切换为中文。也就是说,无论单独还是组合按下 ⌘ Command/ ⌥ Option 键,都会触发切换输入法的操作,不过,好消息是这并不会影响快捷键的正常工作,因此并没有什么「副作用」。当然,如果你不喜欢单个修饰键的触发方式,可以根据键盘布局和个人偏好,设置为其他按键触发。

根据应用切换输入法

不少切换输入法的 App 可以「根据应用切换输入法」,这对于一些只需使用特定输入法的应用来说,非常实用,比如在 iTermVS Code 中,一般不需要使用中文输入法,只需要使用 ABC 输入法。借助 Keyboard Maestro 的「Set Keyboard Layout」动作,我们只需将触发条件设置为「特定应用激活时」,就可以非常简单地实现「根据应用切换输入法」这个功能,如下图所示。

一打开 iTerm 就将输入法切换为 ABC
一打开 iTerm 就将输入法切换为 ABC

在浏览器地址栏切换为 ABC

在浏览器地址栏中,我们一般只会输入网址,因此希望光标定位到浏览器地址栏时,输入法自动切换为 ABC 输入法,而不是中文输入法。

尽管 Keyboard Maestro 无法将「光标定位到浏览器地址栏」作为触发条件,但我们可以用快捷键山寨一个类似的操作。在 Safari、Chrome、Firefox 等主流浏览器中,定位到地址栏的快捷键是 ⌘ Command + L,它的名称一般叫作「Open Location…」,因此可以将触发条件设置为快捷键 Command + L,然后将输入法切换为 ABC,再模拟按下快捷键 Command + L,如下图所示。

在浏览器地址栏切换为 ABC 的 Keyboard Maestro 宏
在浏览器地址栏切换为 ABC 的 Keyboard Maestro 宏
使用快捷键定位到浏览器地址栏时切换输入法为 ABC
使用快捷键定位到浏览器地址栏时切换输入法为 ABC

关于切换输入法,还不得不提到 Vim,因为在 Vim 是基于英文开发的,在其中使用中文是一件非常痛苦的事。如果你在 Mac 上使用 Vim,想要提高使用中文输入的效率,推荐使用 SmartIM 这个插件,用于切换输入法。

切换浏览器

切换默认浏览器

Keyboard Maestro 论坛上有一位网友分享了一个切换系统默认浏览器的 ,但它需要安装 Xcode,看起来非常复杂,因此我没有使用它。

Keyboard Maestro 论坛中的一个切换浏览器的复杂的宏
Keyboard Maestro 论坛中的一个切换浏览器的复杂的宏

但也是在 Keyboard Maestro 论坛上相关的讨论中,我发现了 defaultbrowser 这个命令行工具——用于切换 macOS 系统中的默认浏览器,可以使用 Homebrew 来安装它:

brew install defaultbrowser

你也可以下载源代码,然后自行构建并安装它:

make && make install

安装完成之后,在终端中输入 defaultbrowser,会输出 Mac 上已安装的所有浏览器的 HTTP handler,这可以看作是浏览器的编码。例如在我的 Mac 上,输出结果为:

  chrome
  torbrowser
  firefox
  kagimacos
  browser
  iterm2
  downie-setapp
  folx3-setapp
  safari
  bettertouchtool-setapp
  edgemac

以上输出结果中,大多数名称都能直接看出是哪个浏览器,但也有几个不是那么明显,比如 kagimacosOrion 浏览器browserArc 浏览器edgemacMicrosoft Edge

知道了浏览器的编码,我们就可以通过 defaultbrowser 在命令行中来切换系统默认浏览器,例如设置为 Google Chrome:

defaultbrowser chrome

按下回车键执行上面这行命令之后,Mac 会弹出一个二次确认窗口,询问你是否确定要切换默认浏览器,你需要手动点击切换或不切换。

切换默认浏览器时 Mac 弹出的二次确认窗口
切换默认浏览器时 Mac 弹出的二次确认窗口

为了避免每次都要手动点击这个弹出式窗口,我们可以借助 下面的 AppleScript 来自动进行确认:

tell application "System Events"
  tell application process "CoreServicesUIAgent"
    tell window 1
      tell (first button whose name starts with "use")
        perform action "AXPress"
      end tell
    end tell
  end tell
end tell

因此,切换系统默认浏览器需要两个步骤(以切换为 Google Chrome 为例):

  1. 在终端中输入 defaultbrowser chrome
  2. 执行 AppleScript 在弹出式窗口中进行确认

为了方便快捷地执行这两个步骤,我在 Keyboard Maestro 中创建了一个切换浏览器的宏组,其中有 7 个宏,分别切换为我的 Mac 中可能会用到的浏览器。

Keyboard Maestro 中切换浏览器的宏
Keyboard Maestro 中切换浏览器的宏

这 7 个宏的动作基本一致,都只有两个步骤,第一步执行 Shell 脚本切换默认浏览器,第二步执行 AppleScript 进行确认。需要注意的是,在 Keyboard Maestro 中执行 Shell 脚本,需要指定可执行文件的绝对路径,否则无法运行成功。由于我在 M1 Mac 上使用 Homebrew 安装 defaultbrowser,因此第一栏中写的是:

/opt/homebrew/bin/defaultbrowser browser

这 7 个宏设置的触发条件都是同一个快捷键 ⇧ + ⌥ + Right Arrow,目的是为了利用 Keyboard Maestro 的 Conflict Palette,而这正是能实现快捷切换默认浏览器的关键。

通过 Keyboard Maestro 的 Conflict Palette 切换默认浏览器
通过 Keyboard Maestro 的 Conflict Palette 切换默认浏览器

在上面的演示图中,切换前的默认浏览器是 Safari,我一共按了两次键盘(有些按键没有被录制下来),将默认浏览器切换成了 Chrome。首先按下快捷键 ⇧ + ⌥ + Right Arrow,由于这 7 个宏的触发方式都是这个快捷键,因此 Keyboard Maestro 会调出 Conflict Palette,将 7 个宏同时显示出来。

按下快捷键后弹出的 Conflict Palette
按下快捷键后弹出的 Conflict Palette

注意到每个宏名称的首字母是灰色的,与其他字母的颜色不同,而这就是它们的快捷键。因此我们直接在键盘上按下对应的字母,比如 c,就可以将默认浏览器切换为 Chrome1,而完全不需要使用鼠标进行点击,不得不说,Keyboard Maestro 不愧为名副其实的「键盘大师」。

在另一个浏览器打开当前标签页

除了切换默认浏览器外,有时候我们也需要在特定浏览器中打开某些网页。例如,我主要使用 Safari,但为了在某些网页中使用 Chrome 浏览器上独有的插件,需要将 Safari 中当前打开的网页在 Chrome 中打开。当然,你可以选择在 Safari 中复制当前网页标签的链接,然后粘贴到 Chrome 的地址栏中打开,不过这显然不是一个高效的方法。借助 Keyboard Maestro,我们可以通过快捷键,一步实现「在另一个浏览器打开当前标签页」。

在另一个浏览器打开当前标签页的 Keyboard Maestro 动作
在另一个浏览器打开当前标签页的 Keyboard Maestro 动作

上图中的这个宏通过快捷键 ⌃ + ⌥ + ⇧ + ⌘ + J 触发,然后执行下面这段 AppleScript:

tell application "Safari"
	activate
	set sameURL to URL of document 1
end tell
tell application "Google Chrome"
	open location (sameURL)
	activate
end tell

就可以将 Safari 中当前打开的网页窗口在 Chrome 中打开,当然,你也可以修改这段 AppleScript,用于其他浏览器。

在 Chrome 中打开 Safari 中的当前标签页
在 Chrome 中打开 Safari 中的当前标签页

小结

在 macOS 上,很多细小的功能没有提供系统级的支持,用户不得不选择安装第三方应用来实现。例如,为了隐藏太多的菜单栏图标,不得不安装 Bartender 或类似的免费替代品,为了像 Windows 一样通过右键新建文件,需要安装 iBoysoft MagicMenu

尽管如此,单独下载一个 App 并非必选项,挖掘自动化应用的潜力,其实可以实现同样的功能,足以省下一些不必要的开支。例如 BetterTouchTool 就可以实现 隐藏菜单栏图标 的功能,而使用 Alfred,则可以通过键盘轻松 新建文件

Keyboard Maestro 是 macOS 上一个非常强大的自动化应用,如果善加利用,足以代替很多不必要的 App。本文介绍了使用 Keyboard Maestro 在 Mac 上实现切换输入法和浏览器,这是两个很常见的需求,可以极大地提高使用 Mac 的效率,希望对你有所帮助。