Karabiner-Elements 配置:输入法一键切换 & CapsLock 等改键

2019-05-20 09:03:53 +08:00
 Sylv

输入法切换改键

这套输入法切换方案我已经使用多年了,个人认为是 macOS 下最佳的中英文输入法切换方案,这几天有几位朋友询问是如何用 Karabiner-Elements 实现的,我就整理了一下分享出来。

实现的效果

长按或者组合键按左右 Command ⌘ 和 Shift ⇧ 时仍保留原有修饰键功能。

为什么这样改键

问题一

大部分中文输入法都带有中文和英文两种输入模式,再加上系统自带的英文输入法,实际上我们使用的时候会有 3 种输入状态:

而这 3 种输入状态要用两种快捷键在它们之间切换,我相信很多朋友都有在这 3 种输入状态中纠缠不清的困恼。但其实我们只需要中英两种输入状态,有一种英文输入状态是多余的,如果将其去除掉,整个中英文输入切换过程就会简单很多。

一种解决方法是:用奇技淫巧去禁用系统自带的英文输入法,只使用中文输入法来输入中英文。但这并不是很靠谱,因为系统有的地方会强制使用英文输入法,禁用掉英文输入法可能会导致在一些地方无法输入密码等问题。

更好的解决方法是:禁用掉中文输入法的英文输入模式,只使用中文输入法来输入中文,使用英文输入法来输入英文,各司其职,各尽其责。

但是 macOS 默认切换输入法的快捷键( Command ⌘ + 空格 ␣ / Control ⌃ + 空格 ␣)用起来并不是很顺手,很多朋友应该和我一样都是习惯用 Shift ⇧ 来切换中英两种输入状态。因此这个改键方案首先实现了用 Shift ⇧ 来切换输入法,这样在中英输入法之间切换就会方便很多,我也保留了默认的 Command ⌘ + 空格 ␣ 快捷键(可以按需选择是否启用,或者像我一样只启用右 Command ⌘ + 空格 ␣,左 Command ⌘ + 空格 ␣ 是我的 Alfred 快捷键)。

问题二

除了这个问题以外,传统的输入法切换还有个痛点:需要先判断当前的输入状态才能决定是否要切换,特别是 macOS 菜单栏的输入法图标并不是很醒目,需要将视焦从打字区移动到右上角菜单栏才能知道现在是什么输入状态,容易打断思路,而且这个过程就像 USB 要两次才能插对一样经常会判断出错。

这个问题的终极解决方法就是给中英文输入法分别设置单独的快捷键,而且最好是一键快捷键,这样打字过程中就不再需要判断当前输入法状态,可以直接无脑一键切换到所需的输入法。 我个人认为最适合担当这组快捷键的就是左右 Command ⌘ 键(左 ⌘ → 英文;右 ⌘ → 中文),在用标准手势打字时,左右 Command ⌘ 可以用左右大拇指很方便地按到,而且具有对称性,容易和中英文输入法建立联系养成肌肉记忆。

如何实现的

Karabiner-Elements 其实是有个 select_input_source 方法可以直接切换到指定输入法的,原本要实现上述的一键切换是挺简单的,几行配置就行。

但是 select_input_source 底层使用的 TISSelectInputSource macOS 输入法切换 API 长期以来对 CJKV (中文、日文、韩文、越南文)这类较为复杂的输入法的切换存在问题:经常会切换到中文输入法后,菜单栏的输入法图标已经变为中文了,但是打出来的字却还是英文。( Keyboard Maestro 等使用相同 API 来切换输入法的工具都有这个问题。)

因此为了规避这个问题,不得不让 Karabiner-Elements 使用一种稍微复杂点的变通方法来实现我们想要的改键(⇧ → 切换输入法;左 ⌘ → 英文;右 ⌘ → 中文):

  1. 将系统切换输入法的快捷键更改为一个不存在的键 F18
  2. 短按 Shift ⇧(切换快捷键)时,输出 F18 来切换输入法。
  3. 短按左 Command ⌘(英文快捷键)时:
    • 如果当前输入法已经是英文 → 什么都不做 → 英文输入法
    • 如果当前输入法是中文 → 输出 F18 来切换输入法 → 英文输入法
  4. 短按右 Command ⌘(中文快捷键)时:
    • 如果当前输入法是英文 → 输出 F18 来切换输入法 → 中文输入法
    • 如果当前输入法已经是中文 → 什么都不做 → 中文输入法

