V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
牛客网
Sylv
V2EX  ›  macOS

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

  •  4
     
  •   Sylv · 2019-05-20 09:03:53 +08:00 · 5832 次点击
    这是一个创建于 523 天前的主题,其中的信息可能已经有所发展或是发生改变。

    输入法切换改键

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

    实现的效果

    • 短按左 Command ⌘ → 切换到英文输入法
    • 短按右 Command ⌘ → 切换到中文输入法
    • 短按左右 Shift ⇧ → 切换输入法
    • 左右 Command ⌘ + 空格 ␣ → 切换输入法

    长按或者组合键按左右 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 ⇪:

      • 短按 → Esc ⎋
      • 长按或者组合键 → Control ⌃
    • 左 Control ⌃:

      • 短按 → CapsLock ⇪
      • 长按或者组合键 → Super Key (⌃⌥⌘)
    • Tab ⇥:

      • 短按 → Tab ⇥
      • 长按或者组合键 → Hyper Key (⇧⌃⌥⌘)

    为什么这样改键

    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 屏,所以经常需要对窗口进行排列整理),例如:

    • Super Key + N → 居中窗口
    • Super Key + M → 最大化窗口
    • Super Key + D → 显示桌面
    • Super Key + J / K → 左 ½ 分屏 / 右 ½ 分屏
    • Super Key + U / I / O → 左 ⅓ 分屏 / 中 ⅓ 分屏 / 右 ⅓ 分屏
    • Super Key + ▲ → Mission Control
    • Super Key + ▼ → 应用程序窗口( Application Windows )
    • Super Key + ◀ / ▶ → 把窗口移动到左 / 右显示屏
    • Super Key + 1 / 2 / 3 ... → 程序窗口切换到固定排列布局 1 / 2 / 3 ...(用 Moom 实现,例如固定布局 Safari 在中间、Finder 在左边、编辑器在右边)

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

    • Hyper Key + ; → 显示 / 隐藏 Safari
    • Hyper Key + F → 显示 / 隐藏 Finder
    • Hyper Key + I → 显示 / 隐藏 iTunes
    • Hyper Key + S → 显示 / 隐藏 Sublime Text
    • Hyper Key + T → 显示 / 隐藏 iTerm
    • Hyper Key + ' → 显示 / 隐藏 Dash
    • Hyper Key + \ → 显示 / 隐藏 1Password
    • Hyper Key + O → 显示 / 隐藏欧路词典
    • Hyper Key + P → 显示 PopClip
    • Hyper Key + E → 显示 Emoji 选择窗口 😄
    • Hyper Key + G → Google 搜索选中文字
    • Hyper Key + B → 百度搜索选中文字
    • Hyper Key + M → 豆瓣电影搜索选中文字
    • Hyper Key + Y → 欧路词典翻译选中文字

    使用方法

    1. 点此导入 Karabiner-Elements 配置

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

    50 条回复    2020-10-18 23:59:54 +08:00
    Sylv
        1
    Sylv   2019-05-20 09:05:46 +08:00   ❤️ 2
    tinybaby365
        2
    tinybaby365   2019-05-20 09:22:40 +08:00
    太复杂了。只用 Emacs key bindings [control+keys]
    Rsl
        3
    Rsl   2019-05-20 09:43:26 +08:00
    我是 caps lock 切换输入法. 专门设置两个键分别切换中英这个思路不错, 我也去弄一下.
    mistkafka
        4
    mistkafka   2019-05-20 09:46:59 +08:00 via iPhone
    10.14.6 挂了 真是烦人
    devtiange
        5
    devtiange   2019-05-20 09:57:26 +08:00   ❤️ 2
    右 shift 平时不怎么用, 用来切换输入法就好了.
    楼主搞那么多钟切换方式, 自己不会乱吗?

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

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

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

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

    https://PowerKeys.GitHub.io
    ooops
        19
    ooops   2019-05-21 10:52:12 +08:00
    @Sylv #16 外接键盘,左边 command 还好,空格较长,右边的 command 感觉多隔了一个键。
    我遇到另外一个问题是我用清歌已经打出了部分字母,然后切换输入法字母没有上屏。这比较尴尬。。还在尝试中。
    liumengdi
        20
    liumengdi   2019-05-21 19:04:24 +08:00
    Command ⌘ → 不是把光标移到最右边的快捷键么? 改成切换输入法不会有冲突么
    Sylv
        21
    Sylv   2019-05-22 07:25:44 +08:00
    @ooops 我用搜狗输入法,打中文的时候字母是会上屏的,然后这时切换输入法这些上屏的字母还是会保留。
    Sylv
        22
    Sylv   2019-05-22 07:30:25 +08:00
    @liumengdi 😂
    “短按左 Command ⌘ → 切换到英文输入法”的意思是把单按 Command 键改键成切换英文输入法的快捷键,箭头是表示绑定什么功能的意思,不是指 Command 键 + 右方向键。
    liumengdi
        23
    liumengdi   2019-05-22 09:45:00 +08:00
    @Sylv 明白啦, 改成了你的配置, 很方便😁
    tchekai704
        24
    tchekai704   2019-05-25 22:58:34 +08:00   ❤️ 1
    楼主思路不错,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
        25
    tchekai704   2019-05-25 23:01:01 +08:00   ❤️ 1
    另外 hyper key 的思路与我不谋而合,我是用 alfred 来设置的,同时我的 hyper key 不是 tab,而是 option。
    理由是 macOS 下的“ option+字母”是输入一些不常用的符号,所以没有任何程序对这个快捷键进行了绑定,不存在任何冲突。
    jijifujiji
        26
    jijifujiji   2019-10-18 18:03:19 +08:00
    楼主我想问下 macbook 在系统里面设置快捷键的时候 是怎么把那个设置为 F18 的呀
    我这边只有能按出的键位或者组合键才可以设置
    Sylv
        27
    Sylv   2019-10-18 18:19:59 +08:00 via iPhone
    @jijifujiji 先用 Karabiner 绑定某个键 /组合键为 F18,然后用绑定的键 /组合键在设置快捷键时按下就可以设置成 F18 了。
    jijifujiji
        28
    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
        29
    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
        30
    jijifujiji   2019-10-23 10:50:12 +08:00
    @jijifujiji
    卧槽,楼主碉堡了!!
    jijifujiji
        31
    jijifujiji   2019-10-23 10:50:40 +08:00
    @Sylv
    好用的一批
    Vendettar
        32
    Vendettar   258 天前
    真的🐂🍺
    dofine
        33
    dofine   251 天前
    > 所以就可以用来定义一些新的快捷键(我主要是用 BetterTouchTool 来设置这些快捷键,Karabiner-Elements 虽然也可以通过写配置文件来实现,但是 BetterTouchTool 有界面可以直接设置会更方便点)

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

    https://pqrs.org/osx/karabiner/document.html
    ruooooooli
        35
    ruooooooli   244 天前
    把窗口移动到左 / 右显示屏

    楼主这个是怎么实现的呢
    Sylv
        36
    Sylv   243 天前   ❤️ 1
    @ruooooooli 这个我是用 Moom ( https://manytricks.com/moom/) 实现的,有个 Move to Other Display 的功能可以绑定快捷键。
    ruooooooli
        37
    ruooooooli   243 天前
    @Sylv 感谢
    ruooooooli
        38
    ruooooooli   243 天前
    @Sylv 试了一下 moom 和我想要的还是不太一样,可能是我没有表达清楚,我其实想要的是向 Ubuntu 一样,把一个窗口移动到另一个桌面 space 🤣
    Sylv
        39
    Sylv   242 天前
    @ruooooooli 看了下貌似 Moom 和 BetterTouchTool 都没有把窗口移到另一个 Space 的功能。
    ruooooooli
        40
    ruooooooli   242 天前
    @Sylv 我也发现了,他们都是移动窗口到另一个屏幕上。我目前找到了 sizeup 可以实现这个功能。
    Steven55k
        41
    Steven55k   238 天前 via iPhone
    楼主好,我这边点此导入一直显示 failed to connect the serve,下午尝试自己实现了一部分,核心的输入法部分实在没找到解决方案,希望方便的话能单发一下 json 给我!
    Sylv
        42
    Sylv   237 天前 via iPhone
    Steven55k
        43
    Steven55k   236 天前
    @Sylv 谢啦!~很完美。你关于 Tab 和 Capslock 的理念也很棒,很顺手
    litianqi1995
        44
    litianqi1995   228 天前
    感谢楼主,推荐 Karabiner 另一个功能 喜欢把外置键盘放到内置键盘上的人 放的不好老会误触,禁用系统键盘了。Karabiner 而且断开置键盘 直接会恢复到自带键盘 非常好用
    dj2rap
        45
    dj2rap   225 天前
    楼主,有没有切换隐藏程序的脚本,上面那个挂了
    Sylv
        46
    Sylv   225 天前
    @dj2rap 切换程序隐藏是用 BetterTouchTool 来设置的。
    ruooooooli
        47
    ruooooooli   204 天前
    加上 Hyper Key 之后,发现 Tab 用起来好不顺手哈哈哈
    helsinglee
        48
    helsinglee   14 天前
    @Sylv 新版有点兼容性问题!大写切换无法输入
    Sylv
        49
    Sylv   13 天前
    @helsinglee 你是什么版本?我是 macOS Catalina 10.15.5 + Karabiner-Elements 13.0.0,目前还是正常工作。
    helsinglee
        50
    helsinglee   5 天前
    @Sylv macOS Catalina 10.15.6 + Karabiner-Elements 13.0.0 工作不正常。退回 12.10 ,目前正常使用。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2428 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:39 · PVG 23:39 · LAX 08:39 · JFK 11:39
    ♥ Do have faith in what you're doing.