第六章 Vim编辑器

1 简介

Vim是一个高度可配置的文本编辑器,旨在高效的创建和更改任何类型的文本。运维必须掌握vim编辑器的操作。

Vim非常稳定,并且正在不断开发以变得更好。

它的特点包括:

  • 持久的、多级撤消树
  • 广泛的插件系统
  • 支持数百种编程语言和文件格式
  • 强大的搜索和替换
  • 与许多工具集成

2 安装vim

在Centos7环境下,安装vim命令如下:

  1. root@localhost-110:~# yum install vim -y

3 Vim初体验

3.1 Vim的三种常见模式

982752-20180808103844589-246174763.png

VIM常用的有三个模式:

  • 编辑模式:默认模式,可以实现移动光标,剪切/黏贴文本
  • 插入模式:用于修改文本
  • 末行模式:保存、退出等

3.1.1 末行模式

默认模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一些组合键就是 vim 的功能键,而不会在文本中键入对应的字符。

在这个模式下,我们可以通过键盘在文本中快速移动光标,光标范围从小到大是字符、单词、行、句子、段落和屏幕。启动 VIM 后默认位于默认模式。不论是什么模式,按一下 <Esc>键 ( 有时可能需要按两下,插入模式按一下 Esc ,就会切换到默认模式,末行模式或者可视模式下执行完操作以后,就会自动进入默认模式,如果进入末行模式或者可视模式没有执行任何操作,按两下 Esc 即可 )都会进入默认模式。

下面的三个模式都是过键盘上相应的键位去触发的。

3.1.2 插入模式

在默认模式中按下个别字母键(后面会详细介绍),会进入插入模式。

例如按 i 键会进行插入模式。该模式启动以后,就会进入编辑状态,通过键盘输入内容。

3.1.3 末行模式

在模式模式中,按下(冒号)键或者/ (斜杠),会进入末行模式。在末行模式中可以执行一些输入并执行一些 VIM 或插件提供的指令,就像在shell里一样。这些指令包括设置环境、文件操作、调用某个功能等等。

3.1.4 可视模式

在默认模式按下v, V, <Ctrl>+v,可以进入可视模式。可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。

以上是关于 VIM 四种模式的解读,我们在使用 VIM 操作文本的时候,编辑区底部一般都会显示当前处于什么模式下(插入模式会有 INSERT 提示,可视模式会有 VISUAL 或者 VISUAL LINE 的提示)。

当对 VIM 有了感觉之后 ,个人认为 VIM 只有两个模式,便于理解(纯个人见解,用熟 VIM 以后,应该会赞同这个理解):

  • 操作模式
  • 编辑模式

一个好的编辑器我们无非就使用它的两个功能:

1、通过一些快捷键操作编辑器实现我们的功能:复制,黏贴,删除,查询。。。等

2、我们用来编辑,输入内容进入编辑器。

VIM 有一个很重要的按键需要一开始就做出说明,那就是键盘中的 ,这个按键用来切换模式,该按键可以快速切换到末行模式。

3.2 用Vim打开文件

  1. #1、打开一个文件
  2. vim file1
  3. #2、打开多个文件
  4. vim file1 file2
  5. #该方式打开文件,显示屏默认显示第一个文件也就是 file1,如何进行文件间的切换呢?VIM 的模式模式下(参考上文关于模式模式的描述)按下键盘上的冒号 :这时会在显示屏底部出现冒号 :(进入了 VIM 的末行模式),然后在输入 ls ,屏幕上会出现打开的所有文件的序号和文件名,我们继续输入冒号 : ,然后输入 bn (这里的 n需要做一个解释并不是键盘上的 n ,而是文件序号的代指,如 b1 代表显示屏上切换到第一个文件,b2 代表显示屏上切换到第二个文件)。
  6. :ls #这个命令会列出VIM打开的所有文件
  7. :b2 #上面的这个命令将会在显示屏上显示第二个文件
  8. #3、如何在显示屏上一次性显示多个文件呢
  9. VIM 可以实现分屏操作,一个屏幕被多个文件给分占,有左右和上下两种分屏的方式。
  10. 左右分屏如下操作:
  11. vim -on file1 file2...filen
  12. 这里的n表示具体文件的数目,表示有几个文件需要分屏,从左至右依次显示n个文件

3.3 分屏操作

