本篇介绍vim程序编辑器,内容皆总结摘抄自《鸟哥的Linux私房菜:基础学习篇》,仅作笔记。
Linux中有各种各样的文本编辑器,但我们对vim编辑器却是必须要掌握的,理由如下:
- 所有的类UNIX系统都会内置vi文本编辑器,而其他的文本编辑器则不一定会有;
- 很多软件的编辑接口都会主动调用vi;
- vim具有程序编辑的能力,可以主动地以字体颜色辨别语法的正确性,方便程序设计;
- 程序简单,编辑速度相当快速。
上面实际上提到了两个编辑器vi和vim,vim比vi高级的地方主要在于可以私用颜色或下划线的方式来显示一些特殊的信息。vim不仅是一个文本编辑器,更是一个程序开发工具,它可以根据文件的扩展名或文件内的开头信息判断该文件的内容而自动调用该程序的语法来判断样式,再以颜色来区分程序代码和一般信息。
vi编辑器
要熟悉vim编辑器,首先要来熟悉下它的文本编辑器版本-vi编辑器。vi分为三种模式:一般命令模式、编辑模式和命令行模式。下面对这三种模式以及三种模式下可以使用的功能做简单的介绍。
- 一般命令模式
使用vi命令打开一个文件进入的默认模式就是一般命令模式,如下:
在vi环境中包含两部分的内容,分别是文件内容(图中的文字部分)以及状态显示行或者命令执行行(图中最后一行)。上图中的最后一行就是状态显示行,表示现在打开的文件名称是test,文件内容有14行584个字符。在一般命令模式的环境中我们可以移动光标、复制粘贴、删除以及查找替换,但是不能编辑。可用的按键以及说明如下表(不同的Linux发行版可能会有些差异):
按键 | 功能 |
---|---|
ctrl + f | 向下移动一页,相当于Page Down |
ctrl + b | 向上移动一页,相当于Page Up |
ctrl + d | 向下移动半页 |
ctrl + u | 向上移动半页 |
+ | 光标移动到非空格符的下一行 |
- | 光标移动到非空格符的上一行 |
number + space键 | 先按某个数字再按空格键,光标会向后移动n个字符 |
0或home键 | 移动到这一行的最前面字符处 |
$或end | 移动到这一行的最后面字符处 |
H | 光标移动到屏幕最上方那一行的第一个字符 |
M | 光标移动到屏幕中央那一行的第一个字符 |
L | 光标移动到最下方那一行的第一个字符 |
number + G | 移动到这个文件的第number行 |
gg | 移动到这个文件的第一行 |
number + Enter键 | 光标向下移动n行 |
/word | 在光标处向下查找名称为word的字符串 |
?word | 在光标处向上查找名称为word的字符串 |
n | 重复前一个查找,例如刚刚执行了/word命令来向下查找word字符串,输入n则再次向下查找word字符串 |
N | 反向执行前一个查找操作,例如刚刚执行过/word向下查找word字符串,输入N则向上再次查找word字符串 |
:number1,number2s/word1/word2/g | 在number1和number2行之间寻找word这个字符串并将该字符串替换为word2 |
:1,$s/word1/word2/g | 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2 |
:1,$s/word1/word2/gc | 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2,且在替换前显示提示字符给用户确认是否需要替换 |
x | 向后删除一个字符 |
X | 向前删除一个字符 |
number + x | 连续向后删除number个字符,例如连续删除10个字符的命令为:10x |
dd | 删除光标在的那一整行 |
number + dd | 删除光标所在的向下number行 |
d1G | 删除光标所在到第一行的所有数据 |
dG | 删除光标所在到最后一行的所有数据 |
d$ | 删除光标所在到该行的最后一个字符 |
d0 | 删除光标所在到该行的最前面一个字符 |
yy | 复制光标所在的那一行 |
number + yy | 复制光标所在的向下number行 |
y1G | 复制光标所在行到第一行的所有数据 |
yG | 复制光标所在行到最后一行的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有数据 |
y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
p | 将已复制的数据在光标下一行粘贴 |
P | 将已复制的数据在光标上一行粘贴 |
J | 将光标所在行与下一行的数据结合成一行 |
u | 恢复前一个操作 |
ctrl + e | 重做上一个操作 |
.(小数点) | 重复前一个操作 |
- 编辑模式
一般命令模式可以进行删除、复制、粘贴等操作,但不能编辑文件的内容。要想编辑文件内容需要进入编辑模式才行,在一般命令模式下可以使用以下按键进入编辑模式:
按键 | 说明 |
---|---|
i | 进入插入模式,在目前光标所在处插入 |
I | 进入插入模式,在目前所在行的第一个非空格符处开始插入 |
a | 进入插入模式,从目前光标所在的下一个字符处开始插入 |
A | 进入插入模式,从光标所在行的最后一个字符处开始插入 |
o | 进入插入模式,在目前光标所在的下一行处插入新的一行 |
O | 进入插入模式,在目前光标所在处 |
r | 进入替换模式,将光标所在的字符替换一次 |
R | 进入替换模式,每替换一次光标会向后移动一个字符,一直替换光标所在的字符 |
在一般命令模式输入以上按键后,状态行会显示“--INSERT--”或“--REPLACE--”来表示当前进入插入模式或替换模式。进入插入模式或替换模式后只能使用ESC键来退出,并不能使用上面提到的按键来直接切换模式。例如在一般命令模式使用a进入插入模式,此时不能使用r进入替换模式,此时的r被当作字符“r”使用,只能先使用ESC退出插入模式再使用r才能进入替换模式。
- 命令行模式
在一般命令模式和编辑模式编辑的文件并不会自动保存,这取决于我们在命令行模式输入的保存或者退出的命令。命令行模式可以使用的命令以及说明如下表:
按键 | 功能 |
---|---|
:w | 将编辑的数据写入硬盘文件 |
:w! | 若文件属性为只读时,强制写入该文件,但最终是否能写入与文件权限有关 |
:q | 退出vi环境 |
:q! | 修改过文件但不想保存可使用此命令强制退出且不保存 |
:wq | 保存后退出,也可使用:wq! |
ZZ | 若文件没有修改则不保存退出;若文件被修改过,则保存退出 |
:w 文件名 | 将编辑的数据保存成另一个文件 |
:r 文件名 | 将指定文件的文件内容加到光标所在行的后面 |
:n1,n2 w 文件名 | 将n1到n2行的内容保存为指定文件名的文件 |
:! command | 暂时退出vi环境到命令行模式下执行command命令 |
:set nu | 在每行的前缀显示该行的行号 |
:set nonu | 与set nu相反,取消显示行号 |
vim编辑器
之前提到过可以将vim看作vi的升级版,在需要Linux发行版中也使用vim替换了vi。例如上面的例子中笔者虽然使用vi来打开test文件,实际上却是使用的vim编辑器。既然是升级版,vim除了vi的功能外还扩展了许多新的功能,下面简单介绍下vim的额外功能。
- vim的缓存和恢复
我们使用vim编辑文件时,vim会在被编辑的文件的目录下再建立一个名为“.在编辑文件名.swp”的文件,对编辑文件的修改会被记录到该文件中。在系统因为某些原因而宕机的时候,这个以swp为后缀的文件可以帮助我们恢复编辑文件。事实上,当我们打开一个由于宕机而导致vim中断的文件时,程序会报错并提醒我们有缓存文件存在,并且在最后一行命令行提示我们可以做的操作以及对应的说明。例如笔者之前在阿里云服务器使用vim编辑test文件,后来由于登陆信息过期导致vim被强制中断,再次使用vim打开test文件时出现下面提示:
此时类似git冲突的情况,因此此时所做的操作是较为重要的,主要操作以及说明如下表:
按键 | 功能 |
---|---|
Open Read-Only | 用只读的方式打开此文件 |
Edit anyway | 用正常的方式打开编辑的文件,但不会加载缓存的内容 |
Recover | 加载缓存的内容,即加载之前因为宕机未保存的工作,但保存并退出vim后需要手动删除缓存文件,否则还是会出现提示 |
Delete it | 在打开文件前将文件缓存删除 |
Quit | 退出vim环境 |
Abort | 忽略此编辑操作,退出vim环境 |
- 可视区块(Visual Block)
可视区块就是指我们可以选中文件中的某个区块内容而不是某个字符或某行来进行操作,并且被选中区块的内容是可视化的。可视化区块可使用的按键以及说明如下表:
按键 | 说明 |
---|---|
v | 字符选择,将光标经过的地方进行反白选择 |
V | 行选择,将光标经过的行进行反白选择 |
ctrl + v | 可视区块,可以用矩形的方式选择数据。注:但是笔者使用此组合键完全无效,猜测是发行版不同所导致 |
d | 将反白的地方删除掉 |
y | 将反白的地方复制 |
p | 将复制的区块在光标所在处粘贴 |
使用上述选择命令时最后一行状态行会显示“--VISUAL--”或“--VISUAL LINE--”表示进入可视化模式,此时反白选择区块内容后屏幕如下图:
- 多文件编辑
有时我们需要同时编辑几个文件,例如将某个文件的部分内容复制到其他几个文件,这时我们可以使用vim同时打开多个文件。例如我们可以使用vim test test1同时打开test和test1文件,进入到vim环境后屏幕显示仍然与打开一个文件相同,此时我们可以使用以下命令:
按键 | 说明 |
---|---|
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出目前此vim开启的所有文件 |
:n和:N可以帮助我们切换编辑的文件,使用:files查看打开的文件列表。
- 多窗口功能
多文件编辑功能只能让我们同时编辑多个文件,不能让我们同时查看各个文件。例如我们想比对三个配置文件的差别的场景,使用多文件编辑功能就无法满足,这时我们可以使用多窗口功能。顾名思义,多窗口功能就是在一个屏幕一个vim中开启多个窗口,这多个窗口可以是同一个文件也可以是不同的文件。多窗口功能相关按键以及说明如下表:
按键 | 说明 |
---|---|
:sp [文件名] | 如果没有文件名参数,则在新窗口中同步打开已打开的文件;如果有文件名参数,则在新窗口中打开指定的文件 |
ctrl + w + j ctrl + w + ↓ | 移动到下方的窗口(笔者直接使用浏览器远程连接服务器,ctrl + w快捷键会把当前网页关闭,因此此按键没有尝试) |
ctrl + w + k ctrl + w + ↑ | 移动到上面的窗口 |
ctrl + w + q | 关闭所在的窗口 |
例如下图中打开了两个test文件的窗口和一个test1文件的窗口,需要注意的是多个窗口打开同一文件时显示的内容是同步的。