【Linux】文本编辑器Vim
0 前言
Linux中的所有内容以文件形式管理,在命令行下更改文件内容,常常会用到文本编辑器。 我们首选的文本编辑器是Vim,它是一个基于文本界面的编辑工具,使用简单且功能强大,更重要的是,Vim是所有Linux发行版本的默认文本编辑器。
1 Vim的工作模式
在使用Vim编辑文件前,我们先来了解一下它的三种工作模式:命令模式、输入模式和编辑模式,如下图所示。
- 命令模式
使用Vim编辑文件时,默认处于命令模式。在此模式下,可以使用上、下、左、右键或者H、J、K、L命令进行光标移动,还可以对文件内容进行复制、粘贴、替换、删除等操作。
- 输入模式
在输入模式下可以对文件执行写操作,类似在Windows的文档中输入内容。进入输入模式的方法是输入i、a、o等插入命令,编写完成后按Esc键即可返回命令模式。
- 编辑模式
如果要保存、查找或者替换一些内容等,就需要进入编辑模式。编辑模式的进入方法为:在命令模式下按“:”键,Vim窗口的左下方会出现一个“:”符号,这时就可以输入相关的指令进行操作了。指令执行后会自动返回命令模式。
不论是自己忘了,还是不小心切换了模式,都可以直接按一次Esc键返回命令模式。如果你多按几次Esc键后听到了“嘀——”的声音,则代表你已经处于命令模式了。
2 进入Vim
打开方法如下: [root@itxdl ~]# vim vi.test 刚打开文件时进入的是命令模式,此时文件的下方会显示文件的一些信息,包括文件名、文件的总行数和字符数,以及当前光标所在的位置等,此时可以使用插入命令进入输入模式对文件进行编辑
3 退出vim
输入:wq
4 Vim的基本应用
4.1 插入
从命令模式进入输入模式进行编辑,可以按下I、i、O、o、A、a等键来完成,不同的键只是光标所处的位置不同而已
i ——在当前光标所在位置插入随后输入的文本,光标后的文本相应向右移动
I ——在光标所在行的行首插入随后输入的文本,行首是该行的第一个非空白字符,相当于光标移动到行
首再执行i命令
a ——在当前光标所在位置之后插入随后输入的文本A ——在光标所在行的行尾插入随后输入的文本,相当于光标移动到行尾再执行a命令
o ——在光标所在行的下面插入新的一行。光标停在空行的行首,等待输入文本
O ——在光标所在行的上面插入新的一行。光标停在空行的行首,等待输入文本
若光标所在位置为:
按下I;按下i
;按下O
按下o;按下A
;按下a
4.2 移动光标
H、j、k、l ——移动光标
w ——移动光标到下一个单词的单词首
b ——移动光标到上一个单词的单词首
e ——移动光标到下一个单词的单词尾$ ——移动光标到行尾
0或^ ——移动光标到行首其实,对于$命令来说,可以使用诸如“n$”之类的命令来将光标移至当前光标所在行的之后n行的行尾(n为数字);对于“0”命令来说却不可以,但可以用“n^”。
f字符 ——移动光标到第一个符合条件的字符处 如果在一行中需要将光标移动到当前行的某个特定字符处,则可以使用f命令。
例如,某行为“you can you up, no can no bb”,现在需要将光标移动到字符p处,则可以使用“fp”命令,这样光标就会迅速定位到字符p处。f命令有一个使用条件,即光标需在指定字符前。
% ——在匹配的括号间切换
nG或:n ——移动光标到指定的行 可以直接在命令模式中输入“nG”(n为数字,G为大写)或“:n”(在编辑模式中输入数字)命令将光标快速地定位到指定行的行首。
若光标所在位置为:
按下$;按下3$
按下^;按下fi
按下%
4.3 删除
x ——删除光标所在字符
nx ——从光标所在位置向后删除n个字符,n为数字
dd ——删除整行。如果之后粘贴,则此命令的作用是剪切
ndd ——删除多行
dG ——删除从光标所在行到文件末尾的内容
D ——删除从光标所在处到这行行尾的内容
:起始行,终止行d ——删除指定范围的行
本来是这样,按下dd
;
4.4 复制
yy或Y ——复制单行
nyy或nY ——复制多行
p ——粘贴到当前光标所在行下
P ——粘贴到当前光标所在行上
本来是这样按下yy,再按下p
本来是这样,按下5yy,再按下P
4.5 查找
/要查找的字符串 ——从光标所在行开始向下查找所需的字符串
?要查找的字符串 ——从光标所在行开始向上查找所需的字符串
:set ic ——查找时忽略大小写要查找一个以root为行首的行,则可以进行如下操作: /^root
要查找一个以root为行尾的行,则可以进行如下操作: /root$
4.6 替换
r ——替换光标所在处的字符
R ——从光标所在处开始替换字符,按Esc键结束:替换起始处,替换结束处 s/源字符串/替换的字符串/g
——替换范围内的字符串
:% s/源字符串/替换的字符串/g
——替换整篇文档的字符串
本来是这样;按下r,再按下1
4.7 撤销
u——如果您误执⾏⼀个命令,可以⻢上按下「u」,回到上⼀个操作。按多次“u”可以执⾏多次回复。ctrl + r—— 撤销的恢复
5 Vim的进阶应用
5.1 显示行号
在命令模式下输入“:set nu”即可显示每一行的行号。
如果想要取消行号,则再次输入“:set nonu”即可。
5.2 切换窗口
切换到另一个文件窗口,可以按“Ctrl+WW”快捷键。
5.3 区域复制
全部复制
如果想将一个文件的内容全部复制到另一个文件中,则可以输入命令
“:r被复制的文件名”,
即可将导入文件的全部内容复制到当前光标所在行下面。
打开一个空白文档,输入r,再输入“ vi.test”按下回车键
部分复制
将光标移动到需要复制的第一行处,然后按下“Ctrl+V”快捷键,这时底部状态栏出现“VISUAL BLOCK”,就可以使用上、下、左、右方向键进行区域的选取了;当全部选完后,按下“y”键,然后将光标移动到目标位置处,按下“p”键,即可完成区域复制
5.4 加注释
在指定范围行加“#”注释
可以使用:“起始行,终止行s/^/#/g”,
例如: :1,10s/^/#/g 表示在第1~10行行首加“#”注释。“^”意为行首。“g”表示执行替换时不询问确认。如果希望每行交互询问是否执行,则可将“g”改为“c”。
按下回车
取消连续行注释
可以使用:“起始行,终止行s/^#//g”,
例如: :1,10s/^#//g 意为将行首的“#”替换为空,即删除。
按下回车
添加“//”注释
要稍微麻烦一些,:“起始行,终止行s /^/\/\//g”,因为“/”前面需要加转义字符“\”,所以写出来比较奇特,
例如: :1,5s /^/\/\//g 表示在第1~5行行首加“//”注释。
按下回车
定义快捷键
:map 快捷键 执行命令 ——定义快捷键
如定义快捷键“Ctrl+P”为在行首添加“#”注释,可以执行“:map ^P I#<Esc>”。其中“^P”为定义快捷键“Ctrl+P”。
注意:必须同时按“Ctrl+V+P”快捷键生成“^P”方可有效,或先按“Ctrl+V”再按“Ctrl+P”也可以,直接输入“^P”是无效的。
在后面两行分别按ctrl+P
设置成功后,直接在任意需要注释的行上按“Ctrl+P”快捷键,就会自动在行首加上“#”注释。取消此快捷键定义,输入“:unmap ^P”即可。
访问shell
在Vim中,可以在编辑模式下用“!”命令来访问Linux的Shell以进行操作。命令格式如下:
:! 命令 直接在“!”后面跟所要执行的命令即可,这样可以在系统中直接查看命令的执行结果。例如,在编辑过程中想查看一下/etc/passwd文件的权限,则可以使用如下命令: :! ls -l /etc/passwd 执行后,会在当前编辑文件中显示命令的执行结果,完毕后会提示用户按回车键返回编辑状态
宏记录
有时候需要对某些行进行相同的改动,如果逐一对每行进行修改则比较麻烦。Vim提供了非常优秀的宏记录功能
(1)在命令模式中将光标移动到liudehua.h行的行首,按下“qx”键,其中“q”代表宏记录,“x”代表给宏起的名,可以是任意字符。
这时候可以发现,在屏幕左下角会出现“recording”字样
(2)将第一行设置成想要的第一行所示的形式。当修改完成后,接Esc键回到命令模式,再按下“q”键退出宏记录模式。
(3)当宏记录完成后,就可以执行它了。执行的方法是将光标移动到需要进行修改的行,然后执行“@宏名”命令即可。如本例就可以将光标移动到第二行行首,然后执行“@x”命令,其他的行以此类推,最后得到如上图右的效果。
6 小结
学习Vim,首先需要掌握Vim的工作模式,其次需要掌握Vim的插入、移动光标、复制粘贴、剪切、删除、搜索、替换、撤销、保存退出等基本应用,我们在后续学习中会经常使用。
进阶应用,重点掌握Vim配置文件.vimrc中的各项设置,包括各种使用的小技巧,如多窗口编辑、区域复制、定义快捷键、与Shell交互、宏记录、ab命令,其中很多操作可以把基本应用中的命令融会贯通。
其实绝大多数Vim命令都是英文单词的缩写,如w for write、q for quit、p for paste、set nu for set number、syn on for syntax on……可以联想记忆。