3.3.1 Vim如何分屏

  1. #请记住一个重要的组合键 Ctrl + w ,操作分屏离不开这个组合键(这里的组合键可没有 + ,只是 Ctrl 和 w 组合实现一个动能,下文谈到的组合健都这样描述 )。
  2. 1、按住组合键 Ctrl + w ,然后在按下 s
  3. Ctrl + w s
  4. 上面这个命令将会上下分割当前打开的文件。
  5. 2、按住冒号:,紧接着输入 sp ,在键入文件名,如下:
  6. :sp file
  7. 上面的这个命令将会上下分割当前文件和新打开的 file
  8. 3、按住组合键 Ctrl + w ,然后在按下 v
  9. Ctrl +w v
  10. 上面的这个命令将会左右分割当前的文件
  11. 4、按住冒号 :,紧接着输入 vsp ,在键入文件名称,如下:
  12. :vsp file
  13. 上面的这个命令将会左右分割当前打开的文件和新打开的文件 file

3.3.2 分屏以后如何在文件间切换光标和移动分屏

  1. 1.切换左右分屏的光标
  2. Ctrl + w h
  3. 将当前光标定位到左边的屏幕
  4. Ctrl + w l
  5. 将当前的光标定位到右边的屏幕
  6. 2.移动左右分屏
  7. Ctrl + w H
  8. 将当前的分屏移动到左边
  9. Ctrl + w L
  10. 将当前的分屏移动到右边
  11. 3.切换上下分屏的光标
  12. Ctrl + w j
  13. 将当前的光标移动到下面的分屏
  14. Ctrl + w k
  15. 将当前光标移动到上面的分屏
  16. 4.移动上下分屏:
  17. Ctrl + w J
  18. 将当前的分屏移动到下面的分屏
  19. Ctrl + w K
  20. 将当前的分屏移动到上面的分屏
  21. #其实以上切换分屏按键,用Ctrl+w就可以进行上下切换和左右切换

3.3.3 关闭分屏

  1. 1Ctrl + w c
  2. 上面这个命令是关闭当前的分屏
  3. 2Ctrl + w q
  4. 上面的这个命令也是关闭当前的分屏,如果是最后一个分屏将会退出 VIM

3.4 Vim的输入模式

编辑器的主要功能就是输入文本,编辑文本,很多编辑器在打开文件的时候就可以通过键盘录入文字,但是 VIM 有稍许的不同,刚刚接触 VIM 的时候是很难对 VIM 进行编辑操作的,记得我在刚接触它的时候是很崩溃的(千万个草泥马在内心奔腾),但是你接触久了,了解的多了,也就理解如此设计的美妙之处。

3.4.1 使用Vim编辑文本

这里有必要再强调一下,在使用 VIM 打开文件的时候,这时候的状态是默认模式(Normal-mode),请务必记住这个模式,如果你不确定当前是否处在模式模式,请按一下键盘上的 ESC ,VIM 处理编辑文本需要从模式模式(Normal)切换到插入模式(Insert-mode),进入插入模式的时候你应该会在屏幕底部看到 INSERT 的提示,这时候就可以编辑文本了。

3.4.2 如何从默认模式进入插入模式

  1. i是在光标所在的字符之前插入需要录入的文本。
  2. I 是在光标所在行的行首插入需要录入的文本。
  3. a 是在光标所在的字符之后插入需要录入的文本。
  4. A 是在光标所在行的行尾插入需要录入的文本。
  5. o 是光标所在行的下一行行首插入需要录入的文本。
  6. O 是光标所在行的上一行行首插入需要录入的文本。
  7. s 删除光标所在处的字符然后插入需要录入的文本。
  8. S 删除光标所在行,在当前行的行首开始插入需要录入的文本。

3.5 Vim的末行模式

3.5.1 末行模式基本命令

  1. 1、:w
  2. 保存当前对文件的修改,但是不退出文件。
  3. 2、:w!
  4. 强制保存但是不退出文件。
  5. 3、:w file
  6. 保存当前的文件修改到 file 文件当中。
  7. 4、:q!
  8. 退出文件,对文件的修改不做保存。
  9. 5、:qa!
  10. 退出所有的文件,对所有的文件修改都不做保存。
  11. 6、:wq
  12. 退出文件并保存对文件的修改。
  13. 7、:x
  14. 退出文件并保存对文件的修改。
  15. 8、:X
  16. 加密文件
  17. 9、:r file
  18. 读文件内容到当前文件中
  19. 10、:!command
  20. 执行命令
  21. 11、:r!command
  22. 读入当前目录的结果,写入到vim打开的文件中
  23. 以上的命令都是在命令行模式下的操作(也就是输入冒号 :紧接着输入相应的字符命令如 :q! 就会执行退出操作)。 zempty 在这里要推荐一个常用的操作就是 ZZ , 当你对文件进行了修改,需要保存退出,那么可以在键盘上快速的键入两个大写的 Z (ZZ),这样文件就会快速的保存退出了

