linux vi或vim文本编辑器基础总结

一、vi或vim编辑器概述

  vim是兼容系统自待vi文本编辑器的文本编辑器。vim在vi的基础上做了一些增强:多级撤销(multi level undo),多窗口和多缓冲(multi windows and buffers),语法高亮(syntax highlighting),命令行编辑(command line editing),在线帮助(on-line help),可视化选择(visual selection)等。看看vim的一些基本选项介绍:
 

+[num]:打开文件,并把光标定位到第num行的行首;默认不加num,直接打开文件,会定位到上次光标
所在行的行首(不管上次光标所在行,光标位置相对行首字符偏移了多少,打开都会在行首);
+/{pat}:通过一个模式,让光标跳转至第一次匹配pat部分的行的行首;例如vim +/UUID /etc/fstab会把光标
指向UUID第一次匹配行的行首;
+{command}:指定文本在读入后执行的命令,如果命令包含空格,应该使用双引号来引起来,当然这种行为
取决于本地使用的shell类型,例如:vim "+set si" /tmp/fstab,执行多个命令,例如vim "+set si nu nohls" 
/tmp/fstab,命令数量只能有10个,没有验证;
-c {command}:与上面的类似。去掉了符号+,例如:vim -c "set si nu nohls" /tmp/fstab命令数量只能有10个,
没有验证;
-r {file}:以可恢复的模式打开文本,打开文本,同级目录下会生成以.swap结尾的临时文件".filename.swap"
默认就是以这种方式打开文件的;
-n:打开文件没有以".swap"即为的临时文件生成,如果编辑文件出现故障,数据会丢失;
-R:以只读模式打开文本;
-r:查看vim打开的临时文件;
-L:和-r选项一样;
-v:以vi模式启动vim;就好像直接利用vi 一样;
-o[N]:横向多窗口打开文件;如果省略N表示,每个文件只有一个窗口显示;
-O[N]:纵向多窗口打开文件;如果省略N表示,每个文件只有一个窗口显示;

PS:更多关于多窗口操作文本,会在下文引入;

  有一张比较经典的图,我们来看一下:
linux vi或vim文本编辑器基础总结

图片引用出处:http://www.runoob.com/linux/linux-vim.html

 

  另外一张:
linux vi或vim文本编辑器基础总结

基础相关名词术语:

  • forward(前进,简称f)
  • backward(向后,简称b)
  • delete(删除,简称d)
  • insert(插入,简称i)
  • append(追加,简称a)
  • change(改变,简称c)
  • yank(复制,也可以叫copy,简称y)
  • paste(粘贴,简称p)
  • undo(取消,简称u)
  • word(单词,简称w)
  • end(结尾,简称e)
  • sentence(句子,简称s)
  • paragraph(段落)
  • Normol Mode:普通模式
  • Command Mode:命令模式,与普通模式同义;
  • Insert Mode:插入模式
  • VIsual Mode:可视模式
  • Last Line Mode:末行模式

 

二、vim的三种模式介绍

在线帮助文档(分类):
http://vimdoc.sourceforge.net/htmldoc/usr_toc.html
http://vimcdoc.sourceforge.net/doc/help.html
http://vim.wikia.com/wiki/Vim_Tips_Wiki

 

  vi或vim可以有三种基本模式,它们分别是:命令模式(也叫普通模式,Normal Mode),插入模式(Insert Mode),末行模式(其实准确来说不算一种模式,不过有时候转换需要,而且该模式下有很多高级特性可以体现)。

  除了基础模式之外,vim还有一种高级的模式叫可视模式(Visual Mode);让我们来看看常见模式之间的相互转换:
 
linux vi或vim文本编辑器基础总结

linux vi或vim文本编辑器基础总结
 

  • i命令(小写字母i):从命令模式转为插入模式,并且可以在光标标记字符前插入内容;
  • I命令(大写字母I):从命令模式转为插入模式,并且可以在光标标记的行的行首第一个非空白字符处插入内容;
  • a命令:从命令模式转为插入模式,并且可以在光标标记字符的后边插入内容;
  • A命令:从命令模式转为插入模式,并且可以在光标标记行的行尾处插入内容;
  • o命令:从命令模式转为插入模式,并且在光标所在行后面新开一行,可以进行内容的插入;
  • O命令:从命令模式转为插入模式,并且在光标所在行上新开一行,可以进行内容的插入;

 

三、vim对文件的操作

3.1、打开单个文件

直接使用以下语法结构:
vim [OPTIONS] [FILENAME]

3.2、退出、写保存或另存为

 

