Zi莱卷

此时的庸忙、诺诺慌张, 可否已成你的日常。

VIM 多语言输入

2020-09-17 21:55:52

最近我在刷 B 站的时候,无意中看到了 TheCW 发布的 Linux & Vim 相关的视频。 这个 Up 主虽然是一个刚刚高中毕业即将迈入大学的少年,但是他却已经具有多年的 Linux & Vim 使用经验。从他演示的视频中来看,他对 Linux & Vim 的熟练度,已经不亚于具有多年经验的专业程序员(比如我 😢)。我最近刚好也在看一些 Vim 相关的书籍,所以受他影响,我开始重新整理我的 Vim 环境。

在整理 Vim 配置的过程中我掉入了一个巨大的黑洞中,因为配置项和插件实在是太多了,有的插件还不能仅凭 README 就学会使用,还需要细细的翻阅相关文档才能了解到更详细的配置和用法。所以不知不觉我的时间就被吞噬掉了,经常一看就要花费很久的时间。为了控制自己的节奏和整理清楚 vim 相关插件的用法,我会写一些 vim 插件的介绍和使用指南。

对了,我现在使用的是 Neovim,我的 Vim 现在看起来是这样子的。

我的配置文件在放在我的 Github 中 https://github.com/iwfan/dotfiles

今天就从一个最烦人的多语言输入问题开始看起。我认为 Vim 之所以高效就是因为它「区分模式」和实现了 O(peration) + M(otion) 形式的「声明式编辑方法」。以删除圆括号中的内容为例,在 Vim 中只需要执行 dib ,它就帮我把圆括号中的内容删除了,我不需要知道它到底是如何删除的。而在像 VsCode 之类的编辑器中,你是需要知道如何删除的,因为你就是删除行为的执行者。「声明式」就是 Vim 之所以如此高效的原因。

而若你需要在输入模式中输入中文,你的操作可能是这样的,输入 a 进入输入模式,然后先切换输入法,输入完成之后,按 EscC-[ 退出。此时若你想在普通模式中输入指令,你将会看到输入法弹出的候选词。这时你发现你忘记切换输入法,然后将输入法调整为英文,继续输入指令。执行输入完成之后,又继续进入输入模式,切换输入法输入。这个过程持续三五次你就会无比痛苦, 这一点也不高效,反而让人疲惫不堪。

多语言输入确实是让众多 Vimer 最头疼的问题之一,然而有问题肯定就会有对应的解决方案。Github 上有一个项目叫做 im-select, 它提供了可以在命令行中切换输入法的功能。它目前支持 Macos 和 Windows,但在它的 Readme 中也提供了一些 linux 下切换输入法的方案,如果你是一个 Linux 用户,可以去看一看。

Vim 也有一些基于 im-select 实现的自动切换输入法的插件,例如 smartim 。如果你使用 coc.vim 的话, 它也有一个对应的插件叫做 coc-imselect。如果你还没听过 coc.vim 的话,你可以先去 Github 上简单的了解一下它。

coc-imelectcoc.vim 集成度更高一些,它可以做到智能帮你切换输入法。它有一个选项是 imselect.defaultInput, 如果它检测到退出输入模式时使用的输入法与配置的默认输入法不一致,会自动切换到默认输入法。

而且它还提供了一些更实用的功能。比如在状态栏显示当前使用的输入法, 这对全屏使用 Vim 的用户十分友好。

你也可以使用 imselect.enableStatusItem 来控制是否需要展示它。

另一个功能就是在你切换输入法的时候,可以使用浮动窗口展示当前使用的输入法,你也可以通过 imselect.enableFloating 来控制它。

自从有了自动输入法切换,你再也不需要在输入中文时去频繁的切换输入法了 ❤,这极大的提高了我在输入中文时的效率。但目前还有一个困扰我的问题就是如何做到在中文输入时可以选择输入不同语言的符号。比如有时候在中文输入法时我需要输入 [] 来插入链接,但有时候我又希望可以输入 【】「」。我使用的是 Macos 默认的输入法,我知道其他的输入法比如百度,可以让你在中文输入时使用英文符号。但是我想全都要,既可以选中文,也可以输英文。这个问题目前还没有一个很好的解决方案。

🔖Vim