3.5.2 关键字的查找

  1. /{目标字符串}
  2. 如:/zempty 会在文本中匹配 zempty 的地方高亮。
  3. 查找文本中匹配的目标字符串,查到以后,输入键盘上的 n 会去寻找下一个匹配,N 会去寻找上一个匹配。

3.5.3 处理大小写的区分

  1. :set ic
  2. 编辑器将不会区分大小写,如果你进行该设置之后,进行关键字查询如 /zempty 如果文本中有 Zempty ,zEmpty,....,只要是字符相同不会区分大小写都会进行匹配。
  3. :set noic
  4. 该命令用来区分大小写的查询。

3.5.4 删除多行文本

  1. :n1,n2d
  2. n1 n2 指的是起始行号和结束行号,d 是删除关键字

3.5.5 处理文本的替换

  1. :{作用范围}s/{目标}/{替换}/{替换的标志}
  2. 作用范围分为当前行、全文、选区等等。
  3. :s/zempty/handsome/g
  4. 将会把当前光标所在行的 zempty 替换成 handsome
  5. :%s/zempty/handsome/g
  6. 将会把全文中的 zempty 替换成 handsome
  7. 下面来谈谈替换的标志。
  8. 上文中命令结尾的 g 即是替换标志之一,表示全局 global 替换(即替换目标的所有出现)。 还有很多其他有用的替换标志:
  9. 空替换标志表示只替换从光标位置开始,目标的第一次出现
  10. :s/zempty/handsome
  11. 作用于当前行,从光标处开始查找替换,仅仅替换第一次匹配 zempty 的地方为handsome
  12. :%s/zempty/handsome
  13. 替换掉文件中所有行第一次出现 zempty 的地方为 handsome
  14. i 表示大小写不敏感查找,I 表示大小写敏感:
  15. :%s/zempty/handsome/i
  16. 替换掉所有行第一个出现 zempty (不区分大小写) handsome
  17. :%s/zempty/handsome/gi
  18. 替换掉所有行出现 zempty (不区分大小写) handsome
  19. gc 表示需要确认,例如全局查找"zempty"替换为"handsome"并且需要确认:
  20. :%s/zempty/handsome/gc

3.5.6 定制Vim的工作特性

末行模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存

  1. #配置文件:
  2. /etc/vimrc #全局
  3. ~/.vimrc #个人
  4. #行号
  5. 显示:set number 简写:set nu
  6. 取消显示:set nonumber 简写:set nonu
  7. #忽略字符的大小写
  8. 启用:set ignorecase 简写:set ic
  9. 不忽略:set noic
  10. #自动缩进
  11. 启用:set autoindent 简写set ai
  12. 禁用:set noai
  13. #复制保留格式
  14. 启用:set paste
  15. 禁用:set nopaste
  16. #显示tab和换行符
  17. 启用:set list
  18. 禁用:set nolist
  19. #高亮搜索
  20. 启用:set hlsearch
  21. 禁用:set nohlsearch 简写:nohl
  22. #语法高亮
  23. 启用:syntax on
  24. 禁用:syntax off
  25. #文件格式
  26. 启用windows格式:set ff=dos
  27. 启用unix格式:set ff=unix

3.6 Vim的默认模式

VIM 默认模式下,主要进行的操作有光标的移动,复制文本,删除文本,黏贴文本等。

3.6.1 快速移动光标

请记住这几个快捷键 h,j,k,l 这几个按键主要是用来快速移动光标的,h 是向左移动光标,l 是向右移动光标,j 是向下移动光标,k 是向上移动光标,h , j , k ,l 在主键盘区完全可以取代键盘上的 ↑ ,↓ ,← , → 的功能。

