Vim Docs

Unix-style 系统中,shell 的光标默认是色块,而不是 Windows 中的 | 。因此讨论光标位置时,要严格区分光标前、光标所在位置与光标后。

命令模式

命令模式切换到底线命令模式:

常规输入

命令 作用
i 切换到输入模式,从当前光标位置开始输入
a 切换到输入模式,从光标位置后一位开始输入
o 当前行下方插入新行,并进入输入模式
O 在当前行上方插入新行,并进入输入模式
v 切换到选择模式,类似于鼠标框选文本

光标移动

以下命令输入后,按 Enter 触发

命令 作用
<num> + ↑↓←→ 光标向上/下/左/右移动 num 位,例如 30↑ 。左右移动时不会超过行首/行尾
ctrl + u/d 屏幕向上/下移动半页
<num> + Space 光标向后移动 num 位(可换行
0/$ 光标移动到行首/行尾Home/End 也行 )
G 光标移动到文件最后一行
gg 光标移动到文件第一行
<num> + G 光标移动到 num 行
<num> + Enter 光标向下移动 num 行

查找替换

命令 作用
/word 向光标后寻找 word 字符串
?word 向光标前寻找 word 字符串
n 重复前一个查找动作(等价于查找下一个/上一个
N 反向进行前一个查找动作(向前变向后,向后变向前
:<num1>,<num2>s/word1/word2/g 在 num1 行到 num2 行之间搜索字符串 word1 ,将其替换为 word2
:<num1>,<num2>s/word1/word2/gc 跟上面效果一样,但是替换时会请求确认 (confirm)
:%s/word1/word2/g 在所有行进行上述操作
:%s/word1/word2/gc 同理

批量操作

命令 作用
x 删除光标所在处的字符(后面的会自动向前缩进)
X 删除光标前一个字符
<num>x 从光标所在处开始, 向后删除 num 个字符
dd 剪切当前行 (带换行符)
<num>dd 从光标所在行开始, 向下剪切 num 行
d0 剪切光标前一位到行首
d$ 剪切光标所在处到行尾 (不带换行符)
d<num>G 从光标所在行开始, 剪切到 num 行
yy 复制当前行
<num>yy 复制光标所在的向下 num 行
y0 复制光标前一位到行首
y$ 复制光标所在处到行尾 (不带换行符)
y<num>G 从光标所在行开始, 复制到 num 行
小写 p 粘贴到光标(若带有换行符, 则粘贴到下一行)
大写 P 粘贴到光标(若带有换行符, 则粘贴到上一行)
J 将光标下一行合并到光标所在行, 用空格隔开
u 撤销上一次操作
ctrl + r 重做被撤销的操作
小数点 . 重复上一个操作
"+y 双引号 + 加号 + y,将 visual 模式中的内容复制到系统剪切板(不是 vim 的默认缓冲区)
"+p 将系统剪切板中的内容粘贴到 vim
> / < 向前或向后缩进光标选中的文本d

底线命令

底线命令模式切换到命令模式ESC

命令 作用
:w 保存文件
:wq 保存文件,并退出 Vim 编辑器
:q 退出 Vim 编辑器
:q! 强制退出 Vim 编辑器,不保存修改
:w <file_name> 将编辑的数据另存为新文件
:r <file_name> 在编辑的数据中,读入另一个文件(即将新文件内容添加到光标后)
:<num1>,<num2> w <file_name> 将 num1 到 num2 行的内容另存为新文件
! <command> 暂且离开 vi/vim 环境,执行 command 并显示结果

输入模式

按键 作用
Enter 换行
Backspace 删除光标前字符
Del 删除光标后字符
Home/End 光标移动到行首/行尾
Page Up/Down 上/下翻页

配置文件

vim 的配置文件位于 ~/.vimrc。配置文件中的 set 指令可以在 vim 窗口中通过 : 底线命令模式直接执行,当然也就只会在当前窗口中生效。写入配置文件时则会在每次编辑前默认加载。

字符集

1
set encoding=utf-8

缩进

1
set autoindent expandtab tabstop=2 shiftwidth=2
  • autoindent:换行时自动缩进
  • expandtab:按下 Tab 键时插入空格而不是制表符
  • tabstop=2:设置 tab 键的宽度为 2 个空格
  • shiftwidth:使用 << 和 >> 命令缩进或移动文本时的宽度为 2 个空格

行号

1
2
3
4
# 显示行号
set nu
# 取消显示行号
set nonu