Linux ❉ Vim文本编辑器及其应用详解

一 介绍

很多人习惯将 Vim 称为 Vi,其实 Vim 是 Vi 的增强版(在 Vi 的基础上增加了正则表达式的查找、多窗口的编辑等功能),使用 Vim 进行程序开发会更加方便。

1 Vi和Vim的区别和联系

        Vi 编辑器是 Unix 系统最初的编辑器。它使用控制台图形模式来模拟文本编辑窗口,允许查看文件中的行、在文件中移动、插入、编辑和替换文本。尽管 Vi 可能是世界上复杂的编辑器(讨厌它的人是这么认为的),但其拥有的大量特性使其成为 Unix 管理员多年来的支柱性工具。

        在 GNU 项目中,程序员在将 Vi 编辑器移植到开源世界的同时,决定对其作一些改进。由于改进后的 Vi 不再是以前 Unix 中的那个原始的 Vi 编辑器了,开发人员也就将它重命名为“Vi improved”,也就是 Vim。Vim 是由 Vi 发展演变过程的文本编辑器,因其具有语法高亮显示、多视窗编辑、代码折叠、支持插件等功能,已成为众多 Linux 发行版本的标配

        可供选择的编辑器不止一种,例如 Vim、emacs、pico、nano 等,众多 Linux 发行版系统,通常都已经默认安装好了 vi 或 Vim 文本编辑器,Centos 也不例外,该系统就默认安装有 vi 文本编辑器,

推荐使用 Vim 文本编辑器的原因有很多,比如说:

  • 几乎所有的Linux 发行版都内嵌有 Vim 文本编辑器,而其他的编辑器则不一定存在;
  • 在使用 Linux 系统过程中,很多软件的编辑接口都会默认调用 Vim 文件编辑器,例如 crontab、Visudo、edquota等命令;(主要)
  • Vim具有编辑程序的能力,会主动利用不同的字体颜色辨别语法的正确性,方便程序设计;
  • 使用 Vim 文本编辑器,编辑速度会更快。

2 安装

        如果在命令行模式下输入“vim”,输出结果为“Command not found”,则表示此系统中未安装 Vim。CentOS 系统中,使用如下命令即可安装

yum -y install vim

当命令行中输入“Vim”显示如图 1 所示的画面时,视为 Vim 安装成功。

Vim 安装成功界面

3  Vim三种工作模式(命令模式、输入模式和编辑模式)详解

        使用 Vim 编辑文件时,存在 3 种工作模式,分别是命令模式、输入模式和编辑模式,这 3 种工作模式可随意切换

(1)命令模式

        使用 Vim 编辑文件时,默认处于命令模式。此模式下,可使用方向键(上、下、左、右键)或 k、j、h、i 移动光标的位置,还可以对文件内容进行复制、粘贴、替换、删除等操作。

Vim 处于命令状态

 命令详解见此icon-default.png?t=LBL2https://blog.csdn.net/wangjie72270/article/details/122470850

 

(2) 输入模式

        在输入模式下,Vim 可以对文件执行写操作,类似于在 Windows 系统的文档中输入内容。
        在命令模式状态下输入 i、I、a、A、o、O 等插入命令使 Vim 进行输入模式,当编辑文件完成后按 Esc 键即可返回命令模式。

快捷键功能描述
i在当前光标所在位置插入随后输入的文本,光标后的文本相应向右移动
I在光标所在行的行首插入随后输入的文本,行首是该行的第一个非空白字符,相当于光标移动到行首执行 i 命令
o在光标所在行的下面插入新的一行。光标停在空行首,等待输入文本
O在光标所在行的上面插入新的一行。光标停在空行的行首,等待输入文本
a在当前光标所在位置之后插入随后输入的文本
A在光标所在行的行尾插入随后输入的文本,相当于光标移动到行尾再执行a命令
 

 

Vim处于输入模式

(3)Vim 的编辑模式

        编辑模式用于对文件中的指定内容执行保存、查找或替换等操作。

        使 Vim 切换到编辑模式的方法是在命令模式状态下按“:”键,此时 Vim 窗口的左下方出现一个“:”符号,这是就可以输入相关指令进行操作了。 指令执行后 Vim 会自动返回命令模式。如想直接返回命令模式,按 Esc 即可。

Vim进行编辑模式

        经常不知道自己处于什么模式。不论是自己忘了,还是不小心切换了模式,都可以按一次 Esc 键返回命令模式。如果你多按几次 Esc 键后听到"嘀————"的声音,则代表已经处于命令模式了。

三 Vim基本操作

