vi 命令是一种文本编辑器,常用于 Linux 和 Unix 操作系统中。它的设计初衷是为了在命令行界面下对文件进行编辑,因此具有简单、高效和灵活的特点。虽然现代计算机使用图形界面的文本编辑器已很普遍,但 vi 仍然被广泛使用,尤其是在服务器运维和开发领域。在本文中,我将全面详细讲解 vi 命令及其全部快捷键。
一、vi 的基本概念
vi 的三种模式
vi 命令有三种模式,分别是命令模式(Command mode)、插入模式(Insert mode)和行末模式(Last line mode)。这三种模式的切换方式如下:
在命令模式下,按下 i 键或 Insert 键,进入插入模式。
在插入模式下,按下 ESC 键,回到命令模式。
在命令模式下,按下 : 键,进入行末模式。
vi 的基本操作
在命令模式下,我们可以使用以下基本操作:
光标移动:h(左)、j(下)、k(上)、l(右)。
进入插入模式:i,在光标前插入;a,在光标后插入。
删除操作:x,删除光标所在的字符;dd,删除整行。
撤销操作:u,撤销最后的操作。
保存操作::w,保存文件;:q,退出 vi;:q!,强制退出 vi。
1. 命令模式下的快捷键
-
光标移动:
- h 或 <左箭头键>:向左移动一个字符。
- j 或 <下箭头键>:向下移动一行。
- k 或 <上箭头键>:向上移动一行。
- l 或 <右箭头键>:向右移动一个字符。
- 0:移到行首。
- $:移到行末。
- ^:移到本行第一个非空字符处。
- G:移到文件末尾或第 n 行(n 为数字)。
- nG:移到第 n 行(n 为数字)。
-
插入操作:
- i:在光标前插入。
- I:在行首插入。
- a:在光标后插入。
- A:在行末插入。
- o:在光标下新开一行并插入。
- O:在光标上新开一行并插入。
-
删除和复制操作:
- x:删除光标所在的字符。
- dd:删除整行。
- yy:复制整行。
- p:在光标下粘贴。
-
撤销操作:
- u:撤销最后的操作。
- Ctrl + r:恢复最后的操作。
-
查找和替换:
- /pattern:向前查找 pattern。
- ?pattern:向后查找 pattern。
- n:继续查找下一个。
- N:继续查找上一个。
- 😒/old/new:将光标所在行中第一个 old 替换为 new。
- 😒/old/new/g:将光标所在行中所有 old 替换为 new。
- :%s/old/new/g:将整个文件中所有 old 替换为 new。
-
其他操作:
- :w:保存文件。
- :q:退出 vi。
- :wq 或 :x 或 ZZ:保存文件并退出 vi。
- !command:执行外部命令 command。
- :set number:显示行号。
- Ctrl + g:显示当前位置及文件状态。
- :set tabstop=n:设置 tab 键宽度为 n 个空格。
- :set expandtab:将 tab 转换为空格。
- :set noexpandtab:取消将 tab 转换为空格。
- J:将光标所在行与下一行合并。
- :n1,n2 w file:将 n1 到 n2 行的内容保存到 file 文件中。
- :n1,n2 w >>file:将 n1 到 n2 行的内容追加到 file 文件中。
- :n1,n2 d:删除 n1 到 n2 行的内容。
- :n1,n2 co n3:将 n1 到 n2 行的内容复制到 n3 行下面。
- :n1,n2 m n3:将 n1 到 n2 行的内容移动到 n3 行下面。
2. 插入模式下的快捷键
- ESC:回到命令模式。
- Ctrl + g:显示当前光标位置。
- Ctrl + h 或 Backspace:删除光标前面的一个字符。
- Ctrl + d:删除光标后面的一个字符。
- Ctrl + t:插入制表符(Tab)。
- Ctrl + v:插入控制字符(例如 Ctrl + v,Ctrl + n 将插入一个换行符)。
- Ctrl + y:插入来自光标上方的文本。
- Ctrl + e:插入来自光标下方的文本。
- Ctrl + a:移到行首。
- Ctrl + e:移到行末。
- Ctrl + f:向后翻页。
- Ctrl + b:向前翻页。
3. 行末模式下的快捷键
- /pattern:向前查找 pattern。
- ?pattern:向后查找 pattern。
- n:继续查找下一个。
- N:继续查找上一个。
- :w:保存文件。
- :q:退出 vi。
- :wq 或 :x 或 ZZ:保存文件并退出 vi。
- :e filename:打开另一个文件。
- :e! filename:强制打开另一个文件。
- :n:编辑下一个文件。
- :!command:执行外部命令 command。
- :set number:显示行号。
- :set nonumber:不显示行号。
- :%s/old/new/g:将整个文件中所有 old 替换为 new。
- :25:跳转到第 25 行。
- : $:跳转到最后一行。