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. 启用全部或部分改键规则。

14464 次点击
所在节点    macOS
79 条回复
Steven55k
2020-02-29 19:19:25 +08:00
楼主好,我这边点此导入一直显示 failed to connect the serve,下午尝试自己实现了一部分,核心的输入法部分实在没找到解决方案,希望方便的话能单发一下 json 给我!
Sylv
2020-03-01 11:50:54 +08:00
Steven55k
2020-03-02 13:34:30 +08:00
@Sylv 谢啦!~很完美。你关于 Tab 和 Capslock 的理念也很棒,很顺手
litianqi1995
2020-03-10 00:49:40 +08:00
感谢楼主,推荐 Karabiner 另一个功能 喜欢把外置键盘放到内置键盘上的人 放的不好老会误触,禁用系统键盘了。Karabiner 而且断开置键盘 直接会恢复到自带键盘 非常好用
dj2rap
2020-03-13 10:14:40 +08:00
楼主,有没有切换隐藏程序的脚本,上面那个挂了
Sylv
2020-03-13 11:11:15 +08:00
@dj2rap 切换程序隐藏是用 BetterTouchTool 来设置的。
ruooooooli
2020-04-03 19:34:09 +08:00
加上 Hyper Key 之后,发现 Tab 用起来好不顺手哈哈哈
helsinglee
2020-10-10 22:08:04 +08:00
@Sylv 新版有点兼容性问题!大写切换无法输入
Sylv
2020-10-11 15:07:55 +08:00
@helsinglee 你是什么版本?我是 macOS Catalina 10.15.5 + Karabiner-Elements 13.0.0,目前还是正常工作。
helsinglee
2020-10-18 23:59:54 +08:00
@Sylv macOS Catalina 10.15.6 + Karabiner-Elements 13.0.0 工作不正常。退回 12.10 ,目前正常使用。
jijifujiji
2020-11-02 20:01:53 +08:00
“TISSelectInputSource API 的问题得到修复(这问题好几年了,我怀疑根本不会修复了?),才能直接用 select_input_source 来实现这种一键切换效果了。”
这个问题应该就是本来应该出现输入法配置的那块出现...吧,这总是我研究老长时间了,还以为输入法有问题
sidkang
2021-03-24 17:09:47 +08:00
仍旧 suffer 于 TISSelectInputSource 的 bug,真是无奈= =
LoneFireBlossom
2021-10-25 16:28:15 +08:00
楼主你好,我想导入配置,但 cloudapp 说“The item owner has been notified that their item has exceeded its view limit.”,没法导入= =是不是得重新开放下载啊
Sylv
2021-10-26 12:03:34 +08:00
@LoneFireBlossom
已在第 1 条附言里更新了新的导入配置链接,请查看。
ohmytime
2021-11-20 20:09:35 +08:00
@ruooooooli 很赞, sizeup 的确能把 窗口移动到另外一个 space.
Kobayashi
2021-11-26 20:46:30 +08:00
Karabiner 切换输入法是有问题

- select_input_source 基于 TISSelectInputSource, 切换多了会失效。输入法图标变了但是输入法不变。
- left_shift 直接映射 Ctrl+Space 问题是切换频率过快失效,可能需要多次触发 left_shift 才能切换成功。(没搞明白这是个什么 bug )
- 映射 left_shift 到 f13-f19 ,然后在系统设置中配置 f13-f19 为输入法切换快捷键。目前看起来没有以上问题
Anna1879
2021-12-06 04:06:13 +08:00
非常感谢楼主的维护,很好用。
使用过程中,由于我日常使用`⌘-L + ␣`调用 Alfred ,所以在 Karabiner-Elements 采用了单键切换输入法设置之后,会产生两个效果:
1. 当前输入法为中文时,启动 Alfred 默认输入法改为英文;
2. 当前输入法为英文时,启动 Alfred 默认输入法改为中文;

这就导致无法统一 Alfred 调取的输入法,对 workflow 调用极为不利,还自我增加了一个在 Alfred 搜索中需判断输入法的步骤。

此时,使用 Keyboard Maestro ,设置按下`⌘␣`自动将输入法改为英文即可解决上述问题。
Sylv
2021-12-06 04:44:58 +08:00
@Anna1879
Alfred 其实自带有自动切换到特定输入法的功能:
设置中 Advanced - Force Keyboard
Anna1879
2021-12-06 11:33:29 +08:00
@Sylv 谢谢提醒:),那这个解决方案堪称完美了。
LoneFireBlossom
2021-12-09 16:36:12 +08:00
@LoneFireBlossom #53
其实我一直都是需要输入中英日三种语言,所以就没用楼主的方法,导入楼主的方法放在 karabiner-elements 里留着传家(

所以我就老老实实用 Keyboard Maestro 来设置,用左右 CMD 、OPT 键来切换语言。

> 经常会切换到中文输入法后,菜单栏的输入法图标已经变为中文了,但是打出来的字却还是英文。( Keyboard Maestro 等使用相同 API 来切换输入法的工具都有这个问题。)

针对这个问题,其实我觉得这个 BUG 的频率我还能接受。10 次切换有一次会出现吧差不多?
出现问题的时候我就快速按三下切换语言,我是把系统的那个在各个输入法间切换的快捷键设置成了左 OPT (忘了左 OPT 映射成 F 十几了),因为有三个输入法,所以按三下切换键就从中文再次切换到中文,这样的切换是正常的。

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

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

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

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

© 2021 V2EX