Linux命令(34)——vi命令

时间:2023-01-21 14:10:01

1.简介

vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的增强版(vi iMproved),与vi编辑器完全兼容,而且实现了很多增强功能。 vi编辑器支持编辑模式和命令模式,编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用vi编辑器就必须熟练掌握着两种模式的切换。默认情况下,打开vi编辑器后自动进入命令模式。从编辑模式切换到命令模式使用”esc”键,从命令模式切换到编辑模式使用”A”、”a”、”O”、”o”、”I”、”i”键。

2.命令格式

vim [options] [file ..]
vim [options] -
vim [options] -t tag
vim [options] -q [errorfile]

file ..表示一系列使用vi编辑的文件,使用”:next”命令可以向前切换所编辑的文件,使用”–”可以向后切换。这个是常用vi启动格式;
-:表示待编辑的文件从标准输入读取;
-t [tag]:使vi打开编辑文件后,将光标定位到指定的tag;
-q [errorfile]:使用quickFix模式启动vi,文件[errorfile]将被读取并展示;关于quickFix模式说明,可以使用”:help quickfix”查看。

3.vi内置命令说明

vi编辑器提供了丰富的内置命令,有些内置命令使用键盘组合键即可完成,有些内置命令则需要以冒号”:”开头输入。常用内置命令如下:

Ctrl+u:向文件首翻半屏;
Ctrl+d:向文件尾翻半屏;
Ctrl+f:向文件尾翻一屏;
Ctrl+b:向文件首翻一屏;
Esc:从编辑模式切换到命令模式;
ZZ:命令模式下保存当前文件所做的修改后退出vi;
:[行号]:光标跳转到指定行的行首;
:$:光标跳转到最后一行的行首;
gg:跳转到首行;
G:跳转到尾行
Ctrl+g:显示总行数;
x或X:删除一个字符,x删除光标后的,而X删除光标前的。删除即剪切;
d:删除选中的文本,删除即剪切;
D:删除从当前光标到光标所在行尾的全部字符。删除即剪切;
dd:删除光标所在行的整行内容。删除即剪切;
ndd:删除当前行及其后n-1行,n为一个数字。删除即剪切;
y:复制选中的文本;
yy:复制光标所在的当前行;
nyy:复制当前行以及其后n-1行,n为一个数字;
p:小写p,粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的下方;
P:大写P,粘贴文本操作,用于将缓存区的内容粘贴到当前光标所在位置的上方;
/[字符串]:文本查找操作,用于从当前光标所在位置开始向文件尾部查找指定字符串的内容,查找的字符串会被加亮显示;
?[字符串]:文本查找操作,用于从当前光标所在位置开始向文件头部查找指定字符串的内容,查找的字符串会被加亮显示;
:a,bs/F/T:替换文本操作,用于在第a行到第b行之间,将每行第一个F字符串换成T字符串。其中,":s/"表示进行替换操作。不指定a和b,则默认为当前行;
: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:在命令模式下,执行退出vi操作;
:q!:在命令模式下,执行强制退出vi操作;
:e [文件名]:在命令模式下,打开并编辑指定名称的文件;
:n:在命令模式下,如果同时打开多个文件,则继续编辑下一个文件;
:f:在命令模式下,用于显示当前的文件名、光标所在行的行号以及显示比例;
:set number:在命令模式下,用于在最左端显示行号;
:set nonumber:在命令模式下,用于在最左端不显示行号;
jkhl或方向键:光标移动快捷键,分别为上下左右;
u:撤销;
v+移动光标:使用v进行选择模式,移动光标可选择文本;
w:word,右移一个单词,光标停留在单词首部;
e:end,右移一个单词,光标停留单词的尾部;
b:back,左移一个单词,光标停留在单词首部;
(或^:移至行头;
)或$:移至行尾;
gd:高亮显示光标所在的单词;

4.vi需知

4.1vi的三大模式

命令模式 (command mode/normal模式,普通模式):
任何时候,不管用户处于何种模式,只要按一下“ESC”键,即可使Vi进入命令模式;我们在shell环境(提示符为$)下输入启动Vi命令,进入编辑器时,也是处于该模式下。

在该模式下,用户可以输入各种合法的Vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令,Vi会响铃报警。

文本输入模式 (input mode/编辑模式):
在命令模式下输入插入命令i(insert)、附加命令a (append)、打开命令o(open)、修改命令c(change)、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按”ESC”键即可。

末行模式 (last line mode/指令行命令模式):
末行模式也称ex转义模式。
Vi和Ex编辑器的功能是相同的,二者主要区别是用户界面。在Vi中,命令通常是单个键,例如i、a、o等;而在Ex中,命令是以按回车键结束的正文行。Vi有一个专门的“转义”命令,可访问很多面向行的Ex命令。在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。

ex是EXtended的简称,是Unix系统上的纯文字编辑器。ex 命令可启动vi,执行ex命令,并键入visual就可以进入vi的命令模式。

5.常用示例

5.1.vim查看与设置文件编码类型

文件的编码和显示是一个令人头痛的东西,真希望这个世界上只存在utf-8编码,那就没那么痛苦了。vim编码配置里面有4个选项,分别是encoding 、fileencoding、fileencodings、和termencoding,四者对应的简写分别为enc、fenc、fencs和tenc。

