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

14448 次点击
所在节点    macOS
79 条回复
Sylv
2019-05-22 07:25:44 +08:00
@ooops 我用搜狗输入法,打中文的时候字母是会上屏的,然后这时切换输入法这些上屏的字母还是会保留。
Sylv
2019-05-22 07:30:25 +08:00
@liumengdi 😂
“短按左 Command ⌘ → 切换到英文输入法”的意思是把单按 Command 键改键成切换英文输入法的快捷键,箭头是表示绑定什么功能的意思,不是指 Command 键 + 右方向键。
liumengdi
2019-05-22 09:45:00 +08:00
@Sylv 明白啦, 改成了你的配置, 很方便😁
tchekai704
2019-05-25 22:58:34 +08:00
楼主思路不错,trying。
汇报一个 bug,当使用 Microsoft Remote Desktop / Parallels Desktop 等方式访问 Windows 时,shift 会导致无法切换 Windows 下输入法的中英文。需要加入如下配置来排除 shift 的作用范围

"conditions": [
{
"type": "frontmost_application_unless",
"bundle_identifiers": [
"^com\\.microsoft\\.rdc\\.macos$",
"^com\\.parallels\\.winapp"
]
}
],
tchekai704
2019-05-25 23:01:01 +08:00
另外 hyper key 的思路与我不谋而合,我是用 alfred 来设置的,同时我的 hyper key 不是 tab,而是 option。
理由是 macOS 下的“ option+字母”是输入一些不常用的符号,所以没有任何程序对这个快捷键进行了绑定,不存在任何冲突。
jijifujiji
2019-10-18 18:03:19 +08:00
楼主我想问下 macbook 在系统里面设置快捷键的时候 是怎么把那个设置为 F18 的呀
我这边只有能按出的键位或者组合键才可以设置
Sylv
2019-10-18 18:19:59 +08:00
@jijifujiji 先用 Karabiner 绑定某个键 /组合键为 F18,然后用绑定的键 /组合键在设置快捷键时按下就可以设置成 F18 了。
jijifujiji
2019-10-22 23:35:55 +08:00
@Sylv 谢谢楼主🙏,搞好了
我还有个问题想问下楼主,就是 我想把切换窗口的 command + tab 替换成 option + tab 应该怎么搞,我照着例子胡乱改了下,不好用,楼主知道正确的应该怎么弄吗
{
"description": "Change Alt + tab to Command + tab",
"manipulators": [
{
"from": {
"simultaneous": [
{
"key_code": "left_option"
},
{
"key_code": "tab"
}
],
"modifiers": {
// "mandatory": [
// "command",
// ],
"optional": [
"any"
]
}
},
"to": [
{
// "key_code": "tab",
"simultaneous": [
{
"key_code": "command"
},
{
"key_code": "tab"
}
],
// "modifiers": [
// "command",
// ]
}
],
"type": "basic"
}
]
}
Sylv
2019-10-23 05:14:47 +08:00
@jijifujiji

这样:

{
"description": "Change Alt + tab to Command + tab",
"manipulators": [
{
"from": {
"key_code": "tab",
"modifiers": {
"mandatory": [
"left_option"
]
}
},
"to": {
"key_code": "tab",
"modifiers": [
"command"
]
},
"type": "basic"
}
]
}
jijifujiji
2019-10-23 10:50:12 +08:00
@jijifujiji
卧槽,楼主碉堡了!!
jijifujiji
2019-10-23 10:50:40 +08:00
@Sylv
好用的一批
Vendettar
2020-02-09 16:57:42 +08:00
真的🐂🍺
dofine
2020-02-16 16:25:06 +08:00
> 所以就可以用来定义一些新的快捷键(我主要是用 BetterTouchTool 来设置这些快捷键,Karabiner-Elements 虽然也可以通过写配置文件来实现,但是 BetterTouchTool 有界面可以直接设置会更方便点)

楼主可以介绍下写配置文件咋实现么。。主要是不舍的买 BTT 哈哈哈
Sylv
2020-02-18 06:02:59 +08:00
@dofine 用 Karabiner-Elements 设置组合键的话还是有点麻烦的,每个组合键都得单独写配置,我很长时间没弄了,记不清怎么写了,你研究参考下 Manual 吧,不过我还是会建议用 BetterTouchTool 等有界面的程序来设置,会简单很多。

https://pqrs.org/osx/karabiner/document.html
ruooooooli
2020-02-23 16:19:50 +08:00
把窗口移动到左 / 右显示屏

楼主这个是怎么实现的呢
Sylv
2020-02-24 01:07:04 +08:00
@ruooooooli 这个我是用 Moom ( https://manytricks.com/moom/) 实现的,有个 Move to Other Display 的功能可以绑定快捷键。
ruooooooli
2020-02-24 09:48:21 +08:00
@Sylv 感谢
ruooooooli
2020-02-24 22:45:51 +08:00
@Sylv 试了一下 moom 和我想要的还是不太一样,可能是我没有表达清楚,我其实想要的是向 Ubuntu 一样,把一个窗口移动到另一个桌面 space 🤣
Sylv
2020-02-25 01:39:11 +08:00
@ruooooooli 看了下貌似 Moom 和 BetterTouchTool 都没有把窗口移到另一个 Space 的功能。
ruooooooli
2020-02-25 10:47:05 +08:00
@Sylv 我也发现了,他们都是移动窗口到另一个屏幕上。我目前找到了 sizeup 可以实现这个功能。

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

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

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

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

© 2021 V2EX