1 Vim 打开文件

# 在命令行模式下打开一个自己编写的文件 /test/vi.test
[root@itxdl ~]# vim /test/vi.test

        刚打开文件时 Vim 处于命令模式,此时文件的下方会显示文件的一些信息,包括文件的总行数和字符数,以及当前光标所在的位置等,此时可以使用插入命令进入输入模式对文件进行编辑

         除此之外,我们还可以利用下表中打开文件的命令格式,针对特定情形使用适当的打开方式,可以大大提高我们的效率。

 

Vi 使用的选项说 明
vim filename打开或新建一个文件,并将光标置于第一行的首部
vim -r filename恢复上次 vim 打开时崩溃的文件
vim -R filename把指定的文件以只读方式放入 Vim 编辑器中
vim + filename打开文件,并将光标置于最后一行的首部
vi +n filename打开文件,并将光标置于第 n 行的首部
vi +/pattern filename打幵文件,并将光标置于第一个与 pattern 匹配的位置
vi -c command filename在对文件进行编辑前,先执行指定的命令

2 使用 Vim 进行编辑

(1)Vim 插入文本

        从命令模式进入输入模式进行编辑,可以按下 I、i、O、o、A、a 等键来完成,使用不同的键,光标所处的位置不同

快捷键功能描述
i在当前光标所在位置插入随后输入的文本,光标后的文本相应向右移动
I在光标所在行的行首插入随后输入的文本,行首是该行的第一个非空白字符,相当于光标移动到行首执行 i 命令
o在光标所在行的下面插入新的一行。光标停在空行首,等待输入文本
O(大写)在光标所在行的上面插入新的一行。光标停在空行的行首,等待输入文本
a在当前光标所在位置之后插入随后输入的文本
A在光标所在行的行尾插入随后输入的文本,相当于光标移动到行尾再执行 a 命令

 (2)Vim 查找文本

快捷键功能描述
/abc从光标所在位置向前查找字符串 abc
/^abc查找以 abc 为行首的行
/abc$查找以 abc 为行尾的行
?abc从光标所在为主向后查找字符串 abc
n向同一方向重复上次的查找指令
N向相反方向重复上次的查找指定

示例

        在/etc/passwd.vi 文件中查找字符串 "root",则运行命令

        如果在文件中并没有找到所要查找的字符串,则在文件底部会出现 "Pattern not found" 提示

 

         在查找过程中需要注意的是,要查找的字符串是严格区分大小写的,如查找 "shenchao" 和 "ShenChao" 会得到不同的结果。

        如果想忽略大小写,则输入命令 ":set ic";调整回来输入":set noic"。

        如果在字符串中出现特殊符号,则需要加上转义字符 "\"。常见的特殊符号有 \、*、?、$ 等。如果出现这些字符,例如,要查找字符串 "10$",则需要在命令模式中输入 "/10\$"。

(2) Vim 替换文本

快捷键功能描述
r替换光标所在位置的字符
R从光标所在位置开始替换字符,其输入内容会覆盖掉后面等长的文本内容,按“Esc”可以结束
:s/a1/a2/g将当前光标所在行中的所有 a1 用 a2 替换
:n1,n2s/a1/a2/g将文件中 n1 到 n2 行中所有 a1 都用 a2 替换
:g/a1/a2/g将文件中所有的 a1 都用 a2 替换

示例

        要将某文件中所有的 "root" 替换为 "liudehua",则有两种输入命令,分别为:

:1, $s/root/liudehua/g

:%s/root/liudehua/g

        上述命令是在编辑模式下操作的,表示的是从第一行到最后一行,即全文查找 "root",然后替换成 "liudehua"。

如果刚才的命令变成 :10,20 s/root/liudehua/g,则只替换从第 10 行到第 20 行的 "root"。 

(3)  Vim删除文本

快捷键功能描述
x删除光标所在位置的字符
dd删除光标所在行
ndd删除当前行(包括此行)后 n 行文本
dG删除光标所在行一直到文件末尾的所有内容
D删除光标位置到行尾的内容
:a1,a2d函数从 a1 行到 a2 行的文本内容

 注意,被删除的内容并没有真正删除,都放在了剪贴板中。将光标移动到指定位置处,按下 "p" 键,就可以将刚才删除的内容又粘贴到此处。

(4)  Vim复制和粘贴文本

快捷键功能描述
p将剪贴板中的内容粘贴到光标后
P(大写)将剪贴板中的内容粘贴到光标前
y复制已选中的文本到剪贴板
yy将光标所在行复制到剪贴板,此命令前可以加数字 n,可复制多行
yw将光标位置的单词复制到剪贴板