其中fenc是当前文件的编码,也就是说,一个在vim里面已经正确显示了的文件(前提是你的系统环境跟你的enc设置匹配),你可以通过改变 fenc后再w来将此文件存成不同的编码。比如说,我:set fenc=utf-8然后:w就把文件存成utf-8的了,:set fenc=gb18030再:w就把文件存成gb18030的了。这个值对于打开文件的时候是否能够正确地解码没有任何关系。

fencs就是用来在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。比如我的vimrc里面这个的设置是

set fileencodings=utf-8,gb18030,utf-16,big5

所以我的vim每打开一个文件,先尝试用utf-8进行解码,如果用utf-8解码到了一半出错(所谓出错的意思是某个地方无法用utf-8正确地解码),那么就从头来用gb18030重新尝试解码,如果gb18030又出错(注意gb18030并不是像utf-8似的规则编码,所以所谓的出错只是说某个编码没有对应的有意义的字,比如0),就尝试用utf-16,仍然出错就尝试用big5。这一趟下来,如果中间的某次解码从头到尾都没有出错,那么 vim就认为这个文件是这个编码的,不会再进行后面的尝试了。这个时候,fenc的值就会被设为vim最后采用的编码值,可以用:set fenc?来查看具体是什么。

至于enc,其作用基本只是显示。不管最后的文件是什么编码,vim都会将其转换为当前系统编码来进行处理,这样才能在当前系统里面正确地显示出来,因此enc就是干这个的。在windows下面,enc默认是cp936,这也就是中文windows的默认编码,所以enc是不需要改的。在 linux下,随着你的系统locale可能设为zh_CN.gb18030或者zh_CN.utf-8,你的enc要对应的设为gb18030或者 utf-8(或者gbk之类的)

termencoding:终端所使用的文本编码选项。这个选项的值用于告诉VIM终端使用了哪种文本编码方式来用于文本输入和显示。如果该值为空,那么它被设置为enc的值。我的使用经验告诉我:tenc是用于告知VIM说终端是使用何种文本编码方式来作文本输入和显示的,也就是说,VIM需要理解你的键盘输入的文本是何种编码,也需要理解你的终端将用何种编码来显示文本,这样才能够正确的将文本输入到VIM中和显示在你的终端上。通常情况下,tenc的值和enc的值是等同的,除非你手工设置。

(1)查看文件编码

:set fileencoding
或者简写
:set fenc

可显示文件编码格式。这个命令有致命的缺点。原因是只有正常显示文件内容时,该命令显示的文件编码格式才是文件本身的编码格式。因为该命令显示的编码格式并不是文件本身的编码格式,而是当前打开该文件所使用的编码格式。因此,这个命令在网上的说明都是不准确的,特此说明。

vim在linux下默认是以utf-8来编码文件和解析文件的,当使用vim来打开ucs2编码的文件时,会出现乱码,此时使用set fileencoding显示的是utf-8编码,而不是ucs2编码,读者可自行验证。

网上有人说如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在
~/.vimrc 文件中添加以下内容:

set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936,latin-1
或者简写:
set enc=utf-8
set fencs=ucs-bom,utf-8,cp936,latin-1

本人亲自尝试 ,并不可行。vim会以fileencodings后面第一个指明的编码方式来打开utf-8编码的文件,并没有去按顺序寻找合适的编码方式来解析文件。

(2)修改编码类型

: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 file_name -c "e ++enc=ucs2"

或者在使用vim打开文件之后,在末行模式使用如下命令:

:e ++enc=ucs2

#或者,不改变文件编码类型
:set encoding=ucs2

注意: 如果终端,比如SecureCRT或者XSell不支持ucs2编码的话,那么还是会出现乱码,尽管vim已经采用正确的编码格式解析了ucs2的文件。

5.2vi下新增空白行

vi或者vim命令新增一行空白,在命令行模式下输入o。如果想添加三行的话,是 3o或者n个o。如果 3o 后立即退出插入模式的话,就可以添加三个空白行。如果输入一些文字再退出,可以添加三个相同文字的行。试一下就知道了。

如果想在每一行执行相同的命令,在 vim 里可以用 :g 实现。一般的语法是:

:g/pattern/cmd

它表示在匹配 /pattern/ 这个正则表达式的行上执行 cmd 命令(也称冒号命令)。而 /^/ 这个表达式,用于匹配行首。因为任何一行都有行首,你的要求就很容易实现了:

:g/^/norm 3o

norm这个命令的意思是,把后面的参数看成是在普通模式下的按键,即命令模式下的按键。

5.3vi中高亮显示选中的单词

将光标移到需要高亮显示的单词上,在命令模式下输入gd,那么就可以将当前的单词在当前文本中全部高亮显示,如下图所示,高亮显示dwBeInvitedUinLen。

Linux命令(34)——vi命令

5.4vi其它常见操作

#显示行号
:set number

#取消行号
:set nonu

#取消高亮显示查找后的字符串
:nohl

#显示换行符
:set list

#不显示换行符
:set nolist

参考文献

[1]man vi
[2][Linux命令大全.vi命令]http://man.linuxde.net/vi
[3]VIM乱码原因与解决方案