说明 操作模式 直接操作字符串命令
不强制退出 末行模式 :q
强制退出 末行模式 :q!
非强制写保存 末行模式 :w
强制写保存 末行模式 :w!
保存退出 末行模式 :wq
强制写保存退出 末行模式 :wq!
写保存退出或直接退出 普通(命令)模式 ZZ
写保存退出或直接退出 末行模式 :x
保存文本后另存为当前文本内容至另一个文件 末行模式 :w /PATH/TO/SOMEDIR/FILENAME
强制保存文本后另存为当前文本内容至另一个文件 末行模式 :w! /PATH/TO/SOMEDIR/FILENAME
保存文本并另存文本后退出 末行模式 :wq /PATH/TO/SOMEDIR/FILENAME
强制保存文本并另存文本后退出 末行模式 :wq! /PATH/TO/SOMEDIR/FILENAME

 

3.3、打开多个文件

直接使用以下语法结构:
vim [OPTIONS] [FILE1 FILE2... ]

如果不加任何选项,默认操作多个文件,打开,整个窗口只会显示单个文件的内容,如果要切换,切换如下:
:next 表示切换下一个文本,如果是最后一个文本会切换失败;
:prev 表示切换上一个文本,如果是第一个文本会切换失败;
:first 表示切换到第一个文本;
:last 表示切换到最后一个文本;

如果要多个窗口显示打开多个文件,可以使用-o或者-O选项,选项后边可以接一个数字。
比如我打开三个文件,可以这样做:
vim -o test1 test2 test3
vim -o3 test1 test2 test3
vim -O test1 test2 test3
vim -O3 test1 test2 test3

-o表示水平分割窗口显示多个文件;
-O表示垂直分割窗口显示多个文件;
如果选项后边跟上一个数字num,如果打开文件数量小于数字num,则多余的数字会打开一个空文件的窗口显示;
如果打开文件数量小于数字num,则只会按照打开文件命令行传入顺序,显示多个窗口,余下文件没有窗口
显示的会不在当前切割的窗口;只有当打开文件数量等于数字num(省略num也一样)时,所有文件都会以指定
分割方式多窗口显示在当前屏幕。
在多窗口显示中,如何切光标到不同的窗口呢:
Ctrl+w,{h|j|k|l}     
前边组合键"Ctrl+w"输入后松开,马上输入字符h,j,k,l ,h表示向左切换光标所在窗口,j表示下切换光标所在
窗口,k表示向上切换光标所在窗口,l表示向右切换光标所在窗口。下面的方向键同理。

或
Ctrl+w,{方向键上|方向键下|方向键左|方向键右}

不管是左右切换窗口,还是上下切换窗口,是根据实际情况来的,比如你是垂直分割窗口,就只存在
左右切换(如果光标在第一个窗口,就不能向左切换,也切换不了,同理在最后一个窗口,不能
向右切换窗口。),如果你是水平分割窗口,就只存在上下切换(如果光标在第一个窗口,就不能
向上切换,也切换不了, 同理在最后一个窗口,不能向下切换窗口。)

3.4、关闭多个文件

关闭多个文件,在关闭单个文件的基础上,很简单,直接加一个all后缀即可,例如:
:qall    退出所有的文件;
:qall!   强制退出所有的文件;
:wall   保存所有的文件;
:w!all  强制写所有的文件;
:wqall 保存退出所有的文件;
:wq!all 强制保存退出所有的文件;

3.5、多个文件之间切换

:next 表示切换下一个文本,如果是最后一个文本会切换失败;
:prev 表示切换上一个文本,如果是第一个文本会切换失败;
:first 表示切换到第一个文本;
:last 表示切换到最后一个文本

3.6、单文件多窗口显示

vim打开当个文件后,可以使用快捷组合键 "Ctrl +w"松开后,输入字母s或字母v来切割多窗口显示,每个窗口
中文本的内容都是相同的。然后可以利用之前讲解过的窗口切换组合键来进行切换,完成多个文件的编辑或者
其他相关操作。退出方式可以使用上面讲到过的多文件关闭。
"Ctrl+w,s":横向多窗口切割显示单个文本,所有窗口文本内容一样;
"Ctrl+w,v":纵向多窗口切割显示单个文本,所有窗口文本内容一样;

3.7、文本中光标移动

3.7.1、字符间跳转

在命令模式(普通模式)下操作,字符间光标移动:
h:光标向左移动;
j:光标向下移动;
k:光标向上移动;
l:光标向右移动;
上下左右四个方向键也可以和上面同样的意思;
这些命令的前边可以加上数字修饰,先输入一个数字num,然后输入上面的命令,默认不输入数字,表示1
如果输入的数字不是1,表示做成倍数量的字符间移动,表示形式为:
#COMMAND

3.7.2、单词间跳转

