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

一套适合 vim 和 macOS 用户的输入法切换方案

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

    需求

    日常工作中经常使用 neovim 码代码和写文档,有时也在别的编辑器上使用 vim 插件,如果没有特殊设置,vim 模式会和中文输入法“打架”

    因此我需要实现下面的特殊功能:

    1. caps 键替换成 esc ,方便切换回 normal 模式
    2. 按下 esc 键后,输入法切换成英文,方便之后敲指令
    3. shift 键切换中英文输入
    4. 切换到不同应用自动切换中英文输入

    有了这些功能可以大幅的提升 vim 的输入体验

    尝试使用鼠须管(最后放弃)

    鼠须管自带的功能能满足后 3 点的需求,对于第 1 点需求可以在 macOS 的设置中实现。刚开始的时候感觉很完美,但在实际的使用过程中发现,鼠须管没有长句联想能力,很影响输入效率(即使使用了几个月还是不能适应),鼠须管的 shift 切换在一些情况下也有 bug ,对我来说是高频触发。因此在我发现另一种方法后,就放弃了使用鼠须管。

    使用 Karabiner

    无意中在 V2EX 上搜到这篇 帖子,根据帖子的配置,我用 Karabiner 实现了以上的需求。

    前提条件

    • 使用系统自带的 ABC 输入法来输入英文,而不使用第三方输入法的英文状态
    • 再选择一个输入法来输入中文,目前我选择的是微信输入法

    只设置以上两种输入法,因为不使用第三方输入法的英文状态,所以我们需要关闭第三方输入法的 shift 切换功能,确保不会切换过去。shift 在之后会被 Karabiner 用来控制 ABC 输入法和第三方输入法之间的切换(即中英文切换)

    使用方法

    1. 对于上面的第一点需求,在 Karabiner 的 Simple Modifications 设置 caps 映射为 esc 即可
    2. 对于第 2 、3 点需求,可以导入这个放在 GitHub 上的 Complex Modifications 配置
      它的实现原理是:当单击 esc 键后,如果当前不是英文输入法,会模拟单击一次 F18 键;当单击 shift 键后,会模拟单击一次 F18 键。因此,我们只需在 系统设置-键盘-键盘快捷键-输入法 里,将输入法切换的快捷键设置为 F18 就能实现单击 esc 或 shift 进行切换。
    3. 对于第 4 点需求,可以在 App Store 上搜索“自动切换输入法”,这个软件的付费版挺好用的(可能也有别的替代)
    10 条回复    2024-04-14 11:40:49 +08:00
    gpt5
        1
    gpt5  
       223 天前
    用系统快捷键切换输入法,不知道你是摸索过后选了这种方法,还是无意中选对了。
    karabiner 有命令可以直达某种输入法( 2 种以上语言切换时很方便),但是这种方法对中文输入法有 bug ,时常是图标边成中文了,但实际上输入法没变。我当时琢磨了好久,才想到判断当前语言然后模拟系统快捷键来切换😂
    LinYaXuan
        2
    LinYaXuan  
       223 天前 via iPhone
    推荐一下这个配置方案 https://github.com/Vonng/Capslock
    lanlanye
        3
    lanlanye  
       223 天前
    https://github.com/ybian/smartim 这个插件就可以解决吧,normal 模式使用英文,insert 模式切换回之前的输入法
    EyebrowsWhite
        4
    EyebrowsWhite  
       223 天前 via iPhone
    im-select
    kxccc
        5
    kxccc  
    OP
       223 天前
    vim 的插件也尝试过,但不能支持其他编辑器上的 vim 模式(比如 xcode )。用 shift 切换输入法也还得用 Karabiner 来实现,干脆就用 Karabiner 了。
    imkerberos
        6
    imkerberos  
       222 天前
    最根本的办法是抄 emacs-rime 的方案, 写一个 vim 的 rime 客户端.
    zwyyy456
        7
    zwyyy456  
       222 天前
    @kxccc 建议把 capslock 设置成 ctrl ,然后用 ctrl + [ 来执行 esc
    YYYMagic
        8
    YYYMagic  
       63 天前
    如果我输入法里面还有一个日语输入法,每次 f18 切换的下一个输入法都是日语,楼主有好办法吗
    YYYMagic
        9
    YYYMagic  
       63 天前
    @YYYMagic 找到办法了,按 ESC 的时候不改为按下输入法切换键,而是直接改为设置输入法为英文,json 配置在这里:
    https://gist.github.com/binc4t/c698b1a6933071e9c07f7fecad12e573
    d3George
        10
    d3George  
       13 天前
    @zwyyy456 insert 模式下 把 jj 映射成 esc 是比较普遍的方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1102 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:15 · PVG 02:15 · LAX 11:15 · JFK 14:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.