文章目录
- 一、基本使用流程
- 二、普通命令模式
- (一)切换到插入模式(编辑/写入/输入)
- (二)切换到可视模式(选择文本模式)
- (三)切换至底行命令模式
- (四)替换/修改
- 1. 切换到替换模式
- 2. 替换命令
- 3. 修改替换(删除旧的,输入新的)
- (五)互换位置
- (六)字符大小写切换
- (七)选择文本
- (八)复制
- (九)粘贴/恢复
- (十)删除/剪切
- (十一)重复前一个操作
- (十二)标记(其实没啥用)
- (十三)多行合并
- (十四)文本行移动/缩进
- (十五)撤回/撤销
- (十六)游标移动
- 1. 以词为单位移动
- 2. 以字符为单位移动
- 3. 按句子移动
- 4. 按段移动
- 5. 移动游标到匹配字符
- 6. 查看游标所在行号
- (十七)跨行移动文本内容/剪切文本内容
- (十八)屏幕滚动命令
- 1. 滚屏命令
- 2. 分页命令
- (十九)文档状态/统计文档信息
- (二十)查找/搜索字符串
- (二十一)查看历史命令
- (二十二)查看历史搜索记录
- (二十三)保存退出
- (二十四)宏录制
- (二十五)打开光标所在词的使用手册
- 三、可视模式
- (一)字符可视模式
- 1. 选择文本
- 2. 复制文本
- 3. 删除文本
- 4. 修改替换
- 5. 文本行移动
- 6. 大小写切换
- 7. 合并多行
- 8. 加密文本
- 9. 保存文本
- 10. 文本排序
- 11. 移动光标
- 12. 切换到插入模式
- 13. 退出可视模式
- (二)行可视模式
- 1. 选择文本
- 2. 复制文本
- 3. 删除文本
- 4. 修改替换
- 5. 文本行移动
- 6. 大小写切换
- 7. 合并多行
- 8. 加密文本
- 9. 保存文本
- 10. 文本排序
- 11. 移动光标
- 12. 切换到插入模式
- 13. 退出可视模式
- (三)块可视模式
- 1. 选择文本
- 2. 复制文本
- 3. 删除文本
- 4. 修改替换
- 5. 文本行移动
- 6. 大小写切换
- 7. 合并多行
- 8. 加密文本
- 9. 保存文本
- 10. 文本排序
- 11. 移动光标
- 12. 切换到插入模式
- 13. 退出可视模式
- 四、底行命令模式
- 五、插入模式
- (一)选择文本
- (二)复制文本
- (三)粘贴文本/插入寄存器的内容
- (四)运算表达式
- (五)删除文本
- (六)移动文本
- (七)移动光标
- (八)临时切换到普通命令模式
- (九)修改/替换
- (十)搜索
- (十一)退出插入模式
- (十二)自动补全
- (十三)翻页
- 六、vim 命令打开文件及选项参数说明
- 七、寄存器
- 八、查看 vim 编辑器的帮助文档
Vim 和 Vi 都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 Vi 的所有指令,而且还有一些新的特性在里面。
下面讲解的 vim 功能都是基于以下的系统环境和软件版本:
Linux 内核版本:4.18.0-193.6.3.el8_2.x86_64
Linux 发行版本:CentOS Linux release 8.2.2004 (Core)
VIM 版本:8.0.1763
注:查看 vim 的各个选项使用说明:vim -h 或 vim --help;查看 vim 的版本信息:vim -v 或 vim --version
一、基本使用流程
Linux 系统的命令终端中,经常会使用 vi 或者 vim 编辑器编辑文件,基本操作流程如下:
- 在命令终端输入
vim /etc/liaowenxiong.txt打开指定的文件,默认进入 vim 的“普通命令模式”(Normal Mode) - 在“普通命令模式”下输入
i进入编辑界面,也就是 vim 的“插入模式”(Insert Mode) - 编辑好之后按
Esc返回到 vim 的“普通命令模式” - 按冒号
:进入 vim 的“底行命令模式”(Last Line Command Mode or Ex Command Mode) - 输入
q!或者wq返回到命令终端(也叫控制器)
二、普通命令模式
normal mode.
vi/vim 的默认模式就是普通命令模式,启动 vi/vim 就进入普通命令模式,在插入模式和底行模式下按 Esc 回到普通命令模式,该模式下常用的命令如下:
(一)切换到插入模式(编辑/写入/输入)
| 命令 | 说明 |
|---|---|
i | 切换到插入模式,i在当前游标前(就是游标左边)插入字符 |
I | 在行首插入 |
a | 切换到插入模式,a在当前游标后(就是游标右边)插入字符 |
A | 在行末插入 |
o | 切换到插入模式,o在当前行后(就是当前行的下面)插入一个新行 |
O | 在当前行前(就是上面)插入一个新行 |
技巧:
假如我要一次性输入 30 个等号 =,可以在普通命令模式下,输入:30i=,就是先输入数量 30,接着按 i 切换到插入模式,接着输入 1 个等号 =,最后按 esc 返回普通命令模式,就成功插入 30 个等号 = 啦!这在插入分割线时非常有用哦~
(二)切换到可视模式(选择文本模式)
| 命令 | 说明 |
|---|---|
| v | 切换到按字选择文本的可视模式,所谓“可视”,就是被选中的字符会“高亮”显示 |
| V 或 Shift + v | 切换到按行选择文本的可视模式,按上下箭头来选择行 |
| Ctrl + v | 切换到按块选择文本的可视模式,按上下左右箭头来选择矩形区域。它选中屏幕上的一个矩形区域。以按下 Ctrl + v 的位置为一个角,光标所在位置为它的对角。 |
(三)切换至底行命令模式
| 命令 | 说明 |
|---|---|
: | 切换到底行模式,可以在最底一行输入命令 |
(四)替换/修改
1. 切换到替换模式
| 命令 | 说明 |
|---|---|
R | 按下大写的 R 键,屏幕左下角出现 --REPLACE--字样,说明你已经处于“替换模式”。此时输入字符可以连续替换光标及其后面的内容。注意:退格键(Backspace)在替换模式中被解释为:如果左边的内容被替换过,则恢复到原来的样子;如果没有被替换过,则光标向左移动。修改完毕后,按下 Esc 键回到“普通命令模式”。若新输入的字符数超过原有对应字符数,则多出部分就附加在后面。 |
#R | 若在命令 R 之前加上一个数字,例如 5R,则表示新输入的文本重复出现 5 次,但只取代一个被输入文本所覆盖的字符序列,当前行中未被覆盖的内容仍保留下来,只是位置相应右移。这个命令其实没有意义 |
2. 替换命令
| 命令 | 说明 |
|---|---|
r | r 命令用于替换光标所在位置的字符,具体操作是,先将光标移动到需要替换的字符处,按一下 r 键,然后输入新的字符,就完成了一次替换。再次替换需要再次按下 r 键才可以。注意,全程不会进入插入模式。其实整个操作还是在“普通命令模式”下完成的,所以这个命令并不算是切换到“替换模式”下 |
#r | 光标所在位置的字符起 # 个字符被 r 后所输入的新字符替换掉 |
3. 修改替换(删除旧的,输入新的)
文本内容的修改是指在编辑过程中,可以对文本中的某些字符,某些行进行修改,即用新输入的文本代替需要修改的老文本,它等于先用删除命令删除需要修改的内容,然后再利用插入命令插入新的内容。所以在使用修改命令后,vi/vim 进入到“插入模式”下,当输入完新的内容后,再按 Esc 回到“普通命令模式”。
| 命令 | 说明 |
|---|---|
s | 该命令表示用随后输入的文本替换当前游标所在的字符。如果只用一个新字符替换游标所在字符,则s命令与r命令功能类似,如sh与rh的作用都是将游标所在字符变为h。但二者也有区别,r命令是在命令模式下替换,而s命令的工作模式是先删掉游标所在字符后进入插入模式,在插入模式下输入文字完成替换。 |
#s | 以输入的文本替换光标之后 # 个字符,包含光标所在位置的字符。即用 s 后输入的文本替换从光标所在字符开始及其后的 #-1 个字符(共 # 个字符) |
S | 表示用新输入的文本内容替换光标当前行(整行,不管光标位于何列)。输入S后,光标所在行成为空行,切换到“插入模式”,光标停在行的开头 |
#S | 表示用新输入的文本替换光标所在行及其下面 #-1 行的文本内容。例如 3S,则表示有 3 行(包括光标当前行及其下面 2 行)要被 S 命令之后输入的正文所替换 |
cw | 输入该命令后,光标所在位置到词尾之间的字符被删除,并切换到“插入模式”,然后可以输入所需要的字符,输入完成之后按 Esc 回到“普通命令模式”,这样就完成了用所输入的内容替换光标位置至词尾的所有文本内容 |
c#w 或 #cw | 替换游标后面 # 个词,包含游标所在位置的词在内。例如:c6w,就会删除游标后 6 个词,同时切换到插入模式中,接着可以输入新的内容。什么意思呢?就是游标所在位置的词以及后面的 5 个词被删除了,然后切换到插入模式,接着输入的内容就相当于是替换掉被删的 6 个词的内容。 |
c#l 或 #cl | 修改(改写/替换)游标后的 # 个字母,包含游标所在位置的字符在内。 |
c3j | j 表示向下,表示将游标所在行和下面3行都删除,即游标所在行到往下数的第 3 行之间的文本删除,然后进入“插入模式” |
c3G | 输入c3G,游标所在行到第 3 行之间的文本删除,然后进入“插入模式”,注意是整个文档的第 3 行 |
c3k | k表示向上,表示将游标所在行和上面3行都删除,会进入“插入模式” |
c$ | 修改从游标当前位置开始到本行末尾范围内的内容,先删除旧内容,进入“插入模式”,再输入新内容完成修改替换 |
C | C命令和c$命令相同,可以修改从游标当前位置开始到行尾的内容。 |
#C | 当在命令C之前加上数字 # 时,表示可以修改指定行数的内容。例如,3C,表示把游标所在位置起之后(注意不是整行)直到下面两个整行的内容删除,替换成随后输入的内容 |
cc | 和 S 相同,修改游标所在行(不管游标处于该行的何列)的内容,即先删除光标所在行的文本内容成为空行,再进入“插入模式”,光标会跳到行首准备输入 |
#cc | 在cc之前加上数字 #,表示要从游标当前行算起,往后面数,一共修改 # 行的内容。例如,5cc 表示先删除游标所在行及其下面的 4 行,然后输入新的内容 |
#ch 或 c#h | 改写游标前 # 个字符,包含游标所在位置的字符在内 |
(五)互换位置
| 命令 | 说明 |
|---|---|
xp | 光标位置的字符和光标后面一个字符位置互换 |
(六)字符大小写切换
| 命令 | 说明 |
|---|---|
~ | 反转光标下字符的大小写 |
gu | 直接输入 gu 将游标所在行及其下一行的英文字母转成小写 |
gU | 直接输入 gU 将游标所在行及其下一行的英文字母转成大写 |
guG | 游标所在行到文档的最后 1 行的英文字母转成小写 |
gu0 或者 gu^ | 游标所在位置到行首的英文字母转成小写,不包含游标所在位置的字符 |
gu$ | 游标所在位置到行尾的英文字母转成小写 |
gU$ | 游标所在位置到行尾的英文字母转成大写 |
gu5k | 游标所在行及其上面 4 行中的英文字母转成小写,大写同理 |
gu5j | 游标所在行及其下面 4 行中的英文字母转成小写,大写同理 |
gu3l | 游标所在位置的字符及其右边的2个字符中的英文字母转成小写,大写同理 |
guH | 游标当前行至屏幕所显示文本的第 1 行的英文字母转成小写,大写同理 |
gUG | 游标所在行到文档的最后 1 行的英文字母转成大写 |
guL | 游标当前行至屏幕所显示文本的最后 1 行的英文字母转成小写,大写同理 |
总结:往左边的基本不包含游标所在位置的字符,而往右边的基本都会包含游标所在位置的字符
(七)选择文本
| 命令 | 说明 |
|---|---|
| ggvG | 按下 ggvG ,除了最后一行,选中剩余的全部文本,并进入可视模式下,选中的文本高亮显示 |
| ggVG | 按下 ggVG 才是真正的全选文本,并进入可视模式下,选中的文本高亮显示 |
(八)复制
Vim 的拷贝与大家预期的方式可能略有不同。拷贝命令不是大家料想的 c。因为 c 表示“修改”,已经被占用了。Vim 用拉取(yank)来表示拷贝,简写为 y。
| 命令 | 说明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
yw | 将游标所在位置的字符到词尾的字符复制到缓冲区中 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#yw 或 y#w | 复制游标所在位置的词及其后面的 #-1 个词到缓冲区 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
yy | 复制游标所在行到缓冲区,所谓的缓冲区就是剪贴板,或者叫寄存器 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
y0 | 从游标所在位置复制到行首 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
y$ | 从游标所在位置复制到行尾 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#yy | 例如:6yy表示拷贝从游标所在行往下数6行文字 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
yl | 复制游标后面的 1 个字符 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#yl 或 y#l | 复制游标所在位置及其后面 #-1个字符 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
yh | 复制游标前面的 1 个字符 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#yh 或 y#h | 复制游标所在位置及其前面 #-1个字符 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9,15 copy 16 或 9,15 co 16 或 9,15 t 16 | 将第 9 行至第 15 行的文本内容,复制到第 16 行的后面 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9,15 move 16 或 9,15 m 16 | 将第 9 行至第 15 行的文本内容,移动(剪切)到第 16 行的后面 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 t . | 把第 6 行复制到当前行下面 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 t | 同上,只是省略了 . | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
. t $ | 把当前行复制到文本末尾 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t $ | 同上 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
. m $ | 将当前行移动到文本末尾 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ggyG | 按下 ggyG 复制全部文本,注意:G 必须大写 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
y1G 或 ygg | 复制游标所在行及其上面的所有行 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
yG | 复制游标所在行及其下面的所有行 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
yaw | 复制游标所在位置的词 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
yiw | 复制游标所在位置的词,好像和 yaw 效果一样 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
yas | 复制游标所在位置的句子 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
yit | 复制游标所在位置的标签的内容。例如:,假设当前游标落在标签 |