在命令模式(普通模式)下操作,单词间光标移动:
w:下一个单词的次首(如果一直操作,会跨行);
e:当前或后一个单词的词尾;(如果一直操作,会跨行);
b:当前或前一个档次的词首;(如果一直操作,会跨行);
这些命令的前边可以加上数字修饰,先输入一个数字num,然后输入上面的命令,默认不输入数字,表示1
如果输入的数字不是1,表示做成倍数量的单词间移动,表示形式为:
#COMMAND

3.7.3、行首行尾跳转

^:光标移动到行首的非空白字符(行文本的第一个非空白字符);
0:光标移动到行首的字符(行文本的第一个字符);
$:光标移动到行尾的字符(行文本的最后一个字符);

3.7.4、行间跳转

#G:表示跳转至文本指定第#行,并且光标标记位置为指定第#行为本的第一个非空白字符上。
           如果指定的数字不存在,例如我文本没有第0行和第41行,那么统一会按照定位到文本
                 最后一行处理,并且光标标记位置为最后一个的第一个非空白字符上;
1G,gg:表示跳转至文本的首行,并且光标标记位置为首行的第一个非空白字符上;
G:表示跳转至文本的最后一行,并且光标标记位置为第一个非空白字符上;

3.7.5、句间跳转

关于段落和句子的定义请参考:https://blog.****.net/iteye_3607/article/details/82204909

):向前切换句子;
(:向后切换句子;

3.7.6、段间跳转

{:向后切换段落;
}:向前切换段落;

3.7.7、屏幕翻屏

Ctrl+f:向前翻一屏;
Ctrl+b:向后翻一屏;
Ctrl+d:向前翻半屏;
Ctrl+u:向后翻半屏;
Enter:按行向前翻;
上下左右方向键,以及h,j,k,l也可以作为翻屏用;

3.8、vim的编辑命令

3.8.1、字符编辑

x:删除光标所在处的字符;
#x:删除光标处开始包括光标的字符在内的往后的#个字符;

xp:交换光标所在处的字符与后面的字符的位置;

3.8.2、字符或字符串替换

r:替换光标所在处的单个字符(先把光标移动到要替换的字符上,然后键入r命令,然后键入要上去的字符);
R:替换多个字符,会转成末行模式会提示"REPLACE"(先把光标移动到要替换字符串的开始位置,然后
          输入R,然后输入依次要替换的字符,可以看到每个字符都在被替换,替换完成后,按ESC回到命令模式);
#r:表示把连续多个字符替换成同一个字符;(指定数字#,把光标移动到要替换的字符开始位置,然后输入数字
           #,然后输入r,然后再输入要成为的单个字符);

3.8.3、删除

d$:从光标所在处开始,删除与行尾之间的所有字符;
d^:从光标所在处开始,删除与该行的第一个非空白字符之间的所有字符,并且包括边界;
d0:从光标所在处开始,删除光标所在行到行首字符之间所有的字符
dw:删除光标所在处到下一个单词的词首之间所有的字符;
de:删除光标所在处到单前单词或下一个单词词尾之间所有的字符;
db:删除光标所在处到当前或前一个单词的词首之间所有的字符;
dd:删除光标所在的行;
#dd:删除光标开始并包括所在行的往后的#行;
说明:除此之外,上面的命令也可以配和数字来使用,这里不一 一说明。

3.8.4、复制

y$:从光标所在处开始,复制与行尾之间的所有字符;
y^:从光标所在处开始,复制与该行的第一个非空白字符之间的所有字符,并且包括边界;
y0:从光标所在处开始,复制光标所在行到行首字符之间所有的字符
ye:复制光标所在处到单前单词或下一个单词词尾之间所有的字符;
yw:复制光标所在处到下一个单词的词首之间所有的字符;
yb:复制光标所在处到当前或前一个单词的词首之间所有的字符;
yy:复制光标所在的行;
#yy:复制光标开始并包括所在行的往后的#行;
说明:除此之外,上面的命令也可以配和数字来使用,这里不一 一说明。

3.8.5、粘贴

小写字母p:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至当前光标所在
                                      处的后方;
大写字母P:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至当前光标所在
                                         处的后方;

3.8.6、改变

改变操作,会把模式从命令模式转换到插入模式,让用户进行插入;
c$:从光标所在处开始,删除与行尾之间的所有字符,并转插入模式,等待用户输入内容;
c^:从光标所在处开始,删除与该行的第一个非空白字符之间的所有字符,并且包括边界,并转插入模式;
c0:从光标所在处开始,删除光标所在行到行首字符之间所有的字符,并转插入模式;
cb:删除光标所在处到当前或前一个单词的词首之间所有的字符,并转插入模式;
ce:删除光标所在处到单前单词或下一个单词词尾之间所有的字符,并转插入模式;
cw:删除光标所在处到下一个单词的词首之间所有的字符,并转插入模式;
cc:删除光标所在的行,并转插入模式;
#cc:删除光标开始并包括所在行的往后的#行,并转插入模式;

说明:除此之外,上面的命令也可以配和数字来使用,这里不一 一说明。

3.8.7、撤销

u:撤销此前的操作,如果重复多次,会依次往前撤销,好像有数量限制,大概50个;
#u:撤销前#个操作;
U:撤销所在行的所有操作,不可切换行;
Ctrl+r:撤销"撤销的操作";

3.8.8、可视化模式以及其他

.:重复执行前一个普通模式下的操作;
v:进入可视化模式,按字符选定;
Ctrl+v:进入可视化模式,每行对齐选定;
V:进入可视化模式,按行选定;

3.9、书签功能

m<Letter>:给指定行打标签,方便后面引用跳转;其中Letter表示单独一个字母,后面利用反引用引用这个书签。
`<Letter>:跳转到Letter标签标记的行;

例如:我正在写文章,突然向到我之前的一行,有个标记用词不当,我可以把我当前正在编辑的行做一个
书签,比如在一般模式下输入m输入另外一个字母比如w,然后我去前文修改,修改后,然后还是在一般
模式下输入反引号(`),然后输入w,就会跳到我之前做了书签的行,可以做多个书签;

