vi/vim 常用命令

vim-editor

Vim 是从 vi 发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。

vi/vim 常用命令

简介

vi 是 Unix 和 Linux 操作系统使用的终端文本编辑器,任何一台安装了 Unix 或 Linux 的机器都会提供这套软件,它是系统管理员手中的得力工具。vim 是 vi 的升级版,它不仅兼容 vi 的所有指令(命令),而且还具有一些新特性。

操作模式

vi 有三种操作状态:

  • 命令模式(command mode)
  • 插入模式(insert mode)
  • 末行模式(last line mode)

它们的功能如下:

  1. 命令模式:当执行 vi 后,首先会进入命令模式(指令模式),此时输入的任何字符都被视为命令。命令模式用于控制屏幕光标的移动,文本的删除,移动复制某区段,进入插入模式下,或者进入末行模式。

  2. 插入模式:在命令模式下输入相应的插入命令进入该模式。只有在插入模式下,才可做文字数据输入和其它编辑操作,按 ESC 键可回到命令模式。

  3. 末行模式:在命令模式输入某些特殊字符,如 "/"、"?" 和 ":",可进入末行模式。在该模式下可存储文件或离开编辑器,也可以设置编辑环境,如寻找字符串、列出行号等。

vi 三种工作模式的转换如图:

vi工作模式

进入与退出

进入 vi

若要编辑文件 myfile,执行如下执行即可:

1
$vi myfile

终端显示 vi 的编辑窗口,进入命令模式。也可以直接输入 vi 创建一个新文件,然后在退出时保存文件或者丢弃。

退出 vi

如果在插入模式下,则先利用 ESC 键返回命令模式,然后可选用下列指令退出 vi。

  • :q! 离开 vi,并放弃刚才的修改。
  • :wq 保存退出。
  • :ZZ 保存退出。
  • :x:wq
  • :w 保存但不退出。
  • :q 退出 vi,若文件被修改过,则会被要求确认是否放弃修改。此指令可以 w 配合使用。

注意:如果不知道当前处于何种模式,可以多按几次 ESC 键,以便确认进入命令模式。

常用命令

命令模式

在命令模式下可以进行文本的编辑工作。使用下列命令,配合一般键盘上的功能键,如方向键、Insert 键、Delete 键等,就可以利用 vi 来处理文本数据了。

光标的移动

命令 说明 功能键
h 向左移一个字符 \(\leftarrow\)
l 向右移一个字符 \(\rightarrow\)
j 向上移一个字符 \(\uparrow\)
k 向下移一个字符 \(\downarrow\)
0 移至该行之首 Home
$ 移至该行之末 End
^ 移至该行的第一个非空白字符处
H 移至窗口的第一行
M 移至窗口的中间那行
L 移至窗口的最后一行
G 移至该文件的最后一行
nG 移至该文件的第 n 行
gg 移至该文件的第一行
w 跳到下一个单词
b 跳到上一个单词
{ 按段移动,上移
} 按段移动,下移

翻屏与滚屏

命令 说明 功能键
Ctrl+f 向后翻一屏 PageDown
Ctrl+b 向前翻一屏 PageUp
Ctrl+d 向后翻半屏
Ctrl+u 向前翻半屏
zt 光标所在行移动到窗口顶端
zz 光标所在行移动到窗口中间
zb 光标所在行移动到窗口底部

删除(剪切)与修改

命令 说明 功能键
x 删除光标所在的字符 Delete
X 删除光标的前一个字符
dd 删除光标所在的行
ndd 删除包括光标所在行的 n 行文本
d0 删除从光标前一个字符开始一直到行首的文本
dw 删除从光标开始的一个单词
D 删除从光标开始一直到行末的文本
s 删除光标所在字符并进入插入模式
S 删除光标所在行并进入插入模式
r 替换光标所在字符
R 进入替换状态,替换光标所在字符及以后的字符,按 ESC 退出替换状态

复制粘贴

命令 说明
yyY 复制光标所在行
nyynY 复制包括光标所在行开始的 n 行
p (小写) 粘贴到光标的下一行
P (大写) 粘贴到光标的上一行

撤销与反撤销

命令 说明
u 撤销
Ctrl+r 反撤销

文本行移动(缩进)

命令 说明
>> 向右移动(缩进)
<< 向左移动(缩进)
> (vim 支持) 向右移动(缩进)
< (vim 支持) 向左移动(缩进)

重复命令

命令 说明
. 重复执行上一次的命令

退出命令

