第五章 Vim文本编辑器及其应用
七、Linux Vim可视化模式及其用法
相信大家都使用过带图形界面的操作系统中的文字编辑器,用户可以使用鼠标来选择要操作的文本,非常方便。在 Vim 编辑器中也有类似的功能,但不是通过鼠标,而是通过键盘来选择要操作的文本。
在 Vim 中,如果想选中目标文本,就需要调整 Vim 进入可视化模式,如表 1 所示,通过在 Vim 命令模式下键入不同的键,可以进入不同的可视化模式。
命令 | 功能 |
---|---|
v(小写) | 又称字符可视化模式,此模式下目标文本的选择是以字符为单位的,也就是说,该模式下要一个字符一个字符的选中要操作的文本。 |
V(大写) | 又称行可视化模式,此模式化目标文本的选择是以行为单位的,也就是说,该模式化可以一行一行的选中要操作的文本。 |
Ctrl+v(组合键) | 又称块可视化模式,该模式下可以选中文本中的一个矩形区域作为目标文本,以按下 Ctrl+v 位置作为矩形的一角,光标移动的终点位置作为它的对角。 |
以字符可视化模式为例,Vim 成功进入该模式的标志是窗口底部出现 --VISUAL-- 标志,如图 2 所示。
图 2 Vim成功进入字符可视化模式
相应地,进入行可视化模式的标志是图 2 标记处显示 --VISUAL LINE--;进入块可视化模式的标志是图 2 标记处显示 --VISUAL BLOCK--。
需要注意的是,当选中文本并做完相应操作(例如选中文件并按 p 键将其复制到剪贴板中)后,Vim 会自动从可视化模式转换为命令模式。当然,也可以再次按 v(或者 V、Ctrl+v)手动退出可视化模式。
另外值得一提的是,之前所学的在 Vim 命令模式下编辑文本的很多命令,在可视化模式下仍然可以使用。表 3 中罗列出了常用的几个可以在可视化模式下使用的命令。
命令 | 功能 |
---|---|
d | 删除选中的部分文本。 |
D | 删除选中部分所在的行,和 d 不同之处在于,即使选中文本中有些字符所在的行没有都选中,删除时也会一并删除。 |
y | 将选中部分复制到剪贴板中。 |
p(小写) | 将剪贴板中的内容粘贴到光标之后。 |
P(大写) | 将剪贴板中的内容粘贴到光标之前。 |
u(小写) | 将选中部分中的大写字符全部改为小写字符。 |
U(大写) | 将选中部分中的小写字符全部改为大写字符。 |
> | 将选中部分右移(缩进)一个 tab 键规定的长度(CentOS 6.x 中,一个tab键默认相当于 8 个空白字符的长度)。 |
< | 将选中部分左移一个 tab 键规定的长度(CentOS 6.x 中,一个tab键默认相当于 8 个空白字符的长度)。 |
八、Vim多窗口编辑模式
在编辑文件时,有时需要参考另一个文件,如果在两个文件之间进行切换则比较麻烦。可以使用 Vim 同时打开两个文件,每个文件分别占用一个窗口。
例如,在査看 /etc/passwd 时需要参考 /etc/shadow,有两种办法可以实现:
- 先使用 Vim 打开第一个文件,接着输入命令 ":sp/etc/shadow" 水平切分窗口,然后按回车键;如果想垂直切分窗口则可以输入 ":vs/etc/shadow";
- 可以直接执行命令"vim -o 第一个文件名 第二个文件名",也就是 "vim-o /etc/passwd /etc/shadow"。
得到的结果如图 1 所示。
图 1 使用 Vim 打开多个窗口
切换到另一个文件窗口,可以按 "Ctrl+WW" 快捷键。
如果想将一个文件的内容全部复制到另一个文件中,则可以输入命令 ":r 被复制的文件名",即可将导入文件的全部内容复制到当前光标所在行下面。
九、Linux 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 时自动调用,非常方便。
十、Vim显示行号
在使用 Vim 进行编辑的过程中,经常会遇到需要同时对连续几行进行操作的情况,这时如果每行都有行号提示,就会非常方便。
在命令模式下输入":set nu"即可显示每一行的行号,如图 1 所示。
图 1 显示行号
如果想要取消行 号,则再次输入":set nonu"即可。
如果希望每次打开文件都默认显示行号,则可以编辑 Vim 的配置文件。每次使用 Vim 打开文件时,Vim 都会到当前登录用户的宿主目录(用户配置文件所在地)中读取 .vimrc 文件,此文件可以对 Vim 进行一些默认配置设定。
如果 .vimrc 文件存在,就先读取其中对 Vim 的设置;否则就采取默认配置。在默认情况下,用户宿主目录中是没有此文件的,需要在当前用户的宿主目录中手工建立,如"vim~/.vimrc","~"代表宿主目录,root 的宿主目录为 /root/,普通用户的宿主目录存放在 /home/ 目录下。可以直接使用 Vim 编辑生成此文件,并在此文件中添加一行"set nu",保存并退出,如图 2 所示。
图 2 .vimrc配置文件
之后此用户登录,每次 Vim 打开文件时,都会默认显示行号。常见的可以写入 .vimrc 文件中的设置参数如表 3 所示。
设置参数 | 含 义 |
---|---|
:set nu :set nonu | 设置与取消行号。 |
:syn on :syn off | 是否依据语法显示相关的颜色帮助。在Vim中修改相关的配置文件或Shell脚本文件 时(如前面示例的脚本/etc/init.d/sshd),默认会显示相应的颜色,用来帮助排错。如果觉得颜色产生了干扰,则可以取消此设置 |
set hlsearch set nohlsearch | 设置是否将査找的字符串高亮显示。默认是hlsearch高亮显示 |
set nobackup set backup | 是否保存自动备份文件。默认是nobackup不自动备份。如果设定了:set backup,则会产生“文件名〜”作为备份文件 |
set ruler set noruler | 设置是否显示右下角的状态栏。默认是ruler显示 |
set showmode set noshowmode | 设置是否在左下角显示如“一INSERT--”之类的状态栏。默认是showmode显示 |
设置参数实在太多了,这里只列举了常见的几个,可以使用":set all"命令査看所有的设置参数。这些设置参数都可以写入 .vimrc 配置文件中,让它们永久生效,也可在 Vim 中执行,让它们临时生效。
有关 .vimrc 配置文件,下节再进行详细讲解。
十一、Vim配置文件(.vimrc)详解
Vim 启动时,会根据配置文件(.vimrc)来设置 Vim,因此我们可以通过此文件来定制适合自己的 Vim。
Vim 配置文件分为系统配置文件和用户配置文件:
- 系统配置文件位于 Vim 的安装目录(默认路径为 /etc/.vimrc);
- 用户配置文件位于主目录 ~/.vimrc,即通过执行
vim ~/.vimrc
命令即可对此配置文件进行合理修改。通常情况下,Vim 用户配置文件需要自己手动创建。
注意,Vim 用户配置文件比系统配置文件的优先级高,换句话说,Vim 启动时,会优先读取 Vim 用户配置文件(位于主目录中的),所以我们只需要修改用户配置文件即可(不建议直接修改系统配置文件)。
Vim 提供的环境配置参数有很多,本节不一一列举,大家可以在 Vim 中输入“:set all”指令来查询,本节仅对常用的几个功能设置做详细介绍。
设置参数 | 功能描述 |
---|---|
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set encoding=utf-8 | 设置编码格式,encoding 选项用于缓存的文本、寄存器、Vim 脚本文件等;fileencoding 选项是 Vim 写入文件时采用的编码类型;termencoding 选项表示输出到终端时采用的编码类型。 |
set nu set number | nu 是 number 的缩写,所以上面两个配置命令是完全等效的,二选一即可。取消行号可使用 set nonu。 |
set cursorline | 突出显示当前行。 |
set mouse=a set selection=exclusive set selectmode=mouse,key | Vim 编辑器里默认是不启用鼠标的,通过此设置即可启动鼠标。 |
set autoindent | 设置自动缩进,即每行的缩进同上一节相同。 |
set tabstop=4 | 设置 Tab 键宽度为 4 个空格。 |
注意,表中各配置参数前面可以添加冒号(:),也可以省略,两种写法都可以。
通过以上方式,可以对用户配置文件(.vimrc)进行编辑,进而实现对 Vim 的永久自定义。
在 Vim 编辑模式中,通过 “:set nu” 命令也可以让 Vim 显示行号,但只是临时有效,下次使用 Vim 编辑文件还是不显示行号。而本节介绍的编辑配置文件设置 Vim 的方式,对 Vim 的设置是永久的。
十二、如何在Vim中执行Linux命令?
Vim 编辑器不仅提供了大量的命令来方便和加快我们的文件编辑工作,在此编辑器中,我们还可以直接使用 Linux 命令来进一步提高文件编辑的效率,这就是 Vim 编辑器的所谓过滤功能。
由于 Vim 编辑器中支持直接执行 Linux 命令,从而可以方便快捷地对文件完成以下操作:
- 将一个命令的输出结果存入正在编辑的文件;
- 将正在编辑的文件中的一些数据作为某个指定 Linux 命令的输入。
下面,通过一个简单的例子,来演示如何在 Vim 编辑器中执行 Linux 命令。
首先,我们新建一个 demo.txt 文件,并手动输入如下内容,并将光标移动至下一行开头:
http://c.biancheng.net
在此基础上,按 Esc 令 Vim 返回到命令模式,再按下!!
,这时在窗口的左下角会出现:.!
的提示信息,这就表明我们可以输入 Linux 命令了。例如,我们输入 date 命令,如图 1 所示:
图 1 向文件中输入命令的执行结果
注意,窗口左下角的:.!
表示操作文本的范围,其中 . 表示从光标所在行开始,! 表示后续会执行 Linux 命令,整体表示命令的执行结果将插入到光标所在行的位置,因此,如果光标所在位置处有数据,就会被命令的执行结果直接覆盖掉。
确认光标位置无误后,按 Enter(回车)键,这时会发现系统当前的日期和时间写到了 demo.txt 文件中第 2 行的位置:
http://c.biancheng.net
Tue Nov 12 07:20:49 PST 2017
在此基础上,再向该文件中手动输入以下数据:
http://c.biancheng.net
Tue Nov 12 07:20:49 PST 2017
1 C语言中文网
3 c.biancheng.net
2 Linux教程
输出完成之后,将光标调整至第 3 行第 1 个字符的位置,然后按 Esc 使 Vim 进行命令模式,并按下!}
组合键,你会看到窗口的左下角出现:.,$!
的提示信息,如图 2 所示。
图 2 Vim命令模式下按 !} 的提示信息
其中 . 表示光标所在的当前行,$ 表示文件最后一行,因此和之前不同,这次选取的是文件中第 3 行及之后的所有内容。
在此基础上,我们使用 sort 命令对选中文本按照第 1 列进行降序排序,执行命令如下:
:.,$!sort -nr -k1
有关 sort 命令的用法,由于不是本节重点,这里不再做过多讲解。
按 Enter(回车)键,可以看到,demo.txt 文件中的内容变成:
http://c.biancheng.net
Tue Nov 12 07:20:49 PST 2017
3 c.biancheng.net
2 Linux教程
1 C语言中文网
由此,通过将所选文件作为 sort 命令的输入,实现了对该部分文本的降序排序操作。
除此之外,表 3 罗列出了常用的几种 Vim 和 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 中插入当前时间。 |