四、vim的末行模式

4.1、地址定界

语法格式:
:start_pos[,end_pos]

#:特定的第#行,指一个具体数字;
.:表示当前光标所在的行;
$:表示最后一行;
#,#:表示指定行范围,左侧为其实行,右侧为结束行;
#,+#:表示指定行范围,左侧为其实行绝对行号,右侧为相对左侧行号的偏移量;
%:表示所有的行;
/pattern/:从光标所在处起始向文件后部分搜索,第一次被模式所匹配到的行;
/pat1/,/part2/:从光标所在处起始,第一次有pat1匹配到的行开始,至第一次由pat2匹配
                                                到的行结束之间的所有的行;

可以通普通模式下的编辑命令一同使用,实现编辑操作,常用在一起配合的有:
d:把匹配到的内容删除掉;
y:把匹配到的内容复制;
c:把匹配到的内容删除并转入插入模式修改;
w /PATH/TO/SOMEFILE 将范围内的文本保存至指定的文件中;
r /PATH/FROM/SOMEFILE 将指定的文件中的文本读取并插入至指定位置;

4.2、查找

/PATTERN:从当前光标所在处向文件尾部查找能够被当前模式匹配到的所有字符串;
?PATTERN:从当前光标所在处向文件首部查找能够被当前模式匹配到的所有字符串;
    n:下一个,与命令方向相同;
    N:上一个,与命令方向相反;

4.3、查找并替换

s:末行模式的命令,使用格式:
s/old/new/修饰符
    表示的含义是:s/要查找的内容/替换为的内容/修饰符

    要查找的内容:可以使用正则表达式,也可以是单纯的字符串;
    替换为的内容:不能使用正则表达式,不过可以引用前边正则匹配的内容,例如后向引用;
                                                        如果“要查找的内容”部分在模式中使用分组符号:在“替换为的内容”中使用
                                                        后向引用;直接引用查找模式匹配到的全部文本,要使用&符号;
    修饰符:
                i:忽略大小写;
                g:全局替换,意味着这一行中如果匹配到多次,则均替换;

    可以把分隔服换成如下形式:
    [email protected]@@
    s###
    等等。

五、vim的工作特性地址

5.1、末行模式临时生效定制

在末行模式下临时修改,只对当前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 hlsearch,简写为:set hls,表示启用搜索关键字的语法高亮显示;
:set nohlsearch,简写为:set nohls,表示搜索关键字的语法高亮显示;

- 设置语法高亮与否:
:syntax on  启用语法高亮
:syntax off  禁用语法高亮

- 设置忽略大小写字符与否:
:set ignorecase,简写为:set ic,表示启用忽略大小写字母特性;
:set noignorecase,简写为:set noic,表示禁用忽略大小写字母特性;

- 设置tab键占用空格的数量:
:set tabstop=#,简写为:set ts=#
设置tab键占用的空格的数量,数量默认是8个空格,可以自己指定。建议设置成
4个,大部分的文本编辑工具的tab键都是4个空格占位符;

set命令可以设置的参数很多,而且不需要可以的去记忆,大约参数有:

linux vi或vim文本编辑器基础总结

5.2、配置文件永久生效定制

vim的配置文件分两类:
全局配置文件:/etc/vimrc
局部配置文件,用户个人的:~/.vimrc

配置文件语法,每行一个命令,例如:

在~/.vimrc写入(默认不存在这个文件)以下内容:
set ts=4
set nu
set sm
set ai
set hls
set noic

然后显示载入或者重新登录会话;
source ~/.vimrc或者. ~/.vimrc   显示载入