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

14467 次点击
所在节点    macOS
79 条回复
LoneFireBlossom
2022-01-20 21:29:45 +08:00
楼主只用两种输入法,但我用三种,所以在这儿补充一下现在我的使用方法。

环境:MBP16 intel Monterey 12.1 、12.2 beta

这七八天来我用的是 kawa ( https://github.com/hatashiro/kawa )来切换输入法。感觉比用 keyboard maestro 来设置要好。
用 keyboard maestro 切换的问题就是楼主说过的,按下快捷键切换中文,系统显示输入法是中文,结果实际上还是英文。

用 kawa 的话没有这个问题,它的问题是我按下切换到中文 /日语输入法的快捷键之后,不能瞬间开始打字,得稍微缓个 0.1 秒左右(总之就是别太快就行)。这个问题比用 keyboard maestro 来切换输入法的问题要轻太多了,所以我的输入体验提升了很多。
别的就没任何问题了。

注意:
用 kawa 需要阅读其旧版项目中的 readme ,新版里不知为何删掉了这段,见: https://github.com/zcbenz/kawa
摘抄如下,我刚开始没设置这个,结果体验和 keyboard maestro 的方法一样。设置之后就没有 keyboard maestro 的问题了。

# For CJKV input sources

There is a known bug in the TIS library of macOS that switching keyboard layouts doesn't work well when done programmatically, especially between complex input sources like CJKV.

Kawa workarounded this bug by programmatically doing the followings:

Select a target input source
If the source is CJKV
Switch to the first non-CJKV input source
Return to the target input source by sending Select the previous input source shortcut
Thus, to activate the workaround above, the following restrictions should meet.

There is at least one non-CJKV input source in the input source list
The Select the previous input source shortcut should be enabled and set to something
It can be set in System Preferences > Keyboard > Shortcuts > Input Sources
CZCaptain
2022-06-23 13:26:57 +08:00
哈喽楼主好
目前我的方案是这样:
短按 caps→esc
长按 caps→command
可不可以将你提到的短按左 command 切换至英文输入法这个配置融合到短按 caps→esc 这里面去,这样在全局环境下,只要按下 caps ( esc ),就能退出插入模式,并且自动切换输入法为英文?

这是我目前的 karabiner caps 键配置,不知道可不可改
{
"description": "Change caps_lock to Command if pressed with other keys, to escape if pressed alone.",
"manipulators": [
{
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_command"
}
],
"to_if_alone": [
{
"key_code": "escape"
}
],
"type": "basic"
}
]
},
Sylv
2022-06-28 06:16:28 +08:00
@CZCaptain 你好,我很久没折腾过 Karabiner 配置了,已经生疏了,所以我也不太清楚你的需求能不能用 Karabiner 实现,抱歉。
helsinglee
2022-10-24 10:54:09 +08:00
@CZCaptain 也许不行,发现改建后的修饰键有点问题。
bnpysse
2023-05-05 14:40:48 +08:00
我用清歌五笔输入法,好像不起作用呢。

另外,我使用了 Manico ,是不是与使用它有关系?因为使用了 Manico ,从而造成了 Karabiner 不起作用?
bnpysse
2023-05-06 08:20:14 +08:00
找到原因了,我需要在 Karabiner 当中把 Left-Shift 以及 Right-Shift 映射成 F18 才可以。

我还是想保留长按 Shift+字母的大写功能,这个对我来说,我还是觉得很用的。

其它的都好,就是想保留一下 Shift 的长按功能,怎么改呢?有了解的朋友么?谢谢!
capgrey
2023-07-25 23:14:27 +08:00
感谢楼楼主!
LoneFireBlossom
2023-09-19 00:02:40 +08:00
@LoneFireBlossom
现在已经不需要使用 kawa 了。
使用新版 input source pro ,设置切换输入法的快捷键,并打开故障排除-修复输入法切换问题。就没有 CJKV 语言的问题了
LoneFireBlossom
2023-10-10 17:44:38 +08:00
@LoneFireBlossom 不过目前试了试还是不如 kawa 好用,有的时候还是会出现显示切换到中文但是实际上还是英文的问题,等再更新吧
Polygene
294 天前
蹲一个 Win 平台左右 Alt 键切换中英文的方案,这个方案我在 macos 上试用之后感觉确实很好用,输入效率提高好多。
zmxnv123
257 天前
如果使用三种输入法,中日英三语,只使用 f18 的话只能在两种输入法之间切换,所以有什么办法使用 TISSelectInputSource API 吗。
zmxnv123
257 天前
@Polygene autohotkey 可以实现
zmxnv123
257 天前
@LoneFireBlossom 老哥, 故障排除-修复输入法切换问题 在哪里打开?我也是中日英三种输入法切换。
LoneFireBlossom
257 天前
@zmxnv123 #73 我上面写了啊,还是得用 kawa
zmxnv123
257 天前
@LoneFireBlossom 看了下 kawa ,原来是用了 option+control+space 快捷键。我直接绑到 karabiner 上去了,没有用 kawa ,目前使用没啥问题。https://gist.github.com/nzooherd/9e83731c70ba68f87d8c58f267ccae19
LoneFireBlossom
257 天前
@zmxnv123 #75 根本不是 kawa 用什么快捷键的问题……是 kawa 会通过「在切换到中文输入法时先切换到英文输入法再切换到中文输入法」来解决了这个 BUG
zmxnv123
256 天前
@LoneFireBlossom 不管怎么说,我看你那个链接知道了 option+control+space 这个快捷键,绑在 karabiner 上也能用,目前没啥问题。
imkerberos
5 天前
@devtiange 受你的推荐的软件启发,用 hammerspoon 和 limelight 实现了根据输入法状态变化 limelight 的颜色,现在真是舒服啊!

[收藏的 limelight 源代码]( https://github.com/imkerberos/limelight)
```lua
local hs = hs
hs.keycodes.inputSourceChanged(function ()
if hs.keycodes.currentSourceID() == "com.apple.keylayout.US"
or hs.keycodes.currentSourceID() == "com.apple.keylayout.ABC" then
print("==== change to US ====")
hs.execute("/nix/store/ahqry8gchidl4mpag5j7lzp8a0md7cq7-limelight-0.1.0/bin/limelight -m config active_color 0xFF7F9200")
else
print("==== change to CJK ====")
hs.execute("/nix/store/ahqry8gchidl4mpag5j7lzp8a0md7cq7-limelight-0.1.0/bin/limelight -m config active_color 0xFFFF2F92")
end
end)
```
imkerberos
4 天前

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

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

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

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

© 2021 V2EX