如何优雅地使用Vim(一):基本配置Vim十年,青春不再一转眼,Vim已经用了十年。从最初的抗拒和不理解,到后来的习惯和喜欢,再到近年来编辑器层出不穷的短暂尝试SublimeText等昙花一现的尝试,再到如今的回归,这是一个复杂的一个。过程。目前,我还处于配置和使用Vim的阶段,还没有为它开发任何插件。我希望在接下来的十年里,我能为它做出一些贡献。Vim是一个难学难用的编辑器,即使你再熟悉不过,它也会让你痛并快乐着。教别人使用Vim就更难了。从如何评价GitHub是否准备好推出下一代文本编辑器Xray?在这篇文章中,你可以看到时下很多编辑的尝试。软件业发展到今天,编辑器还远远没有达到完美的境界,包括Vim,这本身就是一个不可思议的东西。基本设置一些最基本的设置位于vimrc的开头。"先设置mapleader,然后随时使用键盘映射"基本上所有的自定义快捷键都以这个字符开头,比如映射`,w`到`:w`letmapleader=","letg:mapleader=",""与Vi不兼容,最大使用新特性setnocompatible"写文件时,不做备份setnobackupsetnowritebackup"Donotswapfilessetnoswapfile"快捷键nmapw:w!"保存一个文件去掉windows文件末尾的`^M`noremapm:%s///ge"重新打开文件时,恢复上次的光标position”很多设置可以通过View记住,比如高亮当前行,折叠行等,但是经常会混淆文件编码,设置时优先UTF-8fileencodings=utf-8,ucs-bom,gbk,gb2312,big5,latin1"不同平台,设置不同的行尾,即EOL"注:Mac平台,Unix也是首选;从OSX开始,行尾与Unix一致,"Allare`\n`而不是`\r`ifhas("win32")setfileformats=dos,unix,macelsesetfileformats=unix,mac,dosendif"时breakinglinesandmerging(join)lines,formulti-word段字符(如中文)的优化处理setformatoptions+=mM配色方案目前主要使用morhetz/gruvbox,本文所有截图均为gruvbox效果。配色方案可以通过插件安装,这里略过,后面会有一篇专门介绍插件。setbackground=darksyntaxenablecolorschemegruvboxauBufEnter*:syntaxsyncfromstartformatindentationoption"UseC-styleindentation,suitformostlanguages"详细调整见下文“你也可以试试smartindent和autoindentsetcindent”的`cinoptions`详细调整,主要是为了适应GoogleC++Style"t0:Functionreturntypedeclarationsarenotindicated"g0:C++"public:"等声明缩进一个字符"h1:C++"public:"等声明缩进一个字符"N-s:NoindentationinC++namespace"j1:ReasonableindentationofJavaorC++anonymousfunctions,应该也适用于JSsetcinoptions=t0,g1,h1,N-s,j1tabsvs.spacesmaketabssmarttab对于程序员来说,是否使用制表符或者空格就足以开战了,在美剧《硅谷》里,理查德因为接受不了带空格的缩进,和女朋友分手了。下面的设置就不优雅了,每个人的需求不一样,所以你需要做出相应的调整。”先设置默认,然后根据不同的文件类型重新设置一遍setexpandtab|设置制表位=4|setshiftwidth=4"Python、CSS等"对于C/C++等,制表符和缩进是两个空格auFileTypec,cpp,html,htmldjango,lua,javascript,nsis\setexpandtab|设置制表位=2|setshiftwidth=2"Makefile必须保持制表符,并且自定义上面的八个空格"但是现在谁写Makefile了?au文件类型设置noexpandtab|设置制表位=8|setshiftwidth=8textwidth除了缩进,另一个有争议的话题是80列的限制。虽然现在显示器大了很多,但一些语言仍然按照惯例遵循这个规则。通过设置textwidth,Vim可以帮助我们在用gq打字或者格式化的时候自动换行。我发现使用gq格式化评论特别方便,它会自动重新格式化很长的评论以保持在指定的长度内。目前,我只对C/C++/Python/Vim做这个限制。auFileTypec,cpp,python,vimsettextwidth=80一般如果设置了宽度限制,最好画一条竖线作为警告。只需设置颜色列。它甚至可以设置为多列,例如“81,101”。我为所有文件类型显示了这样一行。setcolorcolumn=81linebreak通常代码不需要换行,更不用说某些语言设置的宽度限制了。在实践中,纯文本、Markdown、XML等都需要换行,因为它们往往太长。auFileTypetext,markdown,html,xmlsetwrap"换行时,使用单词作为边界,避免切断单词setlinebreak"换行后的后续行使用与第一行相同的缩进setbreakindentUI"即使在终端,也试试启用鼠标ifhas("mouse")|setmouse=a|endif"显示正在输入的命令,对gqq/gcc等多字符命令特别有用setshowcmd"下面几个不解释,自己动手自己查看帮助setscrolloff=7setwildmenusetwildmode="list:longest"setruler"命令行高度为两行setcmdheight=2"始终显示行号"还有一个很酷的相对行号(`relativenumber`),虽然我用Notusedtosetnumbersetlazyredraw"Noneedneedtosavesethiddenwhenswitchingcache"inputmode,backspacekeycanreturnallcharacterssetbackspace=eol,start,indentsetwhichwrap+=<,>,h,l突出显示不需要的空格,例如行尾。“请参阅[http://vim.wikia.com/wiki/Highlight_unwanted_spaces]”-用红色突出显示尾随空格“-在插入模式下键入时不显示此突出显示”-当你打开新的时应用空格突出显示bufferhighlightExtraWhitespacectermbg=redguibg=redmatchExtraWhitespace/\s\+$/autocmdBufWinEnter*匹配ExtraWhitespace/\s\+$/autocmdInsertEnter*匹配ExtraWhitespace/\s\+\%#\@:nohlsearch替换时默认开启g标志,即同一行的所有匹配都会被替换。setgdefaultswitchwindow切换窗口键盘映射:mapjmapkmaphmapl直接使用方向键切换缓存的键盘映射:map:bnmap:bpmap:bfmap:blAbbreviation(缩写)当前日期、时间、文件名等.,用缩写词输入很方便。当然,缩写本身的名称也不能太常见。以下都是以x开头的,一般不会出现在正常文本中。iabbrevxname"到你自己的名字iabbrevxmail"到你的电子邮件iabbrevxfile=expand("%:t")ifexists("*strftime")iabbrevxdate=strftime("%Y-%m-%d")"当前日期iabbrevxtime=strftime("%H:%M:%S")"当前时间endif删除处的空格队伍的尽头。用户界面部分提到了如何突出显示行尾的空格。下面的设置可以删除行尾的空格。#该函数通过替换命令func!来删除行尾的空格!DeleteTrailingWS()exec"normalmz"%s/\s\+$//geexec"normal`z"endfunc"保存时自动删除行尾空格auBufWrite*:callDeleteTrailingWS()mapW:callDeleteTrailingWS()"Removespacesinlinescontainingonlyspaces(abitconvolved)"看来有了前面的功能,就不需要这个映射了:%s/\s*$//g:noh''尾声配置没完没了,好玩又累赘。这篇文章不是我的Vim配置的全部,而且我的Vim配置经常变化。另外,我主要是写C++和Python,不一定适合你。但道理是一样的,总是难免的。所以没有适合所有人的现成配置,都是在自己的基础上不断收集完善的其他为了避免文章太长,我们另起一篇常用插件介绍<全文完>