(5) Vim其他常用快捷键

        某些情况下,可能需要把两行进行连接。比如说,下面的文件中有两行文本,现在需要将其合并成一行(实际上就是将两行间的换行符去掉)。可以直接在命令模式中按下 "J" 键,按下前后如图

如果不小心误删除了文件内容,则可以通过 "u" 键来撤销刚才执行的命令。如果要撤销刚才的多次操作,可以多按几次 "u" 键。

3 Vim 保存退出文本

        Vim 的保存和退出是在编辑模式中进行的

命令功能描述
:wq保存并退出 Vim 编辑器
:wq!保存并强制退出 Vim 编辑器
:q不保存就退出 Vim 编辑器
:q!不保存,且强制退出 Vim 编辑器
:w保存但是不退出 Vim 编辑器
:w!强制保存文本
:w filename另存到 filename 文件
x!保存文本,并退出 Vim 编辑器,更通用的一个 vim 命令
ZZ直接退出 Vim 编辑器

        需要注意的是,"w!" 和 "wq!" 等类似的指令,通常用于对文件没有写权限的时候(显示 readonly),但如果你是文件的所有者或者 root 用户,就可以强制执行。 

4 Vim撤销和恢复撤销快捷键

使用 Vim 编辑文件内容时,经常会有如下 2 种需求:

  • 对文件内容做了修改之后,却发现整个修改过程是错误或者没有必要的,想将文件恢复到修改之前的样子。
  • 将文件内容恢复之后,经过仔细考虑,又感觉还是刚才修改过的内容更好,想撤销之前做的恢复操作。

        基于这 2 种需求,Vim 编辑器提供了撤销和恢复撤销的命令。命令都必须在 Vim 编辑器处于命令模式时才能使用。

快捷键功能
u(小写)undo 的第 1 个字母,功能是撤销最近一次对文本做的修改操作。
Ctrl+RRedo 的第 1 个字母,功能是恢复最近一次所做的撤销操作。
U(大写)第一次会撤销对一行文本(光标所在行)做过的全部操作,第二次使用该命令会恢复对该行文本做过的所有操作。

5 Vim可视化模式

        带图形界面的操作系统中的文字编辑器,用户可以使用鼠标来选择要操作的文本,非常方便。在 Vim 编辑器中也有类似的功能,但不是通过鼠标,而是通过键盘来选择要操作的文本。

在 Vim 中,如果想选中目标文本,就需要调整 Vim 进入可视化模式

命令功能
v(小写)又称字符可视化模式,此模式下目标文本的选择是以字符为单位的,也就是说,该模式下要一个字符一个字符的选中要操作的文本。
V(大写)又称行可视化模式,此模式化目标文本的选择是以行为单位的,也就是说,该模式化可以一行一行的选中要操作的文本。
Ctrl+v(组合键)又称块可视化模式,该模式下可以选中文本中的一个矩形区域作为目标文本,以按下 Ctrl+v 位置作为矩形的一角,光标移动的终点位置作为它的对角。

        以字符可视化模式为例,Vim 成功进入该模式的标志是窗口底部出现 --VISUAL-- 标志

 

        相应地,进入行可视化模式的标志是图 2 标记处显示 --VISUAL LINE--;进入块可视化模式的标志是图 2 标记处显示 --VISUAL BLOCK--。

        当选中文本并做完相应操作(例如选中文件并按 p 键将其复制到剪贴板中)后,Vim 会自动从可视化模式转换为命令模式。当然,也可以再次按 v(或者 V、Ctrl+v)手动退出可视化模式。

        之前所学的在 Vim 命令模式下编辑文本的很多命令,在可视化模式下仍然可以使用。

 

命令功能
d删除选中的部分文本。
D删除选中部分所在的行,和 d 不同之处在于,即使选中文本中有些字符所在的行没有都选中,删除时也会一并删除。
y将选中部分复制到剪贴板中。
p(小写)将剪贴板中的内容粘贴到光标之后。
P(大写)将剪贴板中的内容粘贴到光标之前。
u(小写)将选中部分中的大写字符全部改为小写字符。
U(大写)将选中部分中的小写字符全部改为大写字符。
>将选中部分右移(缩进)一个 tab 键规定的长度(CentOS 6.x 中,一个tab键默认相当于 8 个空白字符的长度)。
<将选中部分左移一个 tab 键规定的长度(CentOS 6.x 中,一个tab键默认相当于 8 个空白字符的长度)。

6  Vim批量注释和自定义注释

# 使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。

