相信大家在Vim中输入中文的时候,一定有过很痛苦的经历:切换到命令模式时,需要切换到英文输入法,然后再插入模式,再次切换到中文,这两个切换让原本高效的Vim显得笨拙,这个麻烦让很多Vim初学者望而却步。现在,这个麻烦就不存在了,因为这里有一个方法可以让Vim在退出插入模式时自动切换到英文输入法,在返回插入模式时自动恢复到原来的输入法。Windows或MacOS都可以做到。现在,只要涉及文本编辑,我都用Vim。输入中文不再是麻烦,更是一种享受。下面是具体方法:Windows如果你用的是Windows,我假设你用的是gVim,因为Windows的cmd实在是太烂了,用Vim既不方便又不美观。Vim本身就有这方面的设置,可以查看帮助文档,在Vim命令模式下输入:helpiminsert可以查看详细信息。具体解决方法:在命令模式下输入:编辑$VIM/_vimrc,在代码末尾添加如下代码:ifhas('multi_byte_ime')"IME未启用时光标背景色hiCursorguifg=bgguibg=Orangegui=NONE"cursor启用IME时的背景颜色hiCursorIMguifg=NONEguibg=Skybluegui=NONE"关闭Vim的自动切换IME输入法(插入模式和搜索模式)setiminsert=0imsearch=0"不记录输入法在插入模式下的状态时,IME为closedbydefault"inoremap:setiminsert=0endif注意,在vim配置语法中,双引号后面的内容是注释,以上配置在我的windows电脑上有效。如果不行,也可以试试网上的方法【1】:ifhas('gui_running')setimactivatekey=C-spaceinoremap:setiminsert=2endifMacOSMacOS自带Vim,与gVim不同,Vim是需要借助smartim插件来实现的。Smartim依赖im-select程序,但安装smartim时会自动安装im-select。smartim插件依赖于Vim的autocmd机制,就是在进入命令模式时保存正在使用的输入法,然后切换到默认输入法,进入插入模式时再切换到之前的输入法:augroupsmartimautocmd!autocmdVi??mLeavePre*callSmartim_SelectDefault()autocmdInsertLeave*callSmartim_SelectDefault()autocmdInsertEnter*callSmartim_SelectSaved()augroupend具体安装步骤如下:1、首先安装Vim的插件管理器Vundle。不需要先安装Vundle,然后再手动安装smartim,但是不建议这样做,因为会把文件复制到指定目录,很麻烦,以后可能需要更多好用的插件。gitclonehttps://github.com/VundleVim/Vundle.vim.git~/.vim/bundle/Vundle.vim2,配置Vundle,添加smartim插件。打开Vim,在命令模式下输入:edit$MYVIMRC编辑~/.vimrc文件,在文件开头添加如下代码:setnocompatible"beiMproved,requiredfiletypeoff"required"settheruntimepathtoincludeVundleandinitializesetrtp+=~/.vim/bundle/Vundle.vimcallvundle#begin()"或者,passapathwhereVundleshouldinstallplugins"callvundle#begin('~/some/path/here')"letVundlemanageVundle,requiredPlugin'VundleVim/Vundle.vim'Plugin'ybian/smartim'"AllofyourPluginsmustbeaddedbeforethefollowinglinecallvundle#end()"requiredfiletypepluginindenton"required要忽略插件更改,而是使用:“filetypepluginon”“Briefhelp”:PluginList-listsconfiguredplugins“:PluginInstall-installsplugins;append`!`toupdate或只是:PluginUpdate“:PluginSearchfoo-searchesforfoo;append`!`torefreshlocalcache“:PluginClean-confirmsrevalofunusedplugins-val`rugins!append`toappend""see:hvundleformoredetailsorwikiforFAQ"把你的非插件的东西terthisline上面代码中已经添加了smartim插件:Plugin'ybian/smartim'保存退出Vim,然后重新打开,配置文件就会生效。此时在命令模式下输入:PluginInstall,等待smartim插件完成安装。安装完成后,你可以在插入模式下自由愉快地输入中文,然后一个ESC自动切换到英文输入法。如果它不起作用,请阅读下文。修改smartim命令模式的默认输入法。这一步我当时做不完,因为我的Mac英文输入法是com.apple.keylayout.ABC,手动切换成英文输入法,然后用im-select查看:?pwd/Users/aaron/。vim/bundle/smartim/plugin?./im-selectcom.apple.keylayout.ABC而smartim默认的命令模式输入法是com.apple.keylayout.US,所以需要在vimrc中指定smartim的默认输入法:letg:smartim_default='com.apple.keylayout.ABC'然后重试。修改smartim的延迟当你使用的时候,你会发现在按下ESC之后,短时间内输入法并没有切换到英文。这种卡顿让打字速度较快的键盘手无法忍受。解决方法是在smartim.vim文件中添加settimeoutlen=0?pwd/Users/aaron/.vim/bundle/smartim/plugin?lsim-selectsmartim.vim在smartim.vim文件末尾添加settimeoutlen=0:augroupsmartimautocmd!settimeoutlen=0autocmdVi??mLeavePre*callSmartim_SelectDefault()autocmdInsertLeave*callSmartim_SelectDefault()autocmdInsertEnter*callSmartim_SelectSaved()augroupend这个问题解决了。但是这样会造成一个小问题,就是自定义的快捷键会失效。比如你定义jj表示ESCimapjj,因为没有延迟,当你输入第二个j的时候,Vim不会把它当作组合。不过不需要jj也没关系。如果你纠结于此,可以在Smartim_SelectDefault()函数的第一行加上settimeoutlen=0,在Smartim_SelectSaved()函数的第一行加上settimeoutlen=500,但即便如此,还是会有500ms延迟。最后,本文分享Vim中文输入痛点的解决方案,可供个人测试,Linux可参考MacOS。这样,你就可以在Vim中自由输入中文了,是不是很棒?从此,用Vim编程和编写文档就成了一种享受。