这样就间接实现了我们想要的效果,但是这个变通方法只有当系统只有中英两种输入法时才会有效,要不然一键切换时可能会误切换到不是想要的第三种输入法。因此如果你有使用三种或以上输入法,目前这套改键配置并不适用,只有等未来 TISSelectInputSource API 的问题得到修复(这问题好几年了,我怀疑根本不会修复了?),才能直接用 select_input_source 来实现这种一键切换效果了。

使用方法

  1. 点此导入 Karabiner-Elements 配置

  2. 启用全部或部分改键规则。

  3. 打开 系统偏好设置( System Preferences ) > 键盘( Keyboard ) > 快捷键( Shortcuts ) > 输入法( Input Sources ),在 选择上一个输入法( Select the previous input source )快捷键处,短按 Shift ⇧ 键(此时已被改键为 F18),将此快捷键修改为 F18

  4. 修改你的中文输入法设置,禁用掉英文输入模式,或者将初始状态设置为中文,并禁用掉中英文状态切换快捷键,以我使用的搜狗输入法为例:

注:此配置理论上应该支持所有简体中文输入法(输入法语言代码为 zh-Hans),如果你使用的是繁体输入法,需要手动将配置文件内的所有 zh-Hans 替换为 zh-Hant



CapsLock / Control / Tab 改键

除了输入法切换改键以外,顺便也分享下我还使用的一些改键配置。

实现的效果

为什么这样改键

CapsLock ⇪ 改成 Control ⌃ 和 Esc ⎋ 就不细说了,对于有需求的用户,算是较为公认的最佳改键方案了,特别好用,谁用谁知道。

CapsLock ⇪ 改成 Control ⌃ 后,左 Control ⌃ 就功能重复了,而我有时候还是需要用大写锁定键的,所以我就把短按左 Control ⌃ 改成了 CapsLock ⇪。

而左 Control ⌃ 和其它键一起按时,我则是把它改成了一个新的修饰键——Super Key (⌃⌥⌘),相当于同时按下 Control ⌃ + Option ⌥ + Command ⌘。

左手小指区还有个容易按到的 Tab ⇥ 键,我们基本都不会去长按它,所以就可以把它和其它键一起按时改键成另外一个新修饰键——Hyper Key (⇧⌃⌥⌘),相当于同时按下 Shift ⇧ + Control ⌃ + Option ⌥ + Command ⌘。

Super Key (⌃⌥⌘) 和 Hyper Key (⇧⌃⌥⌘) 这两个新的修饰键和其它键组合基本不会和现有快捷键冲突,而且可以很方便地用小拇指一键按到,所以就可以用来定义一些新的快捷键(我主要是用 BetterTouchTool 来设置这些快捷键,Karabiner-Elements 虽然也可以通过写配置文件来实现,但是 BetterTouchTool 有界面可以直接设置会更方便点)。

Super Key(左 Control ⌃)我主要是用来设置一些和窗口布局相关的快捷键(我用的是一台带鱼屏 + MacBook Pro 屏,所以经常需要对窗口进行排列整理),例如:

Hyper Key( Tab ⇥)我主要是用来设置一些常用程序的切换快捷键和一些搜索快捷键,例如:

使用方法

  1. 点此导入 Karabiner-Elements 配置

  2. 启用全部或部分改键规则。

13348 次点击
所在节点    macOS
77 条回复
Sylv
2019-05-20 09:05:46 +08:00
tinybaby365
2019-05-20 09:22:40 +08:00
太复杂了。只用 Emacs key bindings [control+keys]
Rsl
2019-05-20 09:43:26 +08:00
我是 caps lock 切换输入法. 专门设置两个键分别切换中英这个思路不错, 我也去弄一下.
justdoit123
2019-05-20 09:46:59 +08:00
10.14.6 挂了 真是烦人
devtiange
2019-05-20 09:57:26 +08:00
右 shift 平时不怎么用, 用来切换输入法就好了.
楼主搞那么多钟切换方式, 自己不会乱吗?