命令 说明
ZZ 退出保存,相当于末行模式下的 :wq

插入模式

所有以下命令都能从命令模式进入插入模式。

命令 说明
i 从光标所在字符前面开始插入字符
I 从光标所在行的行首开始插入字符
a 从光标所在字符后面开始插入字符
A 从光标所在行的行末开始插入字符
o 光标所在行向下新增一行
O 光标所在行向上新增一行

末行模式

查找命令

命令 说明
/exp 往前查找字符串 exp,n 下一个,N 上一个
?exp 往后查找字符串 exp,n 下一个,N 上一个

替换命令

命令 说明
:%s/abc/123/g 将当前文件中所有的 abc 替换成 123
:1,10s/abc/123/g 将 1 到 10 行的 abc 全部替换成 123

退出命令

命令 说明
:q 退出程序
:q! 强制退出,不保存修改
:w 保存修改
:w filename 将编辑内容存为名为 filename 的文件
:wq 保存退出
:x 若有修改保存,退出程序

:wq 强制性 写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。

:x 写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间。

其它命令

命令 说明
:set nu 显示行号
:set nonu 不显示行号
:set ff 查看文件格式
:set ff=unix 修改文件格式为 unix
:noh 取消搜索结果高亮

可视模式

命令 说明
v 选中文本(按字符移动)
V 选中文本(按行移动)

可视模式可以配合 dy 实现对文本块的删除(剪切),复制。

vim 下还支持配合 <> 实现对文本块的左右移动,首先使用 vV 选择要移动的部分,然后按 Ctrl+v 选中该文本块,接着可根据需要左移 < 或 右移 >

进阶命令

快速纠错

进入 vim 之后首先使用 a/i/o 之一进入插入模式:

  • Ctrl+h 删除上一个字符
  • Ctrl+w 删除上一个单词
  • Ctrl+u 删除当前行

快速切换模式

快速切换 normal 模式

  • 使用 Ctrl+c 代替 Esc(但是可能会中断某些插件)
  • 或者 Ctrl+[

快速切换 insert 模式

  • gi 快速跳转到你最后一次编辑的地方并进入插入模式

快速移动

单词之间移动

  • w/W 移动到下一个单词 word/WORD 开头
  • e/E 移动到下一个单词 word/WORD 结尾
  • b/B 移动到上一个单词 word/WORD 开头

注意:

  • word 指的是以非空白符分割的单词
  • WORD 指的是以空白符分割的单词

行间搜索移动

同一行快速移动的方式其实是搜索一个字符并且移动到该字符。

  • 使用 f{char} 可移动到 char 字符上,从左往右搜索
  • 使用 F{char} 可移动到 char 字符上,从右往左搜索
  • t{char} 移动到 char 的前一个字符,从左往右搜索
  • T{char}` 移动到 char 的后一个字符,从右往左搜索
  • 可以用分号 ; 继续搜索该行下一个
  • 可以用分号 , 继续搜索该行上一个

水平移动

  • 0 移动到行首
  • ^ 移动到行首非空白字符
  • $ 移动到行尾
  • g_ 移动到行尾非空白字符

垂直移动

  • 使用 () 在句子 sentence 间移动,你可以使用 :help ( 查看 sentence 的定义
  • 使用 {} 在段落 paragraph 间移动,你可以使用 :help { 查看 paragraph 的定义

页面移动

  • gg 移动到文件开头
  • G 移动文件结尾
  • Ctrl+o 快速返回
  • H 跳转到屏幕的开头(Head)
  • M 跳转到屏幕的中间(Middle)
  • L 跳转到屏幕的结尾(Lower)
  • zz 把屏幕置为中间

快速增删改查

快速删除

  • vim 在 normal 模式下使用 x 快速删除一个字符
  • 使用 d(delete)配合文本对象快速删除一个单词 daw(d around word)
    • dw 表示删除光标后面的单词
    • daw 表示删除光标所在的单词,包括单词旁边的空格
    • diw 表示删除光标所在的单词,但不包括单词旁边的空格
    • dt{char} 表示从光标位置删除到 char 之前的字符
  • dx 都可以配合数字来执行多次

快速修改

常用的有三个,r(replace),c(change),s (substitute)。

  • r 可以替换一个字符
  • s 删除当前字符并且进入插入模式
  • c 可以配合文本对象快速修改一个单词
    • cwciwcawct{char} 只不过是在 dwdiwdawdt{char} 删除的基础上同时进入插入模式

键盘图

vi-vim-cheat-sheet-cn

vi-vim-cheat-sheet