在 macOS 中,因为无法删除默认的 ABC 输入法,因此每个使用 macOS 的中文用户至少有两个或以上输入法。自然,随之而来的问题便是如何更高效的切换输入法,所以我们的目标便是在不使用组合键的情况下切换到指定输入法。另外需要说明的是,使用 Caps Lock 键切换不在本文的探讨之内。

使用系统方法

在此之前,先了解系统默认的切换输入法方式,在系统偏好设置 -> 键盘 -> 快捷键中有个输入法的选项,里面提供了两种切换的方式,第一种是选择上一个输入法,按下快捷键 ⌃空格键后在两个输入法之间来回切换,另外长按时会弹出输入法列表。

另外一种为 选择"输入法"菜单中的下一个输入法,按下快捷键 ⌃⌥空格键时,会在已添加的输入法列表中向下一个输入法切换。

当然,上面提供的两个快捷键都是可以自定义更改的。

使用 Karabiner-Elements

设定按键为 F16

既然系统提供的输入法快捷键可以修改,那么我们只需要把快捷键修改成单个按键就可以实现短按切换输入法,只是问题在于这个操作会覆盖原按键功能。因此我们需要一个键盘上并不存在的按键来完成这个任务,Karabiner 刚好可以做到这点,而这也是以前最常用的方法:

{
    "description": "Switch f16 if shift is pressed alone",
    "manipulators": [
        {
            "from": {
                "key_code": "left_shift"
            },
            "to": [
                {
                    "key_code": "left_shift",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "f16"
                }
            ],
            "type": "basic"
        }
    ]
}

上面的代码功能会改变短按 Shift 键时为 F16,但同其它按键一起按下时,仍然保持 Shift。设置完成后便可在系统偏好设置中,把切换输入法的快捷键改为 F16 。

调用系统快捷键

上面的方法虽然可以使用,但有多此一举之感,既然可以把按键改为 F16,那直接调用快捷键岂不是更方便:

{
    "description": "Switch previous input source if shift is pressed alone",
    "manipulators": [
        {
            "from": {
                "key_code": "left_shift"
            },
            "to": [
                {
                    "key_code": "left_shift",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "spacebar",
                    "modifiers": [
                        "left_control"
                    ]
                }
            ],
            "type": "basic"
        }
    ]
}

Update: 06-06

修复了单独按住 Shift 键时没有 Shift 的问题,可查看最新链接查看,不过为了便于阅读,上面代码暂不做更改。

这个应该是当前最完美的双输入法切换解决方案,也是目前正在使用的规则之一,可以点~~配置~~直接安装。

当然,以上两种方法的触发键同样可以更改为你喜欢的任意按键。

多输入法切换

以上的两个方法可以完美解决两个输入法之间的切换问题,因为本质上都是借用系统的切换方法,但如果有两个以上输入法,便无能为力了。好在 Karabiner 还提供了其它方法:

{
    "description": "Change shift to switch input sources if pressed alone (Chinese, English and Japanese)",
    "manipulators": [
        {
            "conditions": [
                {
                    "input_sources": [
                        {
                            "language": "en"
                        }
                    ],
                    "type": "input_source_if"
                }
            ],
            "from": {
                "key_code": "left_shift"
            },
            "to": [
                {
                    "key_code": "left_shift",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "select_input_source": {
                        "language": "zh-Hans"
                    }
                }
            ],
            "type": "basic"
        },
        {
            "conditions": [
                {
                    "input_sources": [
                        {
                            "language": "en"
                        }
                    ],
                    "type": "input_source_unless"
                }
            ],
            "from": {
                "key_code": "left_shift"
            },
            "to": [
                {
                    "key_code": "left_shift",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "select_input_source": {
                        "language": "en"
                    }
                }
            ],
            "type": "basic"
        },
        {
            "conditions": [
                {
                    "input_sources": [
                        {
                            "language": "ja"
                        }
                    ],
                    "type": "input_source_unless"
                }
            ],
            "from": {
                "key_code": "right_shift"
            },
            "to": [
                {
                    "key_code": "right_shift",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "select_input_source": {
                        "language": "ja"
                    }
                }
            ],
            "type": "basic"
        }
    ]
}

这个方法可以在中、日、英三种输入法之间切换,不过有一个问题会影响日常使用,偶尔会出现已成功切换到中文输入法,但输入时仍然为英文的情况。此问题为系统 Bug,在 Hammerspoon 中同样也会出现,目前貌似无解,有需求的童鞋可以试试 Kawa 输入法切换器。

信息

版本

  • macOS Mojave:10.14.4
  • Karabiner-Elements:12.4.0

参考