起因

从 Windows 切换到 macOS,说实话我没有什么不适应。兼容性问题对于不要求很高性能的我来说用 Crossover 和虚拟机就能解决了,所以最不习惯的部分竟然成了:输入法切换。

在 Windows 下,我只有两个输入法。中英文输入我使用搜狗输入法,日文输入使用 Baidu IME,后来换成 Google 家的日本語入力。在这种使用情境下,我使用 shift 键切换中英文输入,win 键 + Backspace 切换中日或英日输入。所以尽管 Windows 支持单独设定指定输入法快捷键,我也从来没有用到过;我对 macOS 下输入法切换的不习惯也并非因此产生。

在 macOS Sierra 下,系统自带的 ABC 输入法不能被删除。你时不时会需要它来输入一些密码之类不能被第三方输入法侦测的信息。而为了输入中文(拼音)与日文(平假名),我又需要搜狗和系统自带的日文输入法键盘。

ABC 选择中的删除项呈灰色

这下,我就需要三个键盘来实现我在 Windows 上两个输入法就能实现的操作了。更糟的是, macOS Sierra 的系统偏好设置中我只能设置「选择上一个输入法」和「选择下一个输入法」,不能设置指定输入法的快捷键。如果我只有两个键盘,那什么都好说,不是这一个就是那一个。但现在我有三个键盘,就算我有 isHUD 帮我,也不可能耐得住每次都试着切换输入法看看我到底在哪。

事实上,我这么干了一个月就已经感到十分头疼了。尽管区区三个键盘也可能可以形成一定肌肉记忆,但我认为这样实在是太麻烦了,我的小脑瓜遭不住。所以我认真考虑起了如何实现指定快捷键切换到指定输入法的实现。

最终输入法方案和使用工具

输入法方案

我目前达到的效果是,使用CapsLock + A 切换到搜狗输入法,使用CapsLock + Q 切换到日文假名输入,使用CapsLock + Z 切换到英文输入状态。

其中,我还取消了搜狗输入法的 shift 键切换中英输入,中英混输使用 enter 键上屏。CapsLock 键则被我取消了功能,改为 hyper 键(即相当于 command + control + option + shift 键一起按下),大写英字输入使用 shift 键 + 字母键。

使用工具

由于 macOS Sierra 的限制,改键神器 Karabiner 不兼容 macOS Sierra 。

好在作者开发了支持 macOS Sierra 的新工具 Karabiner-Elements ,作为过渡暂时支持Karabiner 的核心功能。也因为只支持核心功能,本来用 Karabiner 就能解决的问题,现在我需要 Karabiner-Elements 和 Keyboard Maestro 两个 app 才能解决。前者只是用来修改 hyper 键,如果不用这个键也可以去掉这个选择。

此外,因为孤陋寡闻和没有吃透 Keyboard Maestro 的功能,我最开始绕了很远的弯路来实现这个需求,但后来发现假如没有购入 Keyboard Maestro 或者不愿意为此在后台增加一个 app ,可以使用这个办法迂回地通过 Alfred 的 workflow 功能来实现同样的效果。

这种情况下,需要的工具是:

  1. Inputsource(在 GitHub 上找到的工具,赞美作者,虽然是五年前的作品但依然有效)

  2. Alfred

实现过程一( hyper 键)

这一步我主要是参考了这篇文章,文中给出了一个为 hyper 键定制的版本的下载链接,可以到这个 pull quest 里下载这个版本使用。

下载下来之后是 dmg 文件里封了一个 pkg 文件,总之安装就对了……

安装完成之后新增两个 app ,分别是 Karabiner-Elements 和 Karabiner-EventViewer。打开 Karabiner-Elements ,界面如下图,直接选择并设定即可。

界面如图

实现过程二(使用 Keyboard Maestro 设定快捷键切换到指定输入法)

如果是没了解过 Keyboard Maestro (以下 KM )的朋友,建议看一下《Keyboard Maestro 入门指南》,写得非常深入浅出。

在基本了解 KM 的运行逻辑和操作之后,鉴于 KM 本身内置了切换输入法的 Action ,只需要搜索 Keyboard 就能出来对应的 Action :Set Keyboard Layout ,然后如图设置即可。

实现过程三(利用 Alfred 和 Inputsource 实现快捷键切换指定输入法)

首先下载 Inputsource ,解压后将 Inputsource 移动到 /usr/local/bin/

然后唤出终端,或者唤出 Alfred 使用> +命令 操作,键入

/usr/local/bin/Inputsource

获取目前输入法的 input source ID 。

举例:

com.apple.inputmethod.Kotoeri.Japanese

= 系统日文输入法平假名模式。

然后打开 Alfred ,新建一个空白 workflow ,选择 Triggers-Hotkey ,设定好快捷键,新建Actions-Run Script ,输入

/usr/local/bin/Inputsource 刚才获得的 input source ID

例如

/usr/local/bin/Inputsource com.apple.inputmethod.Kotoeri.Japanese

将两者连接起来,进行 test ,多半就成功了。

缺点

不同 app 情况不同,根据我这边的使用实例(我使用的是 KM 版本),有时候会出现切换成功但输出仍然是英语的情况(使用 Ulysses 写作过程中也有出现,搜索后发现好像不是个例),切换输入焦点再切换回来之后恢复正常。

另外,因为现在 Karabiner-Elements 的限制,映射好像只能实现单键,无法分辨组合键与单键区别和长按短按的区别,至于 Alfred 和 KM 则好像都无法将双击修饰键设定为 Trigger ,所以就舍弃了双击某键切换到输入法的方案,选择了目前的。

除了我使用的这两种方法,似乎还有通过 Apple Scripts 模拟 Keycode 102(日语键盘英字)和 104 (假名)的方法,但我这边的 Automator 无法成功运行,所以放弃了。

望能提供思路w