1. vi/vim简介
部分内容参考自百度百科
vi出自单词"visual",由加州大学伯克利分校,Bill Joy研究开发,是Linux系统中最经典的文本编辑器。vim则是在vi的基础上改进和增加了很多特性。vi/vim只能编辑字符,不能对字体、段落进行排版;既可以新建文件、也可以编辑文件;没有菜单,只有命令,且命令繁多。下面基于功能更强大的vim,对繁多的命令做一些整理。
2. 启动和退出vim
2.1 启动vim
在Linux终端命令行中直接输入
vim
即可打开vim编辑器,如下图。
2.2 退出vim
在末行模式(稍后会介绍)下,输入q即可退出vim。如果由于没有保存修改过的文本等其他原因,输入q没有退出,可以在q后添加!,强制退出。退出vim后回到命令行。
红框圈中部分即为末行模式的输入
3. 新建和编辑文件
3.1 新建一个文件
3.1.1 方式1 启动vim时命名
如果当前文件目录下没有所需的文件,可以在命令行中输入vim + [目录(可写可不写)]文件名。注意文件名的后缀,例如输入“文件名.cpp”,会创建一个C++源文件,进行文件编辑的时候,会对其进行相应的适配,例如添加文字颜色
vim 目录/文件名.后缀
当前目录下,原本没有hello_world.cpp这个文件,我们使用vim新建一个hello_world.cpp文件,并进入vim进行文件编辑。
退出后,可以看到已经成功创建了新的文件hello_world.cpp。
3.1.2 启动vim后命名
当然,我们也可以直接进入vim,编辑文件后保存命名再退出。
编辑好之后,末行模式输入
w+文件名
保存文件并对文件进行命名。
如图所示,编辑后保存并命名try.txt。
保存命名成功。
目录中出现我们之前创建的文件try.txt。
3.2 编辑并保存文件
对已经存在的文件可以输入
vim 文件名
进行编辑。
已经存在hello_world.cpp,直接用vim打开编辑。
编辑完成后,末行输入wq,保存并退出。
再次打开vim或直接命令行查看,可以看到文件编辑并保存成功。
3. vim模式切换
vim共有三种模式:命令模式、插入模式以及末行模式(翻译不尽相同)。启动vim后,首先进入的是命令模式。在命令模式下,按I键(insert)可进入插入模式,按Shift+;(即:)可进入末行模式。在插入模式和末行模式下,按Esc键即可退回到命令模式。
三者关系如图所示。
4. 命令模式下的操作
以下内容中的输入以键盘上的按键印刷为准,如A指按A键,不表示输入大写字母A,如要输入大写字母,会提示按Shift键,请读者悉知。
4.1 模式简介
在命令模式下,从键盘上输入的任何字符都被当做编辑命令来解释。此模式下,切忌进行常规编辑操作,比如添加、删除字符。 命令模式比较适合整体浏览,进行剪切、复制、粘贴等排版操作。下面介绍一些命令模式中常用的命令。
4.2 光标移动
若键盘带有方向键,则方向键就可以控制光标移动。实际上,更常用H、J、K、L四个普遍具有的键来实现光标的移动。这样,手不离键盘即可完成编辑操作。
- J 控制光标下移一行
- K 控制光标上移一行
- H 控制光标左移一个字符
- L 控制光标右移一个字符
若是在H、J、K、L之前添加数字,则可以进行多行/多字符移动。例如,"3 L"表示向右移动3个字符。 - Ctrl+B或Page Up 向上移动一屏
- Ctrl+F或Page Down 向下移动一屏
- 数字0 跳至本行字符起始位置
- Shift+4($) 跳至本行字符末尾位置
- Shift+6(^) 跳至本行首个非空字符
- W 跳至下一个单词或标点的起始位置
- Shift+W 跳至下一个单词的起始位置,忽略标点
- B 跳至上一个单词或标点的起始位置
- Shift+B 跳至上一个单词的起始位置,忽略标点
- 数字n+Shift+G 跳至文件第n行
ps:先按数字,再同时按Shift+G。其他输入类似,不再赘述。 - Shift+G 跳至文件最后一行
4.3 复制
使用y(yank,抽出)相关命令,将内容复制一份存放在vim缓冲区。
- YY 复制当前整行内容
- 数字n+YY 复制从当前行开始的n行内容
- YW 复制当前字符到下一个单词或标点起始位置的内容
- 数字n+YW 复制当前字符到下n个单词或标点起始位置的内容
- Y+0 复制当前字符到当前行起始位置的内容
- Y+Shift+4($) 复制当前字符到当前行末尾位置的内容
- Y+Shift+6(^) 复制当前字符到当前行下一个非空字符的内容
- Y+Shift+G 复制当前行到文件末尾位置的内容
- Y+数字n+Shift+G 复制当前行到文章第n行的内容
- 如果要复制第m行到第n行之间的内容,则需要在末行模式输入
m, ny
4.4 粘贴
当vim的缓冲区非空(有复制或剪切的内容)时,按P(paste)键把缓冲区内容粘贴在当前行下方。
4.5 删除与剪切
删除使用x和d(delete)相关命令实现删除操作。将删除的内容(内容删除后存放在vim的缓冲区)粘贴(按P键)在文件某一位置即实现剪切操作。
- X 删除当前字符
- 数字n+X 删除从当前字符开始的n个字符
- DD 删除当前行内容
- 数字n+DD 删除当前行开始的n行内容
- DW 删除当前字符到下一个单词或标点起始位置的内容
- 数字n+DW 删除当前字符到下n个单词或标点起始位置的内容
- D+Shift+4($) 删除当前字符到当前行末尾位置的内容
- D+0 删除当前字符到当前行起始位置的内容
- D+Shift+6(^) 删除当前字符到当前行下一个非空字符之间的内容
- D+Shift+G 删除当前行到文件末尾位置的内容
- D+数字n+G 删除当前行到第n行之间的内容
4.6 撤销与重做
使用u相关命令,可以实现对此前进行的操作的撤销。
- U 取消最近的一次操作
- Shift+U 取消此前所有的操作
撤销后,可使用Ctrl+R键实现重做(redo)。
4.7 搜索与替换
这里介绍一些可以在命令模式下进行的搜索操作,替换操作主要在末行模式下进行,会在后文介绍。
- F+字符a 将光标定位到当前行内字符a的位置,按;键重复操作
- /+文本内容+Enter 全文自上向下从光标位置开始搜索文本内容并将光标定位到文本内容起始位置,按N键重复操作
- Shift+/(?)+文本内容+Enter 全文自下向上从光标位置开始搜索文本内容并将光标定位到文本内容起始位置,按N键重复操作
4.8 合并行
单纯在行末删除行末字符并不能与下一行合并。
- Shift+J 清除光标所处的行与下一行之间的换行,行尾没有空格则自动添加一个空格
- 数字n+Shift+J 合并n行
4.9 恢复文件
在编辑某一个文件时,目录下会生成一个形如“.filename.swap”的文件。
如图,在使用vim编辑helloworld.cpp文件时,使用另一终端查看文件目录下的文件,会出现.hello_world.cpp.swp文件。
强制关闭正在编辑hello_world.cpp的终端(意外断电等其他情况类似)后,再次用vim打开hello_world.cpp,出现如图所示界面。
根据提示:
- O 只读打开,不改变文件内容
- E 继续编辑文件,不恢复.swp文件保存的内容
- R 恢复上次编辑以来未保存的文件内容
- D 删除.swp文件
- Q 退出vim,回到命令提示符
- A 忽略这个编辑行为,回到命令提示符
如图所示,按R键选择恢复之前未保存的内容,并按Enter键确认后,文档恢复到了强制关闭前的状态。
也可直接在终端中输入
vim -r filename
来恢复未保存的内容。
4.10 进入插入模式
当需要添加、修改文件内容时,需要从命令模式进入插入模式。进入命令行的方式除了按I键外还有很多。
- O 在当前行的下方插入一行
- Shift+O 在当前行的上方插入一行
- I 在光标前插入(insert)
- Shift+I 在当前行的起始位置插入
- A 在光标后插入(attach)
- Shift+A 在当前行的末尾位置插入
- S 用输入的文本替换光标所在字符
- Shift+S 用输入的文本替换光标所在行
5. 末行模式下的操作
末行模式下,依旧可以使用上方向键调出上一条命令,Tab键补全命令等终端命令中的功能。
5.1 模式简介
末行模式下,屏幕底部会显示":"符号作为提示符,输入相关命令后按Enter键执行,按Esc键回到命令模式。
5.2 保存与退出
- w 保存文件
- w+filename 文件重命名为filename
- wq! 保存并退出
- wq!+filename 文件重命名为filename并保存退出
- q!强制退出
- x 同wq!
5.3 搜索与替换
vim常使用ex命令来执行搜索和替换操作。ex命令共有4部分组成:
- 确定操作作用的范围的符号。 '%'表示全文范围,‘m, n’表示第m到第n行,’$'表示最后一行。缺省表示范围为当前行。
- 具体的操作。's’表示替换操作。
- 搜索和替换的文本 '/text1/text2’表示用text2替换text1。
- 全局操作符号’/g’,表示对搜索到的每一行的每一个实例进行替换。缺省则会只替换每一行第一个符合条件的实例。
举个例子:
末行模式下输入
5,$ s/a/ replace /g
替换前如图。
替换后如图。
由图知,前四行中的字符’a’没有被替换,仅是第5行至末行的字符’a’被替换为字符串" replace "。
如果替换范围较大,可以在原ex命令后添加字符’c’,如
5,$ s/a/ replace /gc
替换时,每个替换需要用户确认。
如图所示,用户有多种交互方式:
- y 执行替换
- n 跳过此次替换
- a 执行此次替换和之后的所有替换
- q 或Esc 停止替换
- l 执行此次替换并退出替换
- Ctrl+E 向下滚动,用于查看替换处的文本
- Ctrl+Y 向上滚动,用于查看替换处的文本
5.4 多文件编辑
5.4.1 vim打开多文件
有时可能需要对多个文件进行编辑,如文件间内容的拷贝。
在终端输入
vim file1 file2 ...
即可用vim打开多个文件。
5.4.2 多文件切换
进入vim后,进入末行模式。
输入
n
可以切换到下一文件。
输入
N
可以切换回上一文件。
切换文件前,需要对当前文件进行保存。如果放弃保存,需要在n或N后加’!’,表示强制切换。
还可输入
buffer 文件编号
来切换文件,文件编号查看方法见下一节。
5.4.3 多文件查看
在末行模式下输入
buffers
可以查看正在编辑的文件列表,可以看到文件编号。
5.4.4 文件间复制
只需要在文件1中使用y相关命令,再切换到文件2使用P键粘贴即可。
若全文复制,甚至不需要打开多文件。只需要在终端用vim打开文件2
vim file2
后,在末行模式下输入
r!cat file1
或
r file1
即可将file1全文复制到file2。
6. 插入模式
进入插入模式后,即可与其他文件编辑器一样正常编辑文件,按Esc键返回命令行。