# 连续行的注释其实可以用替换命令来完成。换句话说,在指定范围行加"#"注释,可以使用 ":起始行,终止行 s/^/#/g"
:1,10s/^/#/g
# 表示在第 1~10 行行首加"#"注释。"^"意为行首;"g"表示执行替换时不询问确认。
# 如果希望每行交互询问是否执行,则可将 "g" 改为 "c"。

# 取消连续行注释,则可以使用 ":起始行,终止行s/^#//g"
:1,10s/^#//g
# 意为将行首的"#"替换为空,即删除。
# 当然,使用语言不同,注释符号或想替换的内容不同,都可以采用此方法,灵活运用即可。

# 添加"//"注释要稍微麻烦一些,命令格式为 ":起始行,终止行 s/^/\/\//g"。例如:
:1,5s/^/\/\//g

# 表示在第 1~5 行行首加"//"注释,因为 "/" 前面需要加转义字符 "\",所以写出来比较奇特。

# 以上方法可以解决连续行的注释问题,如果是非连续的多行就不灵了,这时我们可以定义快捷键简化操作。格式如下:
:map 快捷键 执行命令

# 如定义快捷键 "Ctrl+P" 为在行首添加 "#" 注释,可以执行 ":map^P l#<Esc>"。
# 其中 "^P" 为定义快捷键 "Ctrl+P"。
# 注意:必须同时按 "Ctrl+V+P" 快捷键生成 "^P" 方可有效,
# 或先按 "Ctrl+V" 再按 "Ctrl+P" 也可以,直接输入 "^P" 是无效的。
# "l#<Esc>" 就是此快捷键要触发的动作
# "l" 为在光标所在行行首插入
# "#" 为要输入的字符
# "<Esc>" 表示退回命令模式。
# "<Esc>" 要逐个字符输入,不可直接按键盘上的 Esc 键。

# 设置成功后,直接在任意需要注释的行上按 "Ctrl+P" 快捷键,就会自动在行首加上 "#" 注释。
# 取消此快捷键定义,输入 ":unmap^P" 即可。

# 我们可以延伸一下,如果想取消文件行首的快捷键,则可以设置 ":map^B 0x",快捷键为 "Ctrl+B",
# "0" 表示跳到行首,"x" 表示删除光标所在处字符。

# 再如,有时我们写完脚本等文件,需要在末尾注释中加入自己的邮箱,则可以直接定义每次按快捷键 "Ctrl+E" 实现插入邮箱,
# 定义方法为 ":map^E asamlee@itxdl.net<Esc>"。
# 其中 "a" 表示在当前字符后插入,"samlee@itxdl.net" 为插入的邮箱,"<Esc>" 表示插入后返回命令模式。

所以,通过定义快捷键,我们可以把前面讲到的命令组合起来使用。

将快捷键对应的命令保存在 .vimrc 文件中,即可在每次使用 Vim 时自动调用,非常方便。

7  Vim显示行号

        命令模式下输入":set nu"即可显示每一行的行号

  1 root:x:0:0:root:/root:/bin/bash
  2 bin:x:1:1:bin:/bin:/sbin/nologin
  3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
  4 adm:x:3:4:adm:/var/adm:/sbin/nologin
  5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  6 sync:x:5:0:sync:/sbin:/bin/sync
  7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  8 halt:x:7:0:halt:/sbin:/sbin/halt
  9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
 10 operator:x:11:0:operator:/root:/sbin/nologin
 11 games:x:12:100:games:/usr/games:/sbin/nologin
 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
~                                                                                    
~                                                                                    
~                                                                                    
~                                                                                    
~                                                                                    
~                                                                                    
:set nu
# 如果想要取消行 号,则再次输入":set nonu"即可 

        如果希望每次打开文件都默认显示行号,则可以编辑 Vim 的配置文件。每次使用 Vim 打开文件时,Vim 都会到当前登录用户的宿主目录(用户配置文件所在地)中读取 .vimrc 文件,此文件可以对 Vim 进行一些默认配置设定。

        如果 .vimrc 文件存在,就先读取其中对 Vim 的设置;否则就采取默认配置。在默认情况下,用户宿主目录中是没有此文件的,需要在当前用户的宿主目录中手工建立,如"vim~/.vimrc","~"代表宿主目录,root 的宿主目录为 /root/,普通用户的宿主目录存放在 /home/ 目录下。可以直接使用 Vim 编辑生成此文件,并在此文件中添加一行"set nu",保存并退出.

三 不常用操作

