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

在 VIM 中如何提高中文编辑效率

  •  1
     
  •   Liler · 2021-02-24 22:12:54 +08:00 · 4552 次点击
    这是一个创建于 1127 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 VIM 中编辑中文时出现的问题:

    • 在 Insert 模式输入中文时,发现前面输入的有错误或者其他情况需要进入到 Normal 模式时,点击 ESC, 这时还是中文模式,需要切换输入法才能更好地移动鼠标。
    • 从 Normal 模式进入到 Insert 模式,还需要再次切换输入法才能继续输入中文。
    • 切换到 Cmdline 模式查找中文时,也需要切换输入法。

    编辑中文时需要经常切换输入法,影响编辑体验与效率,怎样才能提高在 VIM 中的中文编辑效率呢?

    我想到的方法是自动切换输入法。 从其他模式下进入到中文编辑情时设置不同的快捷键( linux,iBus,假设第一个输入法是英文,第二个是中文)。

     " Change input method automatically
     let englishInputMethod='gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval  "imports.ui.status.keyboard.getInputSourceManager().inputSources[0].activate()"'
     let chineseInputMethod='gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval  "imports.ui.status.keyboard.getInputSourceManager().inputSources[1].activate()"'
    
     let editStrings = ['i', 'I', 'a', 'A', 's', 'S', 'o', 'O', 'gi', 'gI', 'c', 'C', 'R', 'gR', 'r', 'gr']
     for str in editStrings
         exec 'noremap <silent> <Leader>' . str . ' ' . ':call system(chineseInputMethod)<CR>' . str
     endfor
     let searchStrings = ['/', '?']
     for str in searchStrings
         exec 'noremap <silent> <Leader>' . str . ' ' . ':call system(chineseInputMethod)<CR>' . str . '<Down>'
     endfor
     inoremap <silent> <Esc> <Esc>:call system(englishInputMethod)<CR>
    

    请问还有更好的方法吗? 在编辑中文时还会遇到什么问题,怎么解决的?

    第 1 条附言  ·  2021-02-25 12:18:46 +08:00

    我想到的3个解决方案:

    系统环境:Linux,gnome, ibus

    • 不用安装插件与设置快捷键,使用英文时按shift或者切换到英文输入法,需要形成习惯,不然经常会多按几个按键。

    • 为中文编辑设置不同的快捷键(从其他模式下进入到Insert模式)。 有少量中文需要编辑时(下面的插件也有不方便的地方),用这个设置快捷键的方法。

    
         " Change input method automatically
         let englishInputMethod='gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval  "imports.ui.status.keyboard.getInputSourceManager().inputSources[0].activate()"'
         let chineseInputMethod='gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval  "imports.ui.status.keyboard.getInputSourceManager().inputSources[1].activate()"'
    
         let editStrings = ['i', 'I', 'a', 'A', 's', 'S', 'o', 'O', 'gi', 'gI', 'c', 'C', 'R', 'gR', 'r', 'gr']
         for str in editStrings
             exec 'noremap <silent> <Leader>' . str . ' ' . ':call system(chineseInputMethod)<CR>' . str
         endfor
         let searchStrings = ['/', '?']
         for str in searchStrings
             exec 'noremap <silent> <Leader>' . str . ' ' . ':call system(chineseInputMethod)<CR>' . str . '<Down>'
         endfor
         inoremap <silent> <Esc> <Esc>:call system(englishInputMethod)<CR>
         " autocmd CmdlineLeave * call system(englishInputMethod)
         augroup inputmethod
             autocmd! inputmethod
             autocmd CmdlineLeave * call system(englishInputMethod)
         augroup END
    
    • 有大量中文编辑不想多按<Leader>按键时需要安装插件并且设置快捷键
         Plugin 'rlue/vim-barbaric'  " Automatic input method switching for vim
    
         let searchStrings = ['/', '?']
         for str in searchStrings
             exec 'noremap <silent> <Leader>' . str . ' ' . ':call system(chineseInputMethod)<CR>' . str . '<Down>'
         endfor
         " inoremap <silent> <Esc> <Esc>:call system(englishInputMethod)<CR>
    
         " autocmd CmdlineLeave * call system(englishInputMethod)
         augroup inputmethod
             autocmd! inputmethod
             autocmd CmdlineLeave * call system(englishInputMethod)
         augroup END
    
    第 2 条附言  ·  2021-02-26 23:28:54 +08:00

    发现快捷键有点问题,需要修改。

    注释掉下面这一行:

    inoremap <silent> <Esc> <Esc>:call system(englishInputMethod)<CR>
    

    修改这一行:

             autocmd CmdlineLeave  * call system(englishInputMethod)
    

             autocmd CmdlineLeave,InsertLeave * call system(englishInputMethod)
    
    36 条回复    2023-01-14 07:52:31 +08:00
    f165af34d4830eeb
        1
    f165af34d4830eeb  
       2021-02-24 22:19:41 +08:00   ❤️ 1
    这边建议换 vs code remote 。换 vsc remote 后,腰不酸了,腿也不疼了,腰椎间盘突出也好了!
    Liler
        2
    Liler  
    OP
       2021-02-24 22:36:17 +08:00
    @f165af34d4830eeb 提出问题不是太大,而且有了简单的解决方法了,并不影响继续使用 Vim 。

    对 Vim 比较熟悉了,没有必要换成 vs code,感觉建议。
    imkerberos
        3
    imkerberos  
       2021-02-24 22:43:49 +08:00
    Plug 'CodeFalling/fcitx-vim-osx'
    Liler
        4
    Liler  
    OP
       2021-02-24 22:46:08 +08:00   ❤️ 1
    一个开发工具而已,没有那么神奇吧,使用了就“腰不酸了,腿也不疼了,腰椎间盘突出也好了!”,夸张太多了。
    Liler
        5
    Liler  
    OP
       2021-02-24 22:54:15 +08:00
    @imkerberos 用的是 linux,这个工具好像只适用于 osx
    f165af34d4830eeb
        6
    f165af34d4830eeb  
       2021-02-24 22:56:42 +08:00
    @Liler 老梗啦。不过 vsc remote 感觉确实挺好用的,除了代码编辑功能,文件管理、git 集成、端口转发功能都挺实用的,适合我这种不太喜欢命令行但是又需要 linux 环境的人。
    jdhao
        7
    jdhao  
       2021-02-24 22:57:02 +08:00 via Android
    linux 也有 vim 插件可以控制输入法状态,离开插入模式直接切换到英文模式,自己找找
    newbieRenew
        8
    newbieRenew  
       2021-02-25 07:26:52 +08:00 via iPhone
    如果你熟练 86 五笔的话,可以用装个 VimIM 这个插件,提高切换效率。
    dongyx
        9
    dongyx  
       2021-02-25 08:19:55 +08:00 via iPhone
    中文编辑是我用 Vim 唯一的痛点,相关插件几年前用过,但各有各的问题。后来自己思想发生了转变,不用任何插件,尽量原生默认,方便迁移。导致一度因为中文编辑问题想换 Emacs 。现在我写中文文档乖乖 Typora, Pages 。写代码,配置文件才用 Vim 。
    lululau
        10
    lululau  
       2021-02-25 08:24:23 +08:00 via iPhone
    用英文先写好,然后用 Google 翻译一下
    itgoyo
        11
    itgoyo  
       2021-02-25 08:58:21 +08:00
    老王好像出过个教程,老王呢,老王过来解答一下
    hanxiV2EX
        12
    hanxiV2EX  
       2021-02-25 09:08:43 +08:00 via Android
    好像有个 vim 拼音输入法插件,不用使用系统输入法。
    wjh876531738
        13
    wjh876531738  
       2021-02-25 09:25:20 +08:00
    可以考虑下增加类似 Emacs 的前后左右,在 insert 模式下也能便捷移动。

    ```
    inoremap <C-f> <Right>
    inoremap <C-b> <Left>
    inoremap <C-a> <ESC>I
    inoremap <C-e> <ESC>A
    inoremap <C-d> <DEL>
    ```

    关于中文的问题,个人觉得倒是还好,习惯输入完中文之后都会按下 shift 重置会英文。
    tankb52
        14
    tankb52  
       2021-02-25 09:56:07 +08:00
    @newbieRenew
    VimIM 支持很多输入方案,不光是 86 五笔。
    zhuisui
        15
    zhuisui  
       2021-02-25 10:14:16 +08:00
    yuancoder
        16
    yuancoder  
       2021-02-25 10:38:41 +08:00
    无解,建议换个编辑器或者直接使用英文
    darksword21
        17
    darksword21  
       2021-02-25 10:58:51 +08:00   ❤️ 1
    可以换成 emacs 然后用 emacs-rime .... 🐕️
    jdhao
        18
    jdhao  
       2021-02-25 11:01:29 +08:00 via Android
    @dongyx https://github.com/ZSaberLv0/ZFVimIM
    这是新出来的一个用 vim 实现的输入法,也是一种方式,可以试试。
    lancelock
        19
    lancelock  
       2021-02-25 11:15:51 +08:00
    我的选择是,不输入中文

    说实话我现在输入完中文后会立刻下意识切换成英文,已经形成肌肉记忆了
    MaxTan
        20
    MaxTan  
       2021-02-25 11:17:54 +08:00
    输入法问题不大,vim 写中文最痛苦的还是 e b 这些跳光标的操作吧,没有中文分词,习惯性点下 e 就跳到行尾了
    knightdf
        21
    knightdf  
       2021-02-25 11:31:36 +08:00
    这不就是按一下 shift 的事么?
    namelosw
        22
    namelosw  
       2021-02-25 11:53:53 +08:00
    用集成 VIM 的 Emacs
    northisland
        23
    northisland  
       2021-02-25 11:55:17 +08:00
    厉害了
    Liler
        24
    Liler  
    OP
       2021-02-25 11:56:06 +08:00
    @knightdf 如果对写代码或者英文熟悉了,写中文时有的时候会忘记按 shift,这时会多按几个按键,除非形成习惯。
    以前我也是这么做的,但是感觉有点麻烦,想找个更好的方法
    northisland
        25
    northisland  
       2021-02-25 11:56:44 +08:00
    @darksword21 看起来很复古
    Liler
        26
    Liler  
    OP
       2021-02-25 12:03:02 +08:00
    @dongyx 原生的功能几乎可以满足编辑需求了,有些不能满足的可以写点脚本,虽然安装了一些插件,经常使用的就那么几个,还是少用插件好。

    中文编辑我还是用 vim,对它熟悉了,越用越熟练,效率就会越来越高
    Liler
        27
    Liler  
    OP
       2021-02-25 12:04:33 +08:00
    @wjh876531738 以前我就是这样做的,感觉繁琐,就想法找个更好的方案
    Liler
        28
    Liler  
    OP
       2021-02-25 12:07:12 +08:00
    @zhuisui 昨天试用了下,总体还好,就是查找中文时需要切换输入法,还有个问题,推出编辑模式后者进入到 shell,想切换到英文输入法,需要按两次切换按键
    mascteen
        29
    mascteen  
       2021-02-25 12:18:53 +08:00 via Android
    emacs evil
    ooops
        30
    ooops  
       2021-02-25 12:26:12 +08:00   ❤️ 1
    Rime 输入法的 asciimode 和 vimmode 就是解决这个问题的,不知道 Linux 上加了没,我当时只给 Squirrel 提了 PR
    taogen
        31
    taogen  
       2021-02-25 12:29:02 +08:00
    szzhiyang
        32
    szzhiyang  
       2021-02-25 13:18:29 +08:00 via iPhone
    换用 Power Keys 的「空格编辑」功能,早换早受益:

    https://PowerKeys.GitHub.io/space
    nightwitch
        33
    nightwitch  
       2021-02-25 13:31:54 +08:00
    https://github.com/lilydjwg/fcitx.vim
    回到 normal 模式的时候自动切英文,仅适用于 fctix
    dongyx
        34
    dongyx  
       2021-02-25 15:01:59 +08:00
    @Liler MacBook 用 Caps Lock 切换输入法之后我就基本能忍了。以前是外接显示器 + HHKB Pro 2,写中文就太难受了。
    hengstchon
        35
    hengstchon  
       2021-03-02 16:05:29 +08:00 via Android
    你需要的是 https://github.com/brglng/vim-im-select 这个 vim 插件,完美解决你的需求,在中文输入法状态下进 normal 模式自动切成英文,进 insert 模式又回中文。
    tensor1014
        36
    tensor1014  
       2023-01-14 07:52:31 +08:00
    https://github.com/VSCodeVim/Vim#input-method
    如果用 vscode 的话,可以直接哟能 vscode-vim 的配置
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3309 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 13:32 · PVG 21:32 · LAX 06:32 · JFK 09:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.