PS: 可以搭配 https://github.com/tekezo/ShowyEdge 中文输入法开启的时候, 在屏幕上显示一条线, 这样能更方便确认当前状态.
TZ
2019-05-20 10:26:14 +08:00
好多热键啊
Sylv
2019-05-20 10:58:00 +08:00
@devtiange 实际上我平常只用左右 Command 来切换输入法,已经养成条件反射了,其它快捷键只是最初为了过渡习惯才保留的。
sunocean
2019-05-20 11:52:04 +08:00
这个思路启发了我, 真的很不错。
@devtiange 这个软件真的很好用。 发现基本在零设置的情况下。 解决了不知道当前输入法是什么的痛点。 目前使用 caps locks + 这个软件 来实现输入法切换。 省去了适应新快捷键的时间。
20015jjw
2019-05-20 13:27:55 +08:00
space cadet 读一下
sethverlo
2019-05-20 15:22:38 +08:00
求问楼主,想把 caps 改成 control, 短按 shift 切换中英(自带输入法),长按 shift + 某个键就是大写,这样能改吗……能的话就抛弃搜狗了
PerFectTime
2019-05-20 15:54:37 +08:00
EngelEyes
2019-05-20 15:54:41 +08:00
自娱自乐挺好的,有些可能还是要看使用者自己的习惯。
ooops
2019-05-20 16:21:34 +08:00
楼主,右 command 实在有些难按,我想改成别的键,你的配置要怎么修改?
unco020511
2019-05-20 17:22:24 +08:00
说实话我到现在都没彻底搞清楚 mac 的输入法切换
Sylv
2019-05-21 06:33:58 +08:00
@sethverlo

可以实现的,你导入上面的两个配置文件,然后启用这几个改键:
- Tap Shift_L (⇧) → Switch input source (F18) | 短按左 Shift (⇧) → 切换输入法
- Tap Shift_R (⇧) → Switch input source (F18) | 短按右 Shift (⇧) → 切换输入法
- Tap CapsLock (⇪) → Escape (⎋); Hold CapsLock (⇪) → Control (⌃) | 短按 CapsLock (⇪) → Escape (⎋); 长按 CapsLock (⇪) → Control (⌃)

再按上面说明改下切换输入法快捷键为 F18,这样就能实现你想要的效果,如果你不需要短按 CapsLock (⇪) → Esc (⎋),那可以到下面链接找只改 CapsLock (⇪) → Control (⌃) 的配置:
https://pqrs.org/osx/karabiner/complex_modifications/#caps_lock
Sylv
2019-05-21 06:41:21 +08:00
@ooops

你倒入我的配置后,修改你的配置文件:
~/.config/karabiner/karabiner.json

查找左右 Command 的键代码 left_command 和 right_command,把它们替换成你想要的键代码就行。

PS: 右 Command 应该很好按啊,就在空格键旁边,大拇指一移就按到了,你用的不是 Mac 布局的键盘?
sethverlo
2019-05-21 10:41:36 +08:00
@Sylv 感谢,让我研究研究…
szzhiyang
2019-05-21 10:51:32 +08:00
比 Power Keys 的空格编辑功能差了十万八千里:

https://PowerKeys.GitHub.io
ooops
2019-05-21 10:52:12 +08:00
@Sylv #16 外接键盘,左边 command 还好,空格较长,右边的 command 感觉多隔了一个键。
我遇到另外一个问题是我用清歌已经打出了部分字母,然后切换输入法字母没有上屏。这比较尴尬。。还在尝试中。
liumengdi
2019-05-21 19:04:24 +08:00
Command ⌘ → 不是把光标移到最右边的快捷键么? 改成切换输入法不会有冲突么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/565667

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX