VIM生存指南
第一次进vim,我卡在里面出不来
有这么一个场景,你在服务器上改某个配置文件,敲完`vim nginx.conf回车,程序页面跳了出来你一顿操作,但是屏幕上什么都没有出现。
想要退出,输了个q没有任何反应。再敲:q,还是没动静。最后只能关掉整个终端然后重新打开,然后发现配置文件没有任何更改。
这种情况可能不是卡了,也有可能是那些字母被vim当做命令给执行了。
这一幕很多人都经历过,这一篇我就把vim讲清楚,让你下次不会再困在里面。
一、vim用的懵懵的,主要原因是在模式
vim看起来好像和记事本差不多,但是它们最大的区别就在于vim是有模式的。同一个按键,在不同的模式下的功能是不一样的。
总共有三层:
| 模式 | 怎么进 | 按键的意义 |
|---|---|---|
| 命令模式 | 打开vim默认 | 按键此时是命令 |
| 编辑模式 | I、i、a、A |
这些才是输入内容 |
| 末行模式 | 命令模式下敲: |
保存、退出、替换这些操作 |
这时候你可能就会发蒙:“一个编辑器怎么搞的这么麻烦?太反人类了吧”。因为这东西的前身vi都快是50年前的产物了,那个年代的输入键盘连方向键都没有,也没鼠标,大部分的操作都是靠字母键操作。
因为远程连接一台Linux服务器,特别是最小化的安装系统,是没有图形界面的,能用的编辑器一般只有vim,不用又不行。
很多人的困惑都是在于在使用vim时不知道自己模式,判断其实不难,就在窗口的左下角

显示--插入--即代表进入了编辑模式,

光标跑到了最下方冒出来,就是末行模式,
底部的标记没有任何字,就是命令模式。
二、搞定进去再学会出来
编辑模式可以通过四个键进入,它们的区别就是光标出现在哪:
i在光标当前位置前插入,I跳到行首第一个非空格字符前插入,a在光标当前位置之后插入,A跳到行尾插入。
太多了记不住?那先用i把这个是最常用的。等想要在行末加内容时就能想起来A有多好用了。
从编辑模式退回命令模式很简单,点击键盘上的ESC就好。
给个小栗子体会一下差别,可以把光标停放在一行文字的正中间

按i键,再输个6

新内容就会出现在光标的左边,同样,要是按a的话,新内容就会在光标的右侧生成;按A的话不管光标在哪里,就直接跳到了这行的最末尾。
退出的五个指令都是在末行模式里敲
:w #保存
:q #退出
:wq #保存并退出
:q! #不保存,强制退出
:wq! #强制保存并退出,改只读文件时使用
这里有一个坑。文件改过但没保存时直接敲:q,vim会甩出一句E37: No write since last change,然后不放你走。想走有两条路径,:qw存完再走,或者:q!放弃修改硬走。
三、光标怎么跑
在命令模式下,移动光标不用方向键其实也特别利索:
| 操作 | 按键 |
|---|---|
| 到行首 | 0或 Home |
| 到行尾 | $或 End |
| 到文件第一行 | gg(这个最好记了) |
| 到文件最后一行 | G |
| 跳到第n行 | n gg,比如20gg |
| 向下移动n行 | 数字+回车 |
改配置文件时最为常用的就是gg和G,一个去头一个去尾。
我还得说一句vim有个标志性操作:
键盘上的h、j、k、l这四个按键分别代表:左、下、上、右。熟练后要是哪天键盘上的方向键坏了,或者日常使用,输入的时候还是游刃有余。
四、复制、删除、撤销
| 操作 | 按键 |
|---|---|
| 复制当前行 | yy |
| 复制n行 | n yy,比如3yy |
| 粘贴到当前行的下一行 | p |
| 删除当前行 | dd |
| 删除n行 | n dd,比如3dd |
| 撤销上一步 | u |
上面的几个组合键dd值得单独说,在使用dd后删的内容会存进vim的缓冲区,紧接着按p又能把它粘贴回来。所以dd加p其实就相当于一次剪切加粘贴,要是你想挪一行代码还是特别顺手的。
要是你有更小的内容要删,这个内容在行里面你可以这样做
删掉光标所在的单个字符用x,从光标一路删到行尾用d。这两个加上dd一起配合着用,删除的场景基本就全部包含了
五、查找和替换,全是干货
查找在命令模式的功能:
/关键字从光标位置向下,?关键词向上找,找到以后可以用n跳到下一个或者用N跳回到上一个。
替换在末行模式的功能:
:%s/A/B/g # 全文范围内,把所有的A换成B
:2,5s/A/B/g # 只在第2道第5行之间替换
末尾的那个g是代表一行里所有匹配的都换,把它去掉,就只替换每一行找到的第一个。这个细节很多人都没有分清楚。
再往前加个c,写成:%S/A/B/gc,vim会在每一处匹配前停下来问你一句`replace with B (y/n/a/q/l) 让你一个个确认。批量替换的时候,这个开关非常好用。
不确定替换会不会出错?那就用gc慢慢过一遍。
查找功能还有一个小细节,它是默认区分大小写的,也就是说/error是找不到Error的。你想要临时忽略的话就在关键词后面加\c,写成/error\c,三种写法都能命中。
六、改到一半突然后悔了
完了,现在手滑改错了咋办?两个方法。
刚改错就用u撤销,按几次就撤几步。
更严重的情况,改得面目全非想整个重来,用:e!强制重新载入文件,它会丢掉这次打开后的全部修改,把文件恢复成上次保存的样子。这一招比:q!快得多。
七、行号怎么打开
如下:
:set nu # 显示行号
:set nonu #取消行号
这个可以临时看一眼,在vim直接用就行,如果你想要它永久生效的话,就可以把set nu写进家目录下的.vimrc文件里,下次打开自动带行号。
为什么?
.vimrc是vim的配置文件,就放在家目录(home),文件如果不存在就自己建一个。除了行号,常用的还有set hlsearch让查找结果来高亮显示,改完后直接保存,重新打开vim即可生效
还有个省事的方法,打开文件时直接去某一行:vim +20 nginx.conf,一进去就会停在20行,比用20gg好用。
八、指令速查表
| 场景 | 操作 |
|---|---|
| 开始输入文字 | i,写完按ESC |
| 退出保存 | :wq |
| 改崩了想重来 | :q! |
| 跳到文件开头 | gg |
| 跳到文件结尾 | G |
| 跳到第n行 | n gg |
| 复制一行 | yy,粘贴用p |
| 删一行 | dd |
| 撤销 | u |
| 找关键词 | /关键词,按n继续 |
| 全文替换 | `:%s/A/B/g |
| 显示行号 | :set nu |
| 全部重来 | :e! |
这就是常用的指令表,可以存下来,需要的时候回来翻一翻。
最后
对于一个新手来说,卡在vim的原因最多的就只有这一个:不知道在哪层,命令本身不多,难点是如何快速定位自身的状态。
记住一条判断顺序:想打字,先按一下i;打完字还想做其他的,就先按ESC;想要保存退出就先输入:。
卡住的时候先按一下ESC回到命令模式,大部分的问题基本都消失了。剩下的问题就交给:q!。