介绍
概述
VI 是 Visual Interface 的缩写,VI 编辑器是所有 Unix 及 Linux 系统下标准的文本编辑器,对 Unix 及 Linux 系统的任何版本,VI 编辑器是完全相同的。
VIM 全称 VI IMproved,是 VI 的升级版,增加了一些功能,对 VI 命令是完全兼容的。在一些基本命令上两者应该是一样的。
三种模式
VI 编辑器有三种模式:命令模式(command mode)、插入模式(Insert mode)、底行模式(last line mode)。
使用命令(vi 文件名)打开一个文件的时候,默认是在命令模式下。命令模式下是不能直接编辑文本的,输入的字母会被当作命令执行。比如输入 i,是指要在当前光标前输入,并且切换到插入模式。在插入模式下可以进行文本的编辑。插入模式下按 ESC 可以返回命令模式。
在命令模式下,通过输入:(英文冒号)可以切换到底行模式,底行模式提供了很多 VIM 内置的命令行接口,可以做一些保存,字符替换等强大的操作,底行模式下输出命令以回车结束,如输入 :wq 再回车,表示保存并退出编辑,或者双击 Esc 返回命令模式。
插入模式和底行模式不能直接切换,要经由命令模式。

若发现 VIM 打开文件没有语法高亮着色则可执行
yum -y install vim-enhanced来安装其增强插件。
使用
打开文件
使用 VIM 编辑文件很简单,直接使用 VI [OPTION] [FILEPATH] 即可。
打开文件时还可以使用一些选项,如下:
+#:打开文件后让光标定位在第#行的行首;+/PATTERN:打开文件后让光标定位在第一个被PATTERN匹配到的行首;+:打开文件后让光标直接定位到最后一行行首。
模式转换
命令模式到插入模式
在命令模式下输入键入以下命令都可切换到插入模式,但它们的效果有所不同,如下:
i:在光标前进行插入;a:在光标后进行插入;o:在光标所在行下方打开新行插入;I:在光标所在行行首进行插入;A:在光标所在行行尾进行插入;O:在光标所在行上方打开新行插入;
插入模式到命令模式
直接敲击 ESC 键,一下不行敲两下。
命令模式到底行模式
直接键入 : 即可。
底行模式到命令模式
连续键入两次 ESC 键。
如果要想从插入模式切换到底行模式或从底行模式切换到插入模式,都需要先切换到命令模式再进行转换。
关闭或保存文件
关闭文件需要在底行模式下键入命令,可使用的命令如下:
:q:推出;:q!:强制退出,丢弃做出的修改;:wq:保存退出;:x:保存退出;:w [PATH]:PATH指的是一个文件路径。不指定PATH时,表示保存当前;指定PATH时,表示将当前文件复制一份到的PATH。
除了在底行模式下输入
:wq来保存退出,直接在命令模式下键入ZZ也可保存退出。
光标跳转
字符或行间跳转
要让光标在字符或行间跳转可在命令模式下键入以下字符:
h:向左移动 1 个字符;l:向右移动 1 个字符;j:移动到下一行;k:移动到上一行;
还可组合键入数字一次让光标移动多个字符或多行,如:
#h:往左边一次移动#个字符;#l:往右边一次移动#个字符;#j:往下一次移动#行;#k:往上一次移动#行;
单词间跳转
要让光标在单词间跳转可在命令模式下键入以下字符:
w:移动到下一个单词的词首;e:移动到下一个单词的词尾;b:移动到当前或上一个单词的词首;
还可组合键入数字一次让光标移动多个单词,如:
#w:往后一次移动到第#个单词的词首;#e:往后一次移动到第#个单词的词尾;#b:往前一次移动到第#个单词的词首;
行首和行尾跳转
要让光标在行首和行尾跳转可在命令模式下键入以下字符:
^:跳转至行首的第一个非空白字符;0:跳转至行首;$:跳转至行尾;
快速定位到某行
要让光标快速定位到某行可在命令模式下键入以下字符:
#G:快速定位到第#行;G:快速定位到最后 1 行;gg或1g:快速定位到第 1 行;
句间移动
要让光标在句间跳转可在命令模式下键入以下字符:
(:跳转到上一句第一个字符;):跳转到下一句第一个字符;
段落间移动
要让光标在段落间跳转可在命令模式下键入以下字符:
{:跳转到上一段落第一个字符;}:跳转到下一段落第一个字符;
编辑操作
字符编辑
要对字符进行编辑可在命令模式下键入以下字符:
x:删除光标处的字符;#x:删除光标后的#个字符;xp:交换光标处字符和后一个字符的位置;
删除内容
在命令模式下删除内容是大部分情况下是使用 d 字符来完成的,不过 d 需要和光标跳转的字符组合使用,如下:
d$:删除光标处到行尾的内容;d^:删除光标处到行首非空白字符的内容;d0:删除光标处到行首的内容;dw:删除光标处到下一个单词词首之间的内容;de:删除光标处到下一个单词词尾之间的内容;db:删除光标处到当前或上一个单词词首之间的内容;dd:删除光标所在行;D:将光标所在行置为空行;
上述操作还可以和数字组合使用,例如 3dd 则是删除包括光标所在行往后的 3 行。
复制内容(yank)
在命令模式下复制内容是通过 y 字符来复制指定内容到缓冲区,但它的使用和 d 字符及其相似,也需和光标跳转相关字符组合使用,如下:
y$:复制光标处到行尾的内容;y^:复制光标处到行首非空白字符的内容;y0:复制光标处到行首的内容;yw:复制光标处到下一个单词词首之间的内容;ye:复制光标处到下一个单词词尾之间的内容;yb:复制光标处到当前或上一个单词词首之间的内容;yy:复制光标所在整行内容;Y:复制光标所在整行内容;
上述操作还可以和数字组合使用,例如 3yy 则是复制包括光标所在行往后的 3 行。
粘贴内容(paste)
如果要粘贴缓冲区的内容,则可在命令模式下键入以下字符:
p:如果缓冲区中保存的为整行,则粘贴到当前光标所在行的下一行,否则粘贴在光标所在处后方;P:如果缓冲区中保存的为整行,则粘贴到当前光标所在行的上一行,否则粘贴在光标所在处前方;
在 VIM 的命令模式中,通过
d字符删除的内容也保存在缓冲区中,所以通过d字符删除的内容也可以使用以上方式粘贴。
改变内容(change)
在命令模式下的改变命令使用的字符为 c,它的使用也是类似 d 字符,需和光标跳转相关字符组合使用。
它的效果和 d 字符的删除效果相似,它的不同是执行后会自动从命令模式切换为插入模式,如下:
c$:删除光标处到行尾的内容并切换到插入模式;c^:删除光标处到行首非空白字符的内容并切换到插入模式;c0:删除光标处到行首的内容并切换到插入模式;cw:删除光标处到下一个单词词首之间的内容并切换到插入模式;ce:删除光标处到下一个单词词尾之间的内容并切换到插入模式;cb:删除光标处到当前或上一个单词词首之间的内容并切换到插入模式;cc:删除光标所在整行内容并切换到插入模式;C:与c$相同;
上述操作还可以和数字组合使用,例如 3cc 则是删除包括光标所在行往后的 3 行并切换到插入模式。
替换内容(replace)
在命令模式下还可替换字符,使用 r 字符完成,它可以将选定字符统一替换为指定字符。
如 rb 则是将光标所在处字符替换为 b ;3ra 的含义是将从光标所在处字符包括光标所在处字符往后的 3 个字符替换同一为 a。
撤销(undo)
在命令模式下的撤销操作使用 u 字符即可,还可通过 #u 来撤销之前的 # 次操作。
还可通过按下 CTRL + R 来撤销上一次的撤销,类似 Windows 下的 CTRL + Y 快捷键恢复。
上述的字符编辑(
x)、删除内容(d)、复制内容(y)、粘贴内容(p)、替换内容(r)这些操作在一次操作后都可使用.来重复上一次的操作。
可视化模式
可视化模式下我们可以移动光标选中光标指定区域内的内容,可视化模式在命令模式下通过 v 或 V 字符开启,区别如下:
v:开启可视化模式按字符选定,接着通过h、j、k、l字符移动光标时会选中开启可视化模式时光标处到移动后的光标停留处之间的内容。V:开启可视化模式按行选定,接着通过h、j、k、l字符移动光标时会选中开启可视化模式时光标处所在的整行到移动后的光标停留处所在整行及之间所有行。
可视化模式通常结合编辑命令使用,如选中后
d删除选中内容,通过y复制选中内容,通过c改变选中内容。
翻屏操作
VIM 中的翻屏操作有如下快捷键:
CTRL + F:向文件尾部翻一屏;CTRL + B:向文件首部翻一屏;CTRL + D:向文件尾部翻半屏;CTRL + U:向文件首部翻半屏;
末行模式
前面有说末行模式其实是 VIM 的内置命令行接口,它具有很多高级功能,下面都是末行模式下的操作。
地址定界
格式:
:#:具体定位到第#行;:#1,#2:表示第#1行到#2行结束;:#1,+#2:表示从第#1行起始到第#1行的后#2行结束;:.:当前行;:$:表示最后一行,如.,$-1表示从首行到倒数第 2 行;%:全文,相当于1,$;/PATTERN1/,/PATTERN2/:从第一次被PARRTERN1匹配到的起始,到第一次被PATTERN2匹配到的行结束;#,/PATTERN/:从第#行起始到第一次被PATTERN匹配到的行结束;.,/PATTERN/:从当前行起始到第一次被PATTERN匹配到的行结束;/PATTERN/,$:从第一次被PATTERN匹配到的行开始到最后一行结束;
使用方式:
地址定界通常用于删除、复制、另存为或插入指定区域内容,看如下示例:
:1,5d表示删除1-5行的内容;:1,2y表示复制1-2行的内容;:10,$w /tmp/vitest/tmp.txt则是保存从第10行到最后一行的内容到/tmp/vitest/tmp.txt文件;:$r /tmp/vitest/tmp.txt表示在最后一行后插入/tmp/vitest/tmp.txt中的内容;
查找
格式:
/PATTERN:从当前光标所在处向文件尾部查找被 PATTERN 匹配到的内容;
?PATTERN:从当前光标所在处向文件首部查找被 PATTERN 匹配到的内容;
查找到结果后,使用
n来跳转到与命令同方向的下一个结果处,使用N来跳转到与命令反方向的上一个结果处;
示例:
/\<r..t\>:查找文件中以r开头以t结尾长度为 4 的单词;
查找并替换
查找并替换的格式为 s/要查找的内容/替换为的内容/修饰符。
要查找的内容可使用模式,支持基本正则表达式;替换为的内容不能使用模式,但可以使用\1、\2、\n来进行后向引用,还可以使用&来引用查找到的整个内容;修饰符有几个取值,可组合使用。i表示忽略大小写;g表示全局替换,默认情况下,每一行只替换第一次被查找到的内容;c表示开启替换确认,在每一个替换操作执行之前会要求交互式的确认。
示例:
:.,$s/r\(..\)t/R\1T/g:表示从当前行开始,最后一行结束,替换所有以r开头t结尾的四位长度的单词的首尾字母为大写;:%s/linux/&er/g表示从全文中搜索linux将其替换为linuxer;:%s/\/etc\/fstab/\/var\/log/g表示从全文中搜索/etc/fstab将其替换为/var/log;’
其实查找替换中的分隔符 / 可以替换为任意字符,如::%s@/etc/fstab@/var/log@g 的效果其实是和上述第三个示例的效果是相同的,通常分隔符指定为 要查找的内容 和 替换为的内容 中未出现的字符,否则内容中需要使用 \对与分隔符相同的字符进行转义。
多文件模式
使用 vi 命令打开文件时可同时指定多个文件,格式为 vi [FILE1] [FILE2] [FILEn] ...,默认打开的是第一个参数对应的文件,打开多个文件后可在底行模式下使用一些额外的命令:
:next:切换到下一个文件;:prev:切换到上一个文件;:first:切换到第一个文件;:last:切换到最后一个文件;wall:保存所有文件;qall:关闭所有文件;wqall:关闭并保存所有文件;
窗口分割
多文件分割
使用 vi 命令打开多个文件时可使用 -o 或 -O 选项来指定窗口分割:
-o:水平分割;-O:垂直分割;
以窗口分割模式打开多个文件后,如果指定的是水平分割,可使用快捷键在窗口间进行切换:
- 使用
CTRL + W , UP切换到上面的窗口; - 使用
CTRL + W , DOWN切换到下一个窗口;
而如果指定的是垂直分割,则:
- 使用
CTRL + W , LEFT切换到左边窗口; - 使用
CTRL + W , RIGHT切换到右边窗口;
单文件分割
单文件分割指的是使用 vi 命令打开单个文件,对该文件进行分割,可直接使用快捷键实现:
- 使用
CTRL + W , S:水平分割; - 使用
CTRL + W , v:垂直分割;
定制VIM的工作特性
VIM 也有配置文件,各种工作特性都是配置在配置文件中的。而它的配置文件页分为两类:
- 全局配置文件:
/etc/vimrc; - 个人:
~/.vimrc;
用户家目录下默认不存在 ./vimrc 文件,需手动创建。其实也可以通过底行模式下的命令来定制 VIM,只是这种方式只对当前 VIM 进程有效,而配置文件中的配置则是永久有效。
常用工作特性的定制
行号:
set number,简写为set nu,用来显示行号;set nonumber,简写为set nonu,用来取消显示行号;
括号匹配:
set showmatch,简写为set sm,用来高亮显示匹配的括号;set noshowmatch,简写为set nosm,用来取消高亮匹配的括号;
自动缩进:
set autoindent,简写为set ai,用来启用自动缩进;set noautoindent,简写为set noai,用来禁用自动缩进;
高亮搜索结果:
set highlightserach,简写为set hlsearch,用来设置高亮显示搜索结果;set nohighlightsearch,简写为set nohlsearch,用来禁用高亮显示搜索结果;
语法高亮:
syntax on:启用语法高亮;syntax off:禁用语法高亮;
忽略字符大小写:
set ignorecase,简写set ic,用来设置忽略字符大小写;set noignorecase,简写set noic,用来设置不忽略字符大小写;
默认情况下不忽略字符大小写。
配置文件的编写
VIM 的配置文件编写很简单,以编写个人配置为例,设置忽略字符大小写并语法高亮则可编写 ~/.vimrc 配置文件内容如下:
set ic
syntax on
获取帮助
在底行模式下键入 :help 回车即可查看到 VIM 的帮助说明。
练习
1、赋值 /etc/grub2.cfg 至 /tmp/ 目录,用查找替换命令删除 /tmp/grub2.cfg 文件中所有行首的空白字符。
:%s/^[[:space:]]\+//g``
2、赋值 /etc/rc.d/init.d/functions 文件至 /tmp 目录,用查找替换命令为 /tmp/functions 的每行开头为空白字符的行的行首添加一个 # 号。
:%s/^[[:space:]]/#&
3、如何设置 VIM 中 TAB 键缩进为 4 个字符。
set tabstop=4
4、复制 /etc/rc.d/init.d/functions 文件至 /tmp 目录
- 替换该文件中的
/etc/sysconfig/init为/var/log; - 删除
/tmp/functioins文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号;
:%s@/etc/sysconfig/init@/var/log@g
:%s@^#\([[:space:]]\+\)@\1
评论区