Vim 编辑器功能强大,同时也需要一定的学习成本。本文旨在记录常用的命令,要想用好 Vim,还是需要不断的实践练习,刚开始会觉得很困难,效率很慢,熟悉之后你就会离不开它的。
先定个小目标,早睡和早起!
写在前面
Vi(Vim) 作为一个强大的编辑器,其强大的功能由非常多的命令支撑;这么多的命令靠死记硬背显示是不行的,而是需要在训练中强化记忆,这个帖子只是对常用命令作一个记录。
首先,要了解一下 vi 编辑器的三种模式。
一般模式:这是最常见的模式,绝大部分的命令都是在这个模式下运行的;在这个模式下,我们可以随意地定位光标,删除任意多的内容,复制粘贴,撤销重做等等
编辑模式:一旦进入这个模式,vi 编辑器就与一般的编辑器没什么不同了,也是使用 backspace 或 delete 键进行删除,使用光标键进行移动
指令模式:在这个模式下可以执行一些指令,比如保存文件,退出 vi 编辑器等
最常用的模式是一般模式,另外一般模式是另外两个模式的桥梁,也就是说另外两个模式要相互转换必须经过一般模式。刚进入 vi 时就处于一般模式,如果想从另外两个模式转换到一般模式,按 ESC 键即可。在一般模式下,输入一些能够开始编辑的命令,就进入编辑模式,比如 i, o 等命令。在一般模式下,输入命令 : 或 / 或 ? 就可以进入指令模式。
移动定位
命令 | 描述 | 备注 |
---|---|---|
h | 光标左移 | |
l | 光标右移 | |
j | 光标下移 | |
k | 光标上移 | |
+ | 移动到下一行 | 定位到本行首个非空白字符 |
- | 移动到上一行 | 定位到本行首个非空白字符 |
$ | 移动到行尾 | 光标定位到本行第一个字符 |
0 | 移动到行首 | 光标定位到本行最后一个字符 |
w | 移动到下个单词的首字符 | |
e | 移动到下个单词的尾字符 | 如果当前光标已经在本单词的尾字符,则移动到下个单词的尾字符,否则移动到本单词的尾字符 |
b | 移动到上个单词的首字符 | |
nw | 移动 n 个单词 | 光标定位在第 n 个单词的首字符 |
ne | 移动 n 个单词 | 如果当前光标在本单词的尾字符,则定位到第 n 个单词的尾字符,否则定位到第 n-1 个单词的尾字符 |
nb | 向前移动 n 个单词 | |
gg | 移动到文件首 | 光标定位在首行的第一个字符 |
G | 移动到文件末 | 光标定位在尾行的第一个字符 |
n | 定位到第 n 行 | 指令模式下运行,光标定位在首字符 |
n | 往下移动 n 行(输入 n 之后按回车) | 光标定位在首字符 |
ctrl+f | 往下移动一页 | |
ctrl+b | 住上移动一页 | |
ctrl+d | 往下移动半页 | |
ctrl+u | 往上移动半页 | |
H | 移动到本屏第一行 | |
M | 移动到本屏中间行 | |
L | 移动到本屏最后一行 |
- hjkl 这四个命令是两对命令,hl 左右移动,jk 上下移动,这种两边成对的方式比按顺序成对更为自然。
- 向下翻页和向上翻页分别是 forward 和 behind 的意思,一般阅读往前走都是向下走的,所以 ctrl+f 是向下翻页,ctrl+b 是向上翻页。
- 向下翻半页和向上翻半页则是 down 和 up 的意思,这两个就比较好理解了,ctrl+d 向下翻半页,ctrl+u 向上翻半页。
退出编辑器
命令 | 描述 | 备注 |
---|---|---|
wq | 保存后退出 | 指令模式下运行 |
q! | 不保存直接强制退出 | 指令模式下运行 |
删除操作
命令 | 描述 | 备注 |
---|---|---|
x | 往后删除一个字符 | 删除当前光标所在字符 |
X | 往前删除一个字符 | 删除当前光标前面的字符 |
dw | 往后删除一个单词 | 连同单词后面的空白字符一起删除 |
de | 往后删除一个单词 | 不删除单词后面的空白字符 |
db | 往前删除一个单词 | 不删除单词前面的空白字符,不删除光标所在字符 |
d$ | 从当前光标位置删除到行尾 | 包括当前光标所在字符 |
d0 | 从当前光标位置删除到行首 | 不包括当前光标所在字符 |
dG | 从当前光标所在行删除到文件尾 | 包括当前行 |
dgg | 从当前光标位置删除到文件头 | 不包括光标所在字符 |
dd | 删除当前行 | 删除后光标会定位到下一行的行首 |
ndd | 从当前行开始往下删除 n 行 | 包括当前行 |
di{ | 把光标定位在在 { 上,然后按下 di,就可以把括号内的内容删除,括号保留 | di(,di[ 也同样 |
一个文本中有一个单词 pad,如果此时光标在字符 a 上,则表示当前所处位置是 a 的前面,p 的后面,所以输入 x 命令会删除字符 a,输入 X 命令会删除字符 p。如果此时进入插入模式,则新插入的内容也是在 a 的前面,p 的后面。
进入编辑模式
命令 | 描述 | 备注 |
---|---|---|
i | 在当前光标处插入文本 | 在光标所在字符前面插入 |
a | 在当前光标后面插入文本 | 在光标所在字符后面插入 |
I | 在本行第一个非空字符前面插入文本 | |
A | 在本行最后一个字符后面插入文本 | |
o | 在下一行插入新行 | |
O | 在上一行插入新行 |
多选操作
命令 | 描述 | 备注 |
---|---|---|
v | 自由选择 | 进入可视状态之后,按任何移动键进行自由选择 |
shift+v | 选择多行 | 进入可视状态之后,按 j k 或上下翻页键进行多行选择 |
ctrl+v | 选择多列 | 进入可视状态之后,按 h l 进行多列选择,再按 j k 或翻页键选择多行 |
批量注释
- 第一种方法,使用 v 或 shift+v 或 ctrl+v 的任意一种,选择要注释的行之后,进入指令模式,输入
normal i 注释符
即可。这种方式不要求整行选择或者必须选择某一列,只要该行被选中,就会行首进行注释。 - 第二种方法,使用 ctrl+v 进行多列选择,然后输入 i ,再输入注释符,最后按 esc 结束,就可以将选中的行进行注释。这种方式会在选中的列位置插入注释符,如果要在行首进行注释,则必须选中第一列。
批量取消注释
按 ctrl+v 选中注释符所在列,然后选中要取消注释的列,按 d 删除注释符。这种方式其实是把注释符删掉,所以如果注释有多个的话(像//),则必须选中所有注释符,才能完整删掉。
格式化代码
选中要格式化的代码,按 = 即可。
文件内查找
命令 | 描述 | 备注 |
---|---|---|
/+char | 在一般模式下按 / 键进入指令械,然后输入要查找的字符 char,输入完成按回车键回到一般模式,这时就进入查找状态了 | 向前查找 |
?+char | 同 /+char 一样 | 向后查找 |
shift+8 | 在一般模式下,光标定位在要查找的字符上,按下 shift+8 就可以查找这个字符 | 同 /+char 一样的功能 |
n | 查找下一个 | 按定义的方向查找 |
N | 查找上一个 | 按定义的方向反方向查找 |
文件內替換
命令 | 描述 | 备注 |
---|---|---|
:s/old/new | 在一般模式下按 : 进入命令模式,然后输入 s/{要替换的旧字符}/{要替换砀新字符} ,按回车键结束 |
只替换光标所在行的第一个匹配项 |
:s/old/new/g | 同上 | 替换光标所在行的所有匹配项 |
:m,ns/old/new/g | 同上,m,n 表示一个数字 | 替换第 m 行到第 n 行的所有匹配项 |
:%s/old/new/g | 同上 | 替换整个文件的所有匹配项 |
:%s/old/new/gc | 同上 | 替换整个文件的所有匹配项,每次匹配前由用户确认 |
r | 在一般模式下按 r 删除当前光标所在字符同时进入编辑状态 | 输入一个新字符之后自动退出编辑状态,也就是 r 命令只能把单个字符替换成单个字符 |
R | 在一般模式下按 R 会进入替换模式,当前光标会显示为下划线 | 每输入一个字符就会替换当前光标所在的字符,然后光标后移一位,直到按 ESC 退出编辑模式为止,如果替换到行尾,还是可以继续输入字符,则相当于变成插入模式,R 命令可以连续替换多个字符 |
ce | 往后删除一个单词之后进入编辑状态 | 等价于 de + i |
cw | 同 ce | cw 和 ce 完全一样,也是等价于 de + i,而不是 dw + i,de 会保留单词后面的空格,dw 则会连同后面的空格一起删除 |
cb | 往前删除一个单词后进入编辑状态 | 等价于 db + i |
全局搜索
命令 | 描述 | 备注 | |
---|---|---|---|
vim /char /% \ | copen | 只查找本文件 | vim 是 vimgrep 的缩写,使用 vim 或 vimgrep 都可以,管道 copen 命令会打开一个新的分页,查找的结果显示在分页中 |
vim /char /* \ | copen | 查找本目录下的所有文件 | 使用 /* 或 /** 都可以 |
显示行号
命令 | 描述 | 备注 |
---|---|---|
:set nu | 在一般模式按 : 进入命令模式 | 显示行号 |
:set nonu | 同上 | 隐藏行号 |
缓冲区跳转
每个打开的文件都会有一个缓冲区,通过切换缓冲区可在不同文件之间切换查看。
命令 | 描述 | 备注 |
---|---|---|
{:ls} or {:buffers} | 列出所有缓冲区 | 列出缓冲区编号、文件名、当前定位行数 |
{:bn} or {:bnext} | 切换到下一个缓冲区 | 含义:buffer next |
{:bp} or {:bprevious} | 切换到上一个缓冲区 | 含义:buffer previous |
{:b[n]} or {:b [n]} | 切换到指定缓冲区 | n 为缓冲区编号 |
:b [exp] | 切换到指定缓冲区 | exp 为表达式,用于模糊匹配文件名 |
<ctrl+^> | 切换到上一个活跃缓冲区 | 在当前缓冲区和上一个缓冲区来回切换 |
高级用法
要查看所有缓冲区,除了使用 :ls
或 :buffers
来列出之外,还可以借助快捷键
命令 | 描述 | 备注 |
---|---|---|
:b |
列出缓冲区列表,再次按 |
:b 与 |
:b exp |
进行模糊匹配,只列出与 exp 匹配的文件 |
分屏显示
一个缓冲区对应一个文件,屏幕上只能显示一个缓冲区的内容,即只能显示一个文件;如果要同时显示多个文件,就需要分屏显示,通过把屏幕分隔成多个窗口,每个窗口显示一个缓冲区,就能做到在屏幕上同时显示多个文件。
水平分屏:以水平线进行分割,将屏幕分为上、中、下等多个窗口;
垂直分屏:以垂直线进行分割,将屏幕分为左、中、右等多个窗口。
命令 | 描述 | 备注 |
---|---|---|
vim -o file1 file2 | 水平分屏打开多个文件 | 打开几个文件就开几个窗口,如果只有一个文件则不分屏 |
vim -O file1 file2 | 垂直分屏打开多个文件 | |
{sp} or {split} or {new} | 新增水平分屏,新窗口在最顶端且为当前活跃窗口 | 如果带文件名则打开该文件,否则打开当前窗口的文件,如果当前窗口也没打开文件,则新窗口也无文件 |
{vs} or {vsp} or {vsplit} | 新增垂直分屏,新窗口在最左边且为当前活跃窗口 | 同水平分屏 |
{clo} or {close} | 关闭当前窗口 | |
<ctrl+w> s | 水平分屏 | 以当前文件打开 |
<ctrl+w> v | 垂直分屏 | 以当前文件打开 |
<ctrl+w> n | 水平分屏 | 新窗口,无打开文件 |
<ctrl+w> q | 关闭当前窗口 | |
<ctrl+w> o | 关闭当前窗口之外的所有窗口 |
外部命令
在一般模式下输入 :![cmd]
即可执行外部命令,:
进入指令模式,!
表示接下来的命令是外部命令;执行成功之后会临时跳出 vim 回到终端,在终端显示执行结果,并提示 请按 ENTER 或其它命令继续,按下回车键或其它命令键就会回到 vim 界面。