3.6.2 在当前行上移动光标

  1. 0 移动到行头
  2. ^ 移动到本行的第一个不是 blank 字符
  3. $ 移动到行尾
  4. g_ 移动到本行最后一个不是 blank 字符的位置
  5. w 光标移动到下一个单词的开头
  6. e 光标移动到下一个单词的结尾
  7. fa 移动到本行下一个为 a 的字符处,fb 移动到下一个为 b 的字符处
  8. nfa 移动到本行光标处开始的第 n 字符为 a 的地方(n 1234 ... 数字)
  9. Fa fa 一样,光标移动方向同 fa 相反
  10. nFa nfa 类似,光标移动方向同 nfa相反
  11. ta 移动光标至 a 字符的前一个字符
  12. nta 移动到第二个 a 字符的前一个字符处
  13. Ta ta 移动光标方向相反
  14. nTa nta 移动光标方向相反
  15. ; 和, 当使用 f, F, t ,T, 关键字指定字符跳转的时候,使用 ;可以快速跳转到写一个指定的字符,, 是跳到前一个指定的字符

3.6.3 跨行移动光标

  1. nG 光标定位到第 n 行的行首
  2. gg 光标定位到第一行的行首
  3. G 光标定位到最后一行的行首
  4. H 光标定位到当前屏幕的第一行行首
  5. M 光标移动到当前屏幕的中间
  6. L 光标移动到当前屏幕的尾部
  7. zt 把当前行移动到当前屏幕的最上方,也就是第一行
  8. zz 把当前行移动到当前屏幕的中间
  9. zb 把当前行移动到当前屏幕的尾部
  10. % 匹配括号移动,包括 ( , { , [ 需要把光标先移动到括号上
  11. * # 匹配光标当前所在的单词,移动光标到下一个(或者上一个)匹配的单词( * 是下一个,# 是上一个)

3.6.4 翻页操作

  1. ctrl+f 查看下一页内容
  2. ctrl+b 查看上一页内容

3.6.5 复制、黏贴、删除

  1. #删除
  2. d 是删除的意思,通常搭配一个字符 ( 删除范围 ) 实现删除功能,常用的如下:
  3. dw 删除一个单词
  4. dnw 删除 n 个单词,
  5. dfa 删除光标处到下一个 a 的字符处( fa 定位光标到 a
  6. dnfa 删除光标处到第 n a 的字符处
  7. dd 删除一整行
  8. ndd 删除光标处开始的 n
  9. d$ 删除光标到本行的结尾
  10. dH 删除屏幕显示的第一行文本到光标所在的行
  11. dG 删除光标所在行到文本的结束
  12. #复制
  13. y 是复制的意思,通常搭配一个字符(复制范围)实现复制的功能,常用的如下:
  14. yw 复制一个单词,还有 ynw
  15. yfa 复制光标到下一个 a 的字符处,还有ynfa
  16. yy 复制一行,还有 nyy
  17. y$ 复制光标到本号的结尾
  18. yH 复制屏幕显示的第一行文本到光标所在的行
  19. yG 复制光标所在行到文本的结束
  20. #黏贴
  21. p P是黏贴的意思,当执行完复制或者黏贴的命令以后,VIM 会把文本寄存起来。
  22. p 在光标后开始黏贴
  23. P 大写的 P 光标前开始粘贴

3.6.6 撤销操作和恢复

  1. u 撤销刚才的操作
  2. ctrl + r 恢复撤销操作

3.6.7 删除字符操作和替换

  1. x 删除光标当前所在的字符
  2. r 替换掉光标当前所在的字符
  3. R 替换掉从光标开始以后的所有字符,除非 <ESC > 退出

3.6.8 大小写转换

  1. ~ 将光标下的字母改变大小写
  2. 3~ 将光标位置开始的3个字母改变其大小写
  3. g~~ 改变当前行字母的大小写
  4. gUU 将当前行的字母改成大写
  5. guu 将当前行的字母全改成小写
  6. 3gUU 将从光标开始到下面3行字母改成大写
  7. gUw 将光标下的单词改成大写。
  8. guw 将光标下的单词改成小写

3.7 可视化模式

在末行有”— VISUAL —“提示,表示在可视化模式下。

如何进入可视化模式呢?

  • v:面向字符 — VISUAL —
  • V:面向整行 — VISUAL LINE —
  • ctrl+v 面向块,— VISUAL BLOCK —

image-20220512201640763.png

image-20220512201711613.png

3.8 Vim大图总结

image.png