聊vim之前,我得先跟你交个底。很多人第一次打开vim,第一反应是"这玩意儿怎么退出去",第二反应是"我为什么要想不开来用这个"。但只要你熬过最开始的那段磨合期,vim会变成你手里最锋利的一把刀——在服务器上改配置、在终端里快速编辑、处理一个几百MB的大日志文件,别的编辑器要么打不开,要么卡成PPT,vim照样行云流水。这篇内容我尽量用聊天的方式,把vim里里外外给你聊明白,不管你是刚摸Linux的小白,还是已经写了两年代码但一直跟vim互相看不顺眼的同学,看完都能直接上手。
1. 先把认知捋清楚:vim到底是干什么的
1.1 先聊个常被搞混的问题:编译器和编辑器到底有啥区别
搜索引擎里经常有人搜"编译器和编辑器的区别",这问题看着基础,但真要能一句话说清楚的人不多。我这样给你讲:编辑器是你写字用的本子,编译器是替你批改作业的老师。你在vim里敲代码、改配置文件,vim只负责把你的文字存进文件里,它不关心你写的是Python还是Shell脚本。等你把文件保存好,再去运行python或者gcc,那才是编译器在干活。所以vim永远替代不了编译器,编译器——比如gcc、python解释器——也替代不了你改代码的工作。
这个区别搞清楚了,你就明白一件事:用vim写代码的时候,不要指望它像IDE那样给你弹各种智能提示、自动补全、语法报错。vim的定位是"极致高效的文本编辑工具",它更偏底层,更像一把手术刀。你拿手术刀跟人家集成灶比煎牛排,那肯定比不过,但你要的是精准切开那一下,手术刀无敌。当然了,vim配合插件之后也能做得像IDE一样智能,这是后话,后面专门聊。
1.2 vim的设计哲学:为什么它"反人类"却还活着
vim的设计哲学总结起来就四个字:双手不离键盘。它的前身是vi,诞生于1976年,那个年代没有鼠标,图形界面更是没影的事。所有操作都得靠键盘完成,所以vi的设计者想出了一个特别巧妙的办法:把键盘分成两个区,一部分按键负责移动光标,一部分按键负责编辑文本,用不同的模式来区分。
这套设计放在今天看,很多人觉得"反人类":怎么我打开文件不能直接打字?按个i才能输入,按完还得按Esc切回去?但恰恰是这套模式化设计,让vim在四十多年后的今天依然活跃在每一个Linux服务器上。原因很简单:当你把手指放在键盘基准键位上,不需要离开键盘去找鼠标,你的编辑速度会有一个质变。你可以想想自己打字的时候频繁摸鼠标、点来点去的开销,日积月累是非常惊人的。
还有另一个现实原因:Linux服务器默认就装了vi或者vim,你远程登录服务器改配置、处理故障,图形界面编辑器根本用不了。也就是说,vim是Linux环境下的"通用语言",不管什么发行版,不管有没有图形桌面,vim一定在。你不学它,就没法在纯命令行环境下高效干活。
2. 三模式是vim的命门:先把地基打牢
2.1 普通模式、插入模式、命令行模式:各管各的事
vim最核心的概念就是"模式"。很多人第一次接触vim,死记了一堆命令却还是用不好,根本原因就是没理解模式的本质。我把三个模式给你讲透,你就全通了。
普通模式(Normal Mode):这是vim的默认模式,也是你打开文件后进入的模式。在这个模式里,你按下的每个键都不是往文档里输入字符,而是一个个"命令"。比如按j是光标下移一行,按w是跳到下一个单词开头,按dd是删除当前行。这个模式的设计意图是:让你先移动到位,再下达编辑指令,实现"编辑"和"移动"分家。
插入模式(Insert Mode):这才是真正往文档里打字的地方。在普通模式下按i就进入插入模式,屏幕左下角会出现-- INSERT --的提示。你可以随意输入字符、删除、回车,跟普通编辑器一样。插入模式下按Esc就回到普通模式。
命令行模式(Command-Line Mode):在普通模式下按:(冒号)进入,左下角会有一个冒号等待你输入命令。保存退出、查找替换、设置行号,都靠它。比如:wq就是保存并退出,:set nu就是显示行号,:%s/foo/bar/g就是全局替换。
这三个模式切换的路线,我画个文字版给你:普通模式按i进插入模式,插入模式按Esc回普通模式,普通模式按:进命令行模式,命令行模式按Esc或命令执行完自动回普通模式。就这么简单,你把这个切换练成肌肉记忆,vim就学会一半了。
2.2 新手必踩的坑:为什么你按了半天方向键没反应
我见过太多新手在vim里吃亏,最典型的就是:打开vim之后想移动光标,习惯性地按键盘上的方向键,结果发现光标没动,但屏幕上冒出一堆字母——因为方向键在某些终端里会被解析成A、B、C、D这样的字符,直接插入到文档里了。遇到这种情况别慌,按Esc先回普通模式,把那几个多余的字符删掉就行。
要真正提高效率,我建议你早点抛弃方向键,改用vim原生的移动键:h左移、j下移、k上移、l右移。这四个键就在你右手基准键位上,手不用离开键盘就能上下左右。刚开始肯定不习惯,但用熟了你会发现,手完全不用离开键盘核心区,打字和移动无缝衔接,效率直接起飞。我可以负责任地告诉你,我用了大概一周就彻底戒掉了方向键,现在反而觉得方向键离手太远,影响节奏。
还有一个很多人会踩的坑:在插入模式下用退格键删字符,感觉没什么问题,但一旦按了Esc回到普通模式,想删除某个字符却不知道按什么键。记住,普通模式下删除当前字符按x,删除当前行按dd,撤销按u,这三个是基础中的基础。
2.3 一个关键认知:vim的命令是"组合词",不是孤立按键
学vim最忌讳死记硬背。你背了50个命令,每个都是孤立的,没用,因为记不住,也用不活。vim真正的威力在于它的命令可以像搭积木一样组合。
举个例子,d在vim里是"删除"的动词,w是"一个单词"的名词,2是数量。把它们组合起来:d2w就表示"删除两个单词"。c是"修改"动词,$是"行尾",c$就表示"从光标处修改到行尾"。y是"复制"动词,y加上y就是yy,复制当前行。
这种"动词+名词+数字"的组合逻辑,才是vim的灵魂。你不需要背"d2w是删除两个单词"这一条命令,你只需要理解d是啥、w是啥、数字是啥,然后随便组合。这也是为什么vim看起来命令很多,实质上规则很少的原因。把这个逻辑想通了,你就从"背命令"进阶到了"造命令"。
3. 高频命令实操手册:照着敲就行
3.1 移动与定位:光标指哪打哪
移动是vim里最常用的操作,我把高频的移动命令整理一份清单,你照着练就行:
hjkl:左、下、上、右移动光标w/b:跳到下一个/上一个单词的开头e:跳到当前单词的结尾0:跳到当前行行首(第0列)$:跳到当前行行尾^:跳到当前行第一个非空白字符gg:跳到文件第一行G:跳到文件最后一行:n:跳到第n行,比如:42回车,直接到第42行Ctrl+f/Ctrl+b:向下翻页 / 向上翻页Ctrl+d/Ctrl+u:向下翻半页 / 向上翻半页%:在括号(小括号、中括号、大括号)之间跳转,光标在(上按%会跳到对应的)
这些移动命令看着多,其实分三组记就行:基础方向(hjkl)、单词级移动(wbe)、行与页级移动(0 ^ $ gg G Ctrl+f/b)。其中gg和G用的频率极高,比如排查日志时直接G跳到文件末尾看最新内容,然后:行号跳回原来位置,一来一回非常顺手。
判断哪里跳转在排错时特别有用。以后你在日志文件里看到报错信息写着"config.py line 128",直接vim config.py,然后输入:128回车,光标瞬间停在128行,配合行号显示,效率拉满。
3.2 删除、复制、粘贴与撤销:最常用的编辑四件套
接下来是编辑操作的核心区。先记住一个vim里的逻辑:删除操作实质上就是剪切,它把删掉的内容存进寄存器里,你随时可以粘贴出来。这个设计初看有点反直觉,但用顺了你会发现特别方便。
x:删除光标所在的字符(相当于普通编辑器里的Delete键)dd:删除光标所在行(剪切整行)dw:删除从光标到单词结尾的内容d$:删除从光标到行尾的内容d0:删除从光标到行首的内容D:等价于d$
复制相关的命令:
yy:复制当前行y$:复制从光标到行尾的内容yw:复制从光标到单词结尾的内容nyy:复制连续n行,比如5yy复制光标所在的下面5行
粘贴:
p:在光标后粘贴(如果粘贴的是整行,会粘贴到下一行)P:在光标前粘贴(整行则粘贴到上一行)
撤销与重做:
u:撤销上一步操作,可以连续按,不断回退Ctrl+r:重做,也就是撤销的反操作.:重复上一次修改操作。这个命令特别强悍,比如你刚执行了dd删了一行,按.就能继续删下一行,批量处理时非常好用
新手最常犯的一个错误是:执行了dd删了不该删的行,心里一慌,狂按u回退,结果发现回退过头了,又把不该恢复的也恢复了。这时候别慌,按Ctrl+r往回重做就行。u和Ctrl+r是成对的,一个是时光倒流,一个是把倒流的时光拉回来。
3.3 插入的各种姿势:i、a、o分别解决什么问题
进入插入模式的命令不止i一个,几个变体各有用途,选对能少按好几下键:
i:在光标位置前插入a:在光标位置后插入I:跳到当前行行首并插入A:跳到当前行行尾并插入o:在当前行下方新建一行并插入O:在当前行上方新建一行并插入
这六个命令里,A和o使用频率最高。比如你在一行的末尾想接着写,如果按i,光标会停在行尾最后一个字符的前面,你还得先把光标移到末尾;按A一步到位,光标直接到行尾进入插入模式。o则是快速往下开新行,写代码时在下一个大括号前补一行,按o效率极高。
另外还有两个极端场景的插入命令,如果你以前不知道,今天记住了能省很多事:
J:合并当前行和下一行,中间用空格分隔r:替换光标所在的字符,按下r再按任意键,当前字符就被替换成那个键。比先删后插快很多
特别提醒:r替换一次就自动回到普通模式,不需要你再按Esc,这个特性和i很不一样。
3.4 查找与替换:搜东西和批量改东西
查找是文本编辑的刚需。在vim里,普通模式下按/,底部会出现/提示符,输入关键词后回车,光标会跳到第一个匹配项。按n跳到下一个匹配,按N跳到上一个匹配。想要高亮所有匹配项,:set hlsearch开启高亮,:nohlsearch取消本次高亮。
如果你要搜的是当前光标所在的单词,还有一个更快的办法:普通模式下把光标停在某个词上,按*,vim会直接跳到下一个与当前单词相同的位置;按#则是往上搜索。
替换这块,命令行模式下的:s命令是重头戏:
:s/old/new:替换当前行的第一个匹配:s/old/new/g:替换当前行所有匹配:%s/old/new/g:替换整个文件中所有匹配(%代表整个文件范围):%s/old/new/gc:替换前逐个询问确认(c是confirm的缩写):10,20s/old/new/g:只替换第10行到第20行之间的匹配
这几个命令里,:%s/old/new/gc是我用最多的。为什么加c?因为全局替换有风险,可能把不该换的也换了。加上c之后,vim会逐个暂停,提示你确认是否替换,按y替换、按n跳过、按a全部替换、按q退出替换。这个确认机制在改配置、改代码时非常实用,强烈建议养成加c的习惯。
查找替换还有一个容易踩的坑:要替换的字符串里如果包含/(比如路径),命令会变得混乱甚至报错,因为/在vim里是命令分隔符。解决办法是把分隔符换成别的符号,比如:s#old/path#new/path#g,用#当分隔符,问题就解决了。
4. 进阶操作:从"会"到"高效"的跳跃
4.1 多文件编辑与分屏:同时处理多个文件
日常工作中,同时打开多个文件是家常便饭。三种方式可以满足:缓冲区、分屏、标签页。
缓冲区(Buffer):用vim打开多个文件时,可以用:n切到下一个文件、:N切到上一个文件、:ls列出所有打开的文件,:b 文件名按名字跳转。缓冲区适合只在一堆文件之间切换,不需要同时看两个文件内容的场景。
分屏(Split):分屏是同时查看多个文件的最优解。关键命令:
:sp 文件名:水平分屏,上下两个窗口:vsp 文件名:垂直分屏,左右两个窗口Ctrl+w加方向键(如Ctrl+w然后按j)或Ctrl+w加h/j/k/l:在窗口间切换Ctrl+w然后按q:关闭当前窗口Ctrl+w然后按=:让所有窗口等比宽高
实际操作中,我经常用垂直分屏一边开代码文件,一边开配置文件对照修改,非常顺手。还有一个很实用的场景:在日志文件里用/搜到某个关键词的位置,然后:vsp打开另一个日志文件,两边对照分析,排查速度直接翻倍。
标签页(Tabs)::tabnew 文件名新建标签页,:gt切换下一个标签页,:gT切换上一个标签页。标签页适合把不同类型的文件分组打开,但说实话,在vim里我用分屏比标签多,因为标签页在终端里不够直观,分屏反而更符合终端的使用习惯。
4.2 高效操作:多行注释、全选复制与块编辑
搜索引擎里很多人搜"vim一次注释多行"和"vim全选复制",这两个需求太常用了,我单独拎出来讲。
一次注释多行:假设你要给第5行到第10行都加上行首注释符#(Python、Shell脚本里),操作步骤是:
- 光标移到第5行,按
Ctrl+v进入可视块模式 - 按
5j向下选中5行(或者用方向键j逐行移动到第10行) - 按
I(大写),光标会跳到块的最上方,输入# - 按
Esc,你会发现第5到第10行全部被加上了#
这个操作的精髓在于Ctrl+v的块选择配合I批量插入。反过来,取消注释也是一样:Ctrl+v选中带#的行首列,按x直接删除整列。这套操作不仅适用于注释,还适用于给多行统一加前缀、缩进等场景。但这里我要加一句:此方法对行首注释符有效;如果注释符后面还有空格,或者代码里有对齐要求,可能需要用.重复命令来处理。
全选复制:vim里没有一个直接的"Ctrl+A全选"按钮,但组合命令一步就能完成:gg(跳到文件第一行)+V(进入可视行模式)+G(跳到文件最后一行),这时候整个文件就被选中了,再按y复制。整个流程就是ggVG加y,记成"ggVG y"就行。
如果只想复制第10行到第20行::10,20y,这个命令直接在命令行模式完成,复制后光标跳到第20行,粘贴用p。复制大段内容时,这个比可视模式还快。
块编辑的威力:有时候你只想在几行特定列的内容后面加上东西,或者删除一段方方正正的"代码块"。用Ctrl+v进入可视块模式,用j/k/l/h移动调整选区,然后按y复制或按d删除,就能做矩形区域的复制删除。最典型的场景是:把代码从缩进里的第5列开始复制到第30列,正常模式一行行处理会疯掉,可视块模式几秒搞定。
4.3 用.重复命令做批量操作
.重复命令前面提过,但这里值得再展开聊一次,因为它其实是一个"宏命令"的平替。假设你要把下面三行内容统一改成自己的名字:
name = alice name = bob name = charlie操作步骤是:先把光标移到第一行的alice,按cw(修改到单词结尾),输入tom,按Esc。光标这时候停在第一行改完的位置,但你发现第二行、第三行还等着改。按j下移一行,按.——vim自动重复了刚才"修改这个单词为tom"的操作。再按j、.,第三行也改完了。如果你有10行、100行,也可以这样一路按下来。
这个技巧在处理批量性质相同、但分散在不同行的小修改时,比全局替换还安全、可控。你不用写复杂的正则匹配,只要有规律地重复,就能一个点一个点地覆盖。
4.4 宏录制:把一套操作录下来回放
宏录制比.更进一步,它可以把一套复杂的操作录下来,然后在需要的每一行回放。操作方式:
- 普通模式下按
q,再按一个字母(比如a),开始录制宏到寄存器a - 执行你想要的一串操作,比如跳到行首(
0)、删除3个字符(3x)、跳到行尾($)等 - 再次按
q结束录制 - 在目标行按
@a重放宏,按@@重放上一次宏
宏是批量处理复杂文本的终极武器。比如你有一份目录文件,每一行要加序号、调整格式、补内容,一套操作一次录制,然后每行@a就搞定。虽然宏稍微有点学习曲线,但一旦掌握,处理重复性文本任务时你会感谢自己。
5. 把vim调成趁手的样子:.vimrc配置与插件
5.1 用.vimrc文件做基础配置
vim之所以好用,很大程度上取决于你的配置。配置文件在用户主目录下的.vimrc文件里,每次启动vim会自动加载。没有这个文件就自己建一个,vim ~/.vimrc,然后把配置写进去。
我的基础配置核心就是这几行:
set number " 显示行号 set relativenumber " 相对行号,方便精确跳转 set tabstop=4 " Tab键显示为4个空格宽度 set shiftwidth=4 " 缩进宽度为4 set expandtab " 用空格代替Tab键 set hlsearch " 搜索结果高亮 set incsearch " 搜索时实时预览 set ignorecase " 搜索忽略大小写 set smartcase " 如果搜索词包含大写字母,则区分大小写 syntax on " 开启语法高亮 set cursorline " 高亮当前行 set scrolloff=5 " 光标距离上下边缘至少5行 set pastetoggle=<F2> " 按F2切换粘贴模式,解决粘贴乱缩进这个配置里,showcmd我习惯开着,set showcmd可以在右下角显示当前命令的按键组合,新手阶段特别有用,能帮你确认自己按了什么。set clipboard=unnamedplus可以让vim直接使用系统剪贴板,这样在vim里复制的内容可以直接粘贴到终端外部,反之也是——但这个配置要求vim支持剪贴板功能,用vim --version看看输出里有没有+clipboard,如果有就是支持,没有的话可能需要安装vim-gtk3或者gvim。
配置生效方式有两种:重新打开vim,或者在vim里执行:source ~/.vimrc。每次改完配置,我习惯在vim里:source ~/.vimrc验证,不用退出重进,效率高很多。
5.2 插件管理:让vim脱胎换骨
vim原生能力上限很高,但默认配置确实朴素,如果你觉得界面不太好看、没有自动补全,可以用插件补强。插件管理推荐用vim-plug,安装方式简单,配置清晰:
" 在.vimrc开头加上下面内容 call plug#begin('~/.vim/plugged') " 这里写插件列表 Plug 'preservim/nerdtree' " 文件树 Plug 'vim-airline/vim-airline' " 状态栏美化 Plug 'dense-analysis/ale' " 语法检查 Plug 'jiangmiao/auto-pairs' " 自动补全括号 call plug#end()写完插件列表后,重新加载配置,在vim里执行:PlugInstall,插件就会自动下载安装。常用的插件组合:
nerdtree:在vim里浏览文件树,按F2切换(根据个人习惯配置快捷键)tagbar:展示代码的类、函数、变量大纲,写大文件时特别好用ale:代码实时语法检查,写Python、JavaScript的时候,错误会在状态栏标红auto-pairs:输入左括号自动补全右括号gruvbox:一个护眼的配色主题,装上后vim的颜值立刻提升
插件不要贪多,装五六个真正用得上的就好。插件装多了,启动会变慢,而且配置维护也费精力——我自己最初追求"全家桶",装上十几个插件,最后经常用的也就那么几个,很多反而让vim启动变慢、按键冲突,反而得不偿失。
5.3 把vim调成IDE:补全与跳转
如果你主要用vim写代码,那么补全和跳转是离不开的。两个方向:
一是用coc.nvim(Conquer of Completion),它接了语言服务器的能力,能做到类似IDE的智能补全、跳转定义、查找引用。安装方法:装好coc.nvim插件后在vim里执行:CocInstall coc-python、:CocInstall coc-clangd,按语言对应安装插件。配置稍微有点门槛,但它补全的体验确实接近VS Code了。
二是用语言原生的LSP客户端,比如vim-lsp,配合各语言的language server。这个方案更轻量,但配置稍复杂。如果你的主力语言是Python,建议用vim-lsp配合pylsp,体验非常顺滑。
写代码时常用的几个跳转命令:gd(goto definition,跳转到定义)、K(查看文档)、Ctrl+o(跳回上一个位置)、Ctrl+i(再跳回来)。这几个组合配合coc插件,基本就是IDE的定位功能了。
6. 常见问题与排查技巧实录
6.1 vim保存退出的"万年坑"
"vim保存退出命令"是搜索词里的高频词,足以说明这事让多少人头疼过。常见的几种退出方式我整理成一张表:
| 命令 | 作用 | 使用场景 |
|---|---|---|
:w | 保存文件 | 写到磁盘,不退出 |
:q | 退出vim | 未修改文件时安全 |
:wq | 保存并退出 | 改了内容想走人 |
:q! | 强制退出,不保存 | 改乱了,不想要了 |
:x | 保存并退出 | 同:wq但只在有修改时才写盘 |
ZZ | 保存并退出 | 等同:wq,但手不用移到冒号键 |
最容易出问题的是:q退出时提示E37: No write since last change (add ! to override),这是vim在提醒你"文件改了但没保存,你不要了?"如果你确实不想要修改,用:q!强制退出;如果想要修改,用:wq保存退出。别硬着头皮按:q,那样退出不了的。
还有一个新手常见的认知误区:用Ctrl+s去保存。在终端里按Ctrl+s会触发终端冻结(XOFF),整个界面卡住不动了,很多人以为死机了。解决办法是按Ctrl+q解冻(XON)。在vim里别用Ctrl+s,保存就是:w或者其他方式。
6.2 粘贴代码缩进错乱
在终端里往vim粘贴一段缩进好的代码,结果发现每行开头自动多出一层缩进,代码全乱套——这是sharing环境里最常见的问题。原因是vim开启了自动缩进,粘贴时它会重新缩进每行内容,导致原本的缩进叠加了额外的缩进。
解决的经典方法:设置一个粘贴模式快捷键,在.vimrc里加set pastetoggle=<F2>。当你粘贴前按一下F2,vim进入粘贴模式,自动缩进会被临时关闭,粘贴的内容原样进文件。粘贴完再按F2恢复普通模式。
如果你经常往vim里粘贴JSON、YAML、代码块,这个技巧能让你的效率翻倍。我见过不少同事用鼠标右键粘贴,粘贴完看着乱成一团的代码一脸懵,然后一行一行手工调整缩进,痛苦不堪。学会F2切换粘贴模式,这问题从根上就没了。
6.3 中文乱码与编码问题
在Linux上打开Windows传过来的文件,中文变成一堆乱码,这个问题的根源是编码不一致。Windows默认用GBK(简体中文Windows下是GBK/CP936),Linux环境一般用UTF-8。vim打开GBK文件时,按UTF-8解析自然乱码。
解决思路有两种:
第一种,在vim里临时修改编码打开:打开文件后发现乱码,用命令:e ++enc=gbk重新加载文件,按GBK解码。试了之后如果显示正常,这就是解决临时查看的方法。
第二种,转码:用iconv命令把文件从GBK转成UTF-8,iconv -f gbk -t utf-8 原文件 > 新文件,然后再用vim打开新文件,就没问题了。
如果你经常要处理这类文件,可以在.vimrc里加上set fileencodings=utf-8,gbk,latin1,让vim自动检测编码。设了这个之后,vim会依次尝试这些编码,直到找到正确解析文件的方式,大部分场景下能自动识别GBK文件。
6.4 按键没反应、方向键失灵、小键盘乱码
这些问题的本质多数出在终端模拟器或vim的兼容模式上。我整理一下我踩过的坑和对应的处理方案:
小键盘输入乱码:在终端里按小键盘的数字键,有时会产生字符序列,导致vim里输入的不是数字。解决方法是终端模拟器里关掉小键盘的"应用程序模式",或者在vim里设置
set t_kb=和set t_kD=,一般都能缓解。最快的替代方案:直接用主键盘区的数字键。方向键输出ABCD:这个前面讲过,本质是终端把方向键解析成了转义字符。如果vim没有正确识别,就会当普通字符插入。检查vim版本(新版vim自动识别),也可以
set nocompatible关闭兼容模式并恢复vim的完整行为。Esc键有延迟:按Esc后要等一会儿才生效,原因是vim在等待确认是否按下了终端转义组合键。解决:在
.vimrc里设置set timeoutlen=100 ttimeoutlen=0,或者直接set esckeys,可以大幅减少延迟。这个设置对追求速度的人非常关键,我设置完后再也没感受到Esc延迟了。某些键完全没反应:多出现在远程SSH连接时,终端类型设置不对。确保你的终端类型是
xterm-256color,在.vimrc里加set term=xterm-256color,能解决大量按键异常。如果还有问题,检查你的SSH客户端和终端模拟器的转发设置。
6.5 练习资源:怎么更快学会vim
学习vim最核心的一个建议就是:别用死记硬背,用"肌肉记忆"。我推荐三条练习路径:
vim自带教程:终端里输入
vimtutor,会打开一个交互式教程,大约30分钟过一遍,基础命令就都接触到了。这是所有学vim的人第一站,强烈建议认真过一遍。游戏化练习:有位开发者做了个网页游戏叫"vim大冒险"(Vim Adventures),你在游戏里移动角色就是在用vim的移动命令。边玩游戏边学vim,非常适合入门。如果你在搜索引擎里搜"vim大冒险",应该能找到入口。
日常工作中刻意使用:把日常编辑工作逐渐切到vim,写代码用vim、改配置用vim,把"回去用别的编辑器"这个念头断掉,大约一周到两周之后,你的手指就会形成肌肉记忆。我从开始学vim到能舒服地写代码,大概用了两周,之后完全回不去了。
7. 根据自己的场景选配置
学vim不是把别人的配置拿过来复制粘贴就行,不同的使用场景,合理的配置方向完全不同。我按几类人群给你拆解一下:
运维/开发同学:日常在服务器上改配置文件、查日志为主。这类用户最需要的配置是:set nu、:set hlsearch、:set ignorecase、多文件切换的快捷键配置、vimrc里的filetype on。不用装太多插件,保持vim轻便快速。
日常写代码的同学:需要一个像样的补全和语法检查系统。推荐vim-plug加ale、coc.nvim,还有auto-pairs。配置文件里syntax on是必须的,.vimrc里加上自动换行和缩进设置。写Python的话,set smartindent很必要。
纯文本编辑/写作的同学:重点配置在排版和舒适度上。set wrap(自动换行)、set linebreak(按单词换行)、set spell(拼写检查,中文环境下用处不大)、配色方案选择护眼的主题。这类用户需要的插件不多,vim-pencil这类写作辅助插件可以考虑。
我的建议是:.vimrc不用一步配到位,先配最基础的行号、缩进、语法高亮,用起来之后发现哪里不顺手,再一条一条加配置。配完一条重新打开vim验证一下效果,确认没问题再继续。
8. 聊聊我个人怎么从菜鸟到"键盘不离手"
最后聊点个人的体会。我最初接触vim,完全是被逼的——在一台没有图形界面的服务器上改配置,用nano都觉得不太方便,更别说鼠标了。那天晚上我学会了三个命令:i进插入模式,改完按Esc,:wq保存退出。就这三个,撑完了那次任务。
但真正让我决定学透vim的,是一次日志排查。当时生产环境报了一个问题,线上日志文件有400多MB,我用cat打开整个屏幕翻滚,完全找不到关键信息;用tail只看末尾又不知道问题在哪一段;后来试了grep,但一段上下文翻来翻去很费劲。最后同事给了我一句提示:"用vim,/搜索关键词,然后:set nu看行号定位。"我照做,几十秒就找到了问题所在。那一刻我意识到,vim不是"老古董",它是处理文本最锋利的工具。
从那以后我给自己定了个规矩:凡是能在终端里干的编辑活,一律用vim。刚开始确实慢,打个字都得切换模式,删除一行的命令也总记不住,但大概两周后,我发现我完全回不去了——用其他编辑器写代码,手会不自觉地想按Esc、按dd、按gg,没有这些操作感,总觉得少了点什么。
所以我想说的是,如果你还没有下定决心学vim,不妨先定个小目标:这周所有服务器上的配置文件编辑,都用vim完成。不要急着背完所有命令,先把i、Esc、:wq、dd、yy、p、u这七个高频操作练熟,然后再一点点扩展。等哪天你发现手在键盘上飞舞,不需要鼠标也能流畅地改完一大段代码,你会觉得之前所有的"卡顿感"都是值得的。