1 Vim多窗口编辑

        在编辑文件时,有时需要参考另一个文件,如果在两个文件之间进行切换则比较麻烦。可以使用 Vim 同时打开两个文件,每个文件分别占用一个窗口。

        例如,在査看 /etc/passwd 时需要参考 /etc/shadow,有两种办法可以实现:

  1. 先使用 Vim 打开第一个文件,接着输入命 令 ":sp/etc/shadow" 水平切分窗口,然后按回车键;如果想垂直切分窗口则可以输入 ":vs/etc/shadow";
  2. 可以直接执行命令"vim -o 第一个文件名 第二个文件名",也就是 "vim-o /etc/passwd /etc/shadow"。

 

        切换到另一个文件窗口,可以按 "Ctrl+WW" 快捷键。

        如果想将一个文件的内容全部复制到另一个文件中,则可以输入命令 ":r 被复制的文件名",即可将导入文件的全部内容复制到当前光标所在行下面。

2 Vim中执行Linux命令

        Vim 编辑器不仅提供了大量的命令来方便和加快我们的文件编辑工作,在此编辑器中,我们还可以直接使用 Linux 命令来进一步提高文件编辑的效率,这就是 Vim 编辑器的所谓过滤功能。

        由于 Vim 编辑器中支持直接执行 Linux 命令,从而可以方便快捷地对文件完成以下操作:

  1. 将一个命令的输出结果存入正在编辑的文件;
  2. 将正在编辑的文件中的一些数据作为某个指定 Linux 命令的输入。
格式功能
:!命令直接运行一个 Linux 命令,运行完毕之后,即可返回到 Vim 中。
:w!命令将 Vim 中所有的文本内容作为指定命令的输入。但命令的执行结果不会写入到当前文件中。
:r!命令将命令执行的结果写入到当前 Vim 中,例如 :!ls 表示将 ls 的执行结果输入到 Vim 中。
:nr!命令其中 n 为数字,表示将命令的执行结果写入到 Vim 第 n 行的位置。例如,:3r!date 表示将 date 命令的执行结果写入到第 3 行文本处。
:n,m!命令其中 n 表示起始行号,m为结束行号,功能是将 Vim 中指定的部分文本作为某个命令的输入,同时将命令的输出也插入到当前指定的位置。
:n,m w!命令其中 n 表示起始行号,m为结束行号,其功能是 Vim 中指定的部分文本作为某个命令的输入,但命令的执行结果不会写入到文件中。
!!date向 Vim 中插入当前时间。

示例

        首先,新建一个test.txt 文件,并手动输入如下内容,并将光标移动至下一行开头

        在此基础上,按 Esc 令 Vim 返回到命令模式,再按下!!,这时在窗口的左下角会出现:.!的提示信息,这就表明我们可以输入 Linux 命令了。例如,我们输入 date 命令

        注意,窗口左下角的:.!表示操作文本的范围,其中 . 表示从光标所在行开始,! 表示后续会执行 Linux 命令,整体表示命令的执行结果将插入到光标所在行的位置,因此,如果光标所在位置处有数据,就会被命令的执行结果直接覆盖掉

tcpdump:x:72:72::/:/sbin/nologin
Thu Jan 13 13:01:59 CST 2022
~                                                                                    
~                                                                                    
~                                                                                    
~                                                                                    
~                                                                                    
~                                                                                    
:.!date   

        确认光标位置无误后,按 Enter(回车)键,这时会发现系统当前的日期和时间写到了文件中最后行的位置

        在此基础上,再向该文件中手动输入以下数据

tcpdump:x:72:72::/:/sbin/nologin
Thu Jan 13 13:01:59 CST 2022
1 Old Wang
2 CaiJi
3 XiXi

        输出完成之后,将光标调整至第 3 行第 1 个字符的位置,然后按 Esc 使 Vim 进行命令模式,并按下!}组合键,你会看到窗口的左下角出现:.,$!的提示信息

# 第一列为行号
  1 tcpdump:x:72:72::/:/sbin/nologin
  2 Thu Jan 13 13:01:59 CST 2022
  3 1 Old Wang
  4 2 CaiJi
  5 3 XiXi
                                                                                 
~                                                                                    
~                                                                                    
:.,$!    
# 在此基础上,我们使用 sort 命令对选中文本按照第 1 列进行降序排序
:.,$!sort -nr -k1
# 按 Enter(回车)键,可以看到,文件中的内容变成
  1 3 XiXi
  2 2 CaiJi 
  3 1 Old Wang
  4 Thu Jan 13 13:01:59 CST 2022
  5 tcpdump:x:72:72::/:/sbin/nologin
~                                      

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值