1.简介
vim 是 Linux 操作系统中最通用的全屏幕文本编辑器,是 vi 的增强版(vi iMproved),与 vi 完全兼容,且扩充了很多功能。
vim 编辑器支持编辑模式和命令模式,编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用 vim 编辑器就必须熟练掌握这两种模式的切换。默认情况下,打开 vim 后自动进入命令模式。从编辑模式切换到命令模式使用 ESC 键,从命令模式切换到编辑模式使用 A、a、O、o、I、i 键。
vim [OPTIONS] [FILE…]
vim [OPTIONS] –
vim [OPTIONS] -t TAG
vim [OPTIONS] -q [ERRORFILE]
[FILE…] 表示一系列使用 vim 编辑的文件,使用 :next 命令可以向前切换所编辑的文件,使用 — 可以向后切换。这是 vim 常用启动格式;
– :表示待编辑的文件从标准输入读取;
-t TAG :要编辑的文件和光标的初始位置取决于一个标签,一种 goto 标签。标签在标签文件中查找,与标签关联的文件成为当前文件并执行关联的命令。主要用于 C 程序,在这种情况下 TAG 可以是函数名,其结果是包含该函数的文件成为当前文件,并且光标位于函数的开头。参见: :help tag-commands ;
-q [ERRORFILE] :使用 quickFix 模式启动 vim,文件 ERRORFILE 将被读取并显示第一个错误。如果 ERRORFILE 省略,则默认为 AztecC.Err(Amiga 系统)或 errors.err(其它系统)。关于 quickFix 模式说明,可以使用 :help quickfix 查看。
+NUM
打开文件时光标跳转到由 NUM 指定的行首
+/PAT
打开文件时光标跳转到匹配的模式字符串 PAT
+, -c CMD
在完成对第一个文件的读取后,执行给出的指令
-b
以二进制模式打开文件,用于编辑二进制文件和可执行文件
-C
以兼容模式运行 vim,使 vim 的表现更像 vi,即使存在 .vimrc 文件
-d
以 diff 模式打开文件,当多个文件编辑时,显示文件差异部分
-e
进入 Ex 模式,即进入冒号开头的末行模式。ex是Unix编辑器
-E
进入增强 Ex 模式,就像执行命令 exim
-l
使用 lisp 模式,打开 lisp 和 showmatch
-m
取消写文件功能,重设 write 选项。你仍然可以修改缓冲内容,但是不可以写入文件
-M
关闭修改功能
-N
非兼容模式运行 vim,这会使 vim 表现的更好,但是可能会存在与 vi 不兼容的情况,即使存在 .vimrc 文件
-n
不使用 swap file,这可能会导致在 vim 意外崩溃的情况下无法恢复未保存的内容
-o [N]
以上下排列方式同时打开 N 个 vim 窗口,如果未指定 N ,则为每一个文件单独打开一个窗口
-O [N]
以左右下排列方式同时打开 N 个 vim 窗口,如果未指定 N ,则为每一个文件单独打开一个窗口
-R
以只读方式打开文件
-r
列出 swap file
-r FILE
以指定的交换文件来恢复崩溃的编辑会话。交换文件名后缀为.swp
-s
安静模式,与 -e 选项结合使用
-u VIMRC
使用指定的 vimrc 文件中的命令来初始化 vim,所有其它的初始化操作将被跳过。可以给定“NONE”来跳过所有的初始化
-U GVIMRC
使用指定的 gvimrc 文件中的命令来初始化 GUI,所有其它的 GUI 初始化操作将被跳过。可以给定 “NONE” 来跳过所有的 GUI 初始化
-V [N]
以冗余模式执行 vim,打印 vim 读取了哪些配置文件 vimrc。可选的数字 N 表示冗余级别,数值越大级别越高,取值范围是 0~10,默认是 10
-x
写文件时进行加密,会提示输入加密密钥
-h, — help
显示帮助信息并退出
–version
显示版本信息并退出
4.内置命令说明
vim 提供了丰富的内置命令,有些内置命令使用键盘组合键即可完成,有些内置命令则需要以冒号 : 开头输入。常用内置命令如下:
Ctrl+u:向下滚动半屏
Ctrl+d:向上滚动半屏
Ctrl+f:向下滚动一屏
Ctrl+b:向上滚动一屏
Ctrl+e:向下滚动一行
Ctrl+y:向上滚动一行
Enter:回车向下滚动一行
Esc:从编辑模式切换到命令模式
ZZ:命令模式下保存当前文件所做的修改后退出 vim
:[行号]:光标跳转到指定行的行首
:$:光标跳转到最后一行的行首
gg:跳转到首行;
G:跳转到尾行
Ctrl+g:显示总行数
x, X:删除一个字符或选中的内容。当删除一个字符时,x 删除光标后的,X 删除光标前的。删除即剪切
d:删除选中的文本,删除即剪切
D:删除从当前光标到光标所在行尾的全部字符。删除即剪切
dd:删除光标所在行的整行内容。删除即剪切
ndd:删除当前行及其后n-1行,n为一个数字。删除即剪切
y:复制选中的文本
y0:复制光标前一个字符到行首的内容
y$:复制光标后一个字符到行尾的内容
yh:复制光标前的1个字符
yl:复制光标后的1个字符
nyh:复制光标前的n个字符,比如4yh复制光标前的4个字符
nyl:复制光标后的n个字符,比如4yl复制光标后的4个字符
yy:复制光标所在的当前行
nyy:复制当前行以及其后n-1行,n为一个数字;
p:小写p,粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的下方
P:大写P,粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的上方;
/[字符串]:向后搜索,支持正则表达式。用于从当前光标所在位置开始向文件尾部查找指定字符串的内容,查找的字符串会被加亮显示。键入字符 n 跳转到下一个,N 跳转到前一个
?[字符串]:向前搜索,支持正则表达式。用于从当前光标所在位置开始向文件头部查找指定字符串的内容,查找的字符串会被加亮显示。键入字符 n 跳转到下一个,N 跳转到前一个
:a,bs/F/T:替换文本操作,将a到b行之间第一个F换成T字符串。其中, “:s/”表示进行替换操作。不指定a和b,则默认为当前行;如果b为$,表示替换到末行;如果是a,b为%,即:%s/F/T,表示从第一行替换至末行
:a,bs/F/T/g:替换文本操作,替换第a行到b行,每一行所有F为T。a,b的取值规则同上一条;
a:在当前字符后添加文本
A:在当前行末添加文本
i:在当前字符前插入文本
I:在当前行首插入文本
no:在当前行后面插入n个空行,n为具体的数值
nO:在当前行前面插入n个空行,n为具体的数值
:wq:执行存盘退出操作
:w:执行存盘操作
:w!:执行强制存盘操作
:q:执行退出操作
:q!:执行强制退出操作
:e [文件名]:打开并编辑指定名称的文件
:n:如果同时打开多个文件,则继续编辑下一个文件
:f:显示当前的文件名、文件总行数、光标所在行号占总行数的比例
: setnumber:在最左端显示行号
: setnonumber:在最左端不显示行号
jkhl或方向键:光标移动快捷键,分别为上下左右
u:撤销
ctrl+r:反向撤销
v+移动光标:使用v进行选择模式,移动光标可选择文本
w:word,右移一个单词,光标停留在单词首部
e:end,右移一个单词,光标停留单词的尾部
b:back,左移一个单词,光标停留在单词首部
^ 或 (:移至行头
$ 或 ):移至行尾
gd:高亮显示光标所在的单词
5.vim 需知 5.1 vim 的四大模式
众所周知,vim 里面最具特色的东西就是它可以切换模式,那什么是模式呢?可以简单的理解为在不同的模式下面按相同的键而得到不同的效果。比如 vim 在插入模式下面连按两次 d,那么就会在光标位置插入两个字母 d,如果在正常模式下面连按两次 d,那么光标所在当前行将会被删除。
既然说是 vim 的四大模式,那么 vim 到底有那四大模式呢?
正常模式(normal mode)
可视模式(visual mode)
插入模式(insert mode)
命令行模式(command-line mode)
正常模式(normal mode)
可视模式(visual mode)
插入模式(insert mode)
命令行模式(command-line mode)
用户可以通过按 ESC 在各个模式之间进行切换。关于 vim 的模式说明,可以打开 vim 后键入 :help mode 来查看。
正常模式 (command mode)
正常模式 (command mode)
不管用户处于何种模式,只要按一下 ESC 键,即可进入正常模式。启动 vim 命令默认情况下进入正常模式。
在正常模式下,用户可以输入各种合法的 vim 命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的 vim 命令,则 vim 在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是 vim 的合法命令,vim 会响铃报警。
可视模式(visual mode)
可视模式(visual mode)
可视模式简单来说就是选中一块编辑区域,然后在上面执行一些操作,比如删除,替换,改变大小写等。
在正常模式按下 v(逐个字符选择文本)、 V(逐行选择文本)、Ctrl+v(按照块的方式选择文本),可以进入可视模式。可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。
插入模式 (insert mode)
插入模式 (insert mode)
在正常模式下输入插入命令 i(insert)、附加命令 a (append)、打开命令 o(open)、修改命令 c(change)、取代命令 r(replace)或替换命令 s(substitute)都可以进入插入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,键入 ESC 键即可。
命令行模式 (command-line mode)
命令行模式 (command-line mode)
命令行模式又称为 ex 模式。ex 是 EXtended 的简称,是 Unix 系统上的纯文本编辑器。ex 命令可启动 vim,执行 ex 命令,并键入 visual 就可以进入 vim 的正常模式。
vim 和 ex 编辑器的功能是相同的,二者主要区别是用户界面。在 vim 中,命令通常是单个键,例如 i、a、o 等;而在 ex 中,命令是以按回车键结束的行。在正常模式下,用户按冒号即可进入命令行模式,此时 vim 会在显示窗口的最后一行显示一个冒号作为命令行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。命令执行完后,vim 自动回到正常模式。
5.2 vim 相关编码选项
文件的编码和显示是一个令人头痛的东西,真希望这个世界上只存在utf-8编码,那就没那么痛苦了。vim编码配置涉及4个选项,分别是encoding 、fileencoding、fileencodings和termencoding,四者对应的简写分别为enc、fenc、fencs和tenc。
(1)encoding
encoding是vim内部使用编码。vim运行时,其菜单、标签、以及各个缓冲区统一使用encoding作为字符编码。
(3)fileencodings
fileencodings用于vim在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。~/.vimrc里面fileencodings的设置一般为
setfileencodings=utf-8,gb18030,latin1
(4)termencoding
终端所使用的文本编码。这个选项的值用于告诉VIM终端使用了哪种文本编码用于文本输入和显示。如果该值为空,那么它被设置为encoding的值。
5.3 vim 读写文件时编码转换过程
(1)读文件
vim打开文件时,需要将磁盘文件内容载入缓存,并将缓存中的字符转为换终端编码,通过网络传输的方式,传输到终端进行显示。两个转换环节,有一个出错都会出现乱码。
fileencoding -> encoding -> termencoding
(2)写文件
通过终端编辑文件时,字符编码转换过程是vim读文件的逆过程。
termencoding -> encoding -> fileencoding
注意:使用vim读写文件时为避免出现乱码,至关重要的一点就是终端,比如SecureCRT或XShell的编码设置要与vim的termencoding设置相同,如果不同还是还是会出现乱码,尽管vim已经采用正确的编码格式解析了文件。比如将XShell设置为UTF-8。
6.vim 常见用法
(1)vim 查看文件编码
: setfileencoding
或者简写
: setfenc
可显示文件编码格式。这个命令有致命的缺点。原因是只有正常显示文件内容时,该命令显示的文件编码格式才是文件本身的编码格式。因为该命令显示的编码格式并不是文件本身的编码格式,而是当前打开该文件所使用的编码格式。因此,这个命令在网上的说明大都是不准确的,特此说明。
(2)修改编码类型
使用vim修改:
:set fileencoding=gbk
#或者
:set fenc=gbk
使用iconv来修改文件编码:
iconv -f encoding -t encoding inputfile
# 比如将一个GBK编码的文件转换成UTF-8编码
iconv -f GBK -t UTF-8 file1 -o file2UTF-8
iconv的参数说明:
-f, –from-code=名称,原始文本编码
-t, –to-code=名称,输出编码
-l, –list 列举所有已知的字符集
-c 从输出中忽略无效的字符
-o, –output=FILE,输出文件
-s, –silent,关闭警告
–verbose,打印进度信息
(3)vim 指定编码类型浏览文件
如果知道了文件的编码类型,可显示指定编码类型来解析文件,而不用vim去猜测文件的编码类型,事实上猜测的往往是错误。命令如下:
vim file_name -c “e ++enc=utf-8”
或者在使用 vim 打开文件之后,在末行模式使用如下命令:
:e ++enc=utf-8
(4)vim 新增空白行
新增一行空白,在命令行模式下输入 o。如果想添加三行的话,键入 3o ,如果想添加 n 行则键入 n 个 o。如果键入 3o 后立即退出插入模式的话,就可以添加三个空白行。如果输入一些内容再退出,可以添加三行相同的内容。
如果想在每一行执行相同的命令,在 vim 里可以用 :g 实现。一般的语法是:
:g/pattern/cmd
它表示在匹配 /pattern/ 这个正则表达式的行上执行 cmd 命令(也称冒号命令)。而 /^/ 这个表达式,用于匹配行首。因为任何一行都有行首,你的要求就很容易实现了:
:g/^/norm 3o
norm这个命令的意思是,把后面的参数看成是在普通模式下的按键,即命令模式下的按键。
(5)vim 高亮显示选中的单词
将光标移到需要高亮显示的单词上,在命令模式下输入gd,那么就可以将当前的单词在当前文本中全部高亮显示,如下图所示,高亮显示dwBeInvitedUinLen。
(6)vim 输入特殊字符
有三种方法,第一种是使用字符编码,第二种是使用二合字母(digraph),三是使用快捷键(Ctrl+字母)。
使用字符编码:
vim可以用字符编码插入任意字符,使用此功能可以方便地输入键盘上找不到的字符。使用步骤如下:
(1)编辑模式下按下Ctrl+v;
(2)如果是ASCII字符,则输入三位十进制ASCII码值,不足三位,前补0。比如输入大写字母A,则输入065;如果是Unicode字符,则输入“u+四位十六进制码值”。比如输入大写字母A,则输入u0041。
更多详情内容可参见vim的帮助文档,末行模式输入: h i_ctrl-v_digit 。
使用二合字母(digraph):
二合字母顾名思义,使用两个字母的组合来标识特殊字符。使用步骤如下:
(1)编辑模式下按下Ctrl+k;
(2)输入特殊字符对应的二合字母。可以使用 :dig 或 :h digraph-table 查看对应二合字母。比如回车符(Carriage Return) 的二合字母是CR。
Ctrl+字母:
在vim中,使用 :set list 显示所有字符时,经常会看到有 ^I、^M 等符号,代表的字符可以使用 :h digraph-table 查看,特殊字符列表如下:
在vim的编辑模式下,可使用“Ctrl+字母”进行输入,例如使用”Ctrl+i”或”Ctrl+I”可以输入字符 ^I (Tab),使用”Ctrl+m”或”Ctrl+M”可以输入字符 ^M (回车)。
(7)vim其它常见操作
#显示行号
:set number
# 取消行号
:set nonu
# 取消高亮显示查找后的字符串
:nohl
# 显示换行符
:set list
# 不显示换行符
:set nolist
7.小结
vim 仍有很多未知的东西等待我们去发现,如果 vim 使用过程中有问题,欢迎留言,一同探讨解决进步。
参考文献
[1] vim(1) manual
[2] Linux命令大全.vi命令
[3] VIM乱码原因与解决方案
[4] Vim如何插入特殊字符
[5] 让VIM彻底告别乱码
[6] vim复制字符
[7] CSDN.Vim技巧之四大模式_普通模式
[8] freecodecamp.Vim Editor Modes Explained