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

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

  •  1
     
  •   Sylv · 176 天前 · 2412 次点击
    这是一个创建于 176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    输入法切换改键

    这套输入法切换方案我已经使用多年了,个人认为是 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. 启用全部或部分改键规则。

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

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

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

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

    PS: 右 Command 应该很好按啊,就在空格键旁边,大拇指一移就按到了,你用的不是 Mac 布局的键盘?
        17
    sethverlo   175 天前
    @Sylv 感谢,让我研究研究…
        18
    szzhiyang   175 天前   ♥ 1
    比 Power Keys 的空格编辑功能差了十万八千里:

    https://PowerKeys.GitHub.io
        19
    ooops   175 天前
    @Sylv #16 外接键盘,左边 command 还好,空格较长,右边的 command 感觉多隔了一个键。
    我遇到另外一个问题是我用清歌已经打出了部分字母,然后切换输入法字母没有上屏。这比较尴尬。。还在尝试中。
        20
    liumengdi   175 天前
    Command ⌘ → 不是把光标移到最右边的快捷键么? 改成切换输入法不会有冲突么
        21
    Sylv   174 天前
    @ooops 我用搜狗输入法,打中文的时候字母是会上屏的,然后这时切换输入法这些上屏的字母还是会保留。
        22
    Sylv   174 天前
    @liumengdi 😂
    “短按左 Command ⌘ → 切换到英文输入法”的意思是把单按 Command 键改键成切换英文输入法的快捷键,箭头是表示绑定什么功能的意思,不是指 Command 键 + 右方向键。
        23
    liumengdi   174 天前
    @Sylv 明白啦, 改成了你的配置, 很方便😁
        24
    tchekai704   170 天前   ♥ 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"
    ]
    }
    ],
        25
    tchekai704   170 天前   ♥ 1
    另外 hyper key 的思路与我不谋而合,我是用 alfred 来设置的,同时我的 hyper key 不是 tab,而是 option。
    理由是 macOS 下的“ option+字母”是输入一些不常用的符号,所以没有任何程序对这个快捷键进行了绑定,不存在任何冲突。
        26
    jijifujiji   25 天前
    楼主我想问下 macbook 在系统里面设置快捷键的时候 是怎么把那个设置为 F18 的呀
    我这边只有能按出的键位或者组合键才可以设置
        27
    Sylv   25 天前 via iPhone
    @jijifujiji 先用 Karabiner 绑定某个键 /组合键为 F18,然后用绑定的键 /组合键在设置快捷键时按下就可以设置成 F18 了。
        28
    jijifujiji   20 天前
    @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"
    }
    ]
    }
        29
    Sylv   20 天前
    @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"
    }
    ]
    }
        30
    jijifujiji   20 天前
    @jijifujiji
    卧槽,楼主碉堡了!!
        31
    jijifujiji   20 天前
    @Sylv
    好用的一批
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2609 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 30ms · UTC 14:17 · PVG 22:17 · LAX 06:17 · JFK 09:17
    ♥ Do have faith in what you're doing.