Mac vim 中文切换终极解决方案

591 阅读3分钟

Hi!现在是2024-11-05 我有了更简单的方法,只需安装 MacVimSwitch ,就可以实现

  • 按 ESC 键时自动切换到 ABC 英文输入法
  • 内置 Shift 键切换 ABC 英文输入法和中文输入法
    • 重要提示:使用前请先关闭输入法中的"使用 Shift 切换中英文"选项
    • 如需关闭可在状态栏菜单中设置
    • 温馨提示:如果你不想使用 Shift 键切换输入法,在 Mac 上,CapsLock 短按可以切换输入法,长按才是锁定大写

感谢 AI 编程技术的进步,这个仓库没有一行代码是我自己写的哈哈哈(都是 Cursor 生成的),尽管生成的时候 bug 很多,调试了好多次orz..

软件截图

26621732330717_.pic.jpg

历史内容(使用 karabiner 修改快捷键)

Mac 的 vim 中文切换问题折磨了我好几年,尝试过很多种方案但都不太好使,现在终于找到一个完美的解决方案,

  • 适用于任何输入法
  • 适用于任何 APP (终端 / vscode / obsidian)

实现方法

简单来说,利用 karabiner 软件修改按键

  1. 每次按 shift 的时候切换到系统自带的 ABC 英文输入法(而不使用第三方输入法的英文状态),再按一次则切换到中文输入法(可以是搜狗/讯飞/微信输入法等)
  2. 每次按 Esc 键的时候自动切换到 ABC 英文输入法 (也可以改 Esc 为你习惯的vim 退出编辑按键)

具体步骤

  1. 下载安装 karabiner karabiner-elements.pqrs.org/

它有点类似 window 的 auto hot key 软件,用于修改按键映射

安装后记得按软件的提示做好配置,需要系统权限什么的

  1. 在系统设置中添加一个不存在的 F18 快捷键(临时使用,后面这个映射请删掉)

  1. 设置 F18 和 option + F18 来控制切换上一次使用的输入法,第4步会用到

系统设置-键盘-键盘快捷键-输入法里,将输入法切换的快捷键设置为 F18

这里的 F18 就用第2步临时设置的按键来输入的(因为Mac系统不能用输入键位名称的方式来改变,只能曲线救国)。设置好后,第2步的按键映射可以删掉了。

  1. 在 karabiner 中的 Complex Modifications 的 Add your own rule 中添加如下规则

有个性化需求的话,规则自己可以看着修改一下,很好懂的

(1)短按 ESC -> ESC 并切换英文输入法

{
    "description": "短按 ESC -> ESC 并切换英文输入法",
    "manipulators": [
        {
            "conditions": [
                {
                    "input_sources": [
                        {
                            "language": "en"
                        }
                    ],
                    "type": "input_source_unless"
                }
            ],
            "from": {
                "key_code": "escape"
            },
            "to": [
                {
                    "key_code": "escape",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "escape"
                },
                {
                    "key_code": "f18"
                }
            ],
            "to_if_held_down": [
                {
                    "key_code": "escape"
                }
            ],
            "type": "basic"
        },
        {
            "conditions": [
                {
                    "input_sources": [
                        {
                            "language": "en"
                        }
                    ],
                    "type": "input_source_if"
                }
            ],
            "from": {
                "key_code": "escape"
            },
            "to": [
                {
                    "key_code": "escape",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "escape"
                }
            ],
            "to_if_held_down": [
                {
                    "key_code": "escape"
                }
            ],
            "type": "basic"
        }
    ]
} 

(2)短按 ESC -> ESC 并切换英文输入法

{
    "description": "短按 ESC -> ESC 并切换英文输入法",
    "manipulators": [
        {
            "conditions": [
                {
                    "input_sources": [
                        {
                            "language": "en"
                        }
                    ],
                    "type": "input_source_unless"
                }
            ],
            "from": {
                "key_code": "escape"
            },
            "to": [
                {
                    "key_code": "escape",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "escape"
                },
                {
                    "key_code": "f18"
                }
            ],
            "to_if_held_down": [
                {
                    "key_code": "escape"
                }
            ],
            "type": "basic"
        },
        {
            "conditions": [
                {
                    "input_sources": [
                        {
                            "language": "en"
                        }
                    ],
                    "type": "input_source_if"
                }
            ],
            "from": {
                "key_code": "escape"
            },
            "to": [
                {
                    "key_code": "escape",
                    "lazy": true
                }
            ],
            "to_if_alone": [
                {
                    "key_code": "escape"
                }
            ],
            "to_if_held_down": [
                {
                    "key_code": "escape"
                }
            ],
            "type": "basic"
        }
    ]
}
  1. 大功告成!

需要注意的点是,这里其实使用的是切换到上一次使用的输入法,所以如果你有3个及以上的输入法,切换的时候需要注意一下,手动点击一次英文 ABC 输入法就行。

现在,你就可以在任何应用中,使用 Esc 切换到英文输入法啦(如果只想限制在特定 APP 中生效,或者

参考文章

www.v2ex.com/t/974601