Linux之vi和vim使用教程
Unix系统有两个非常重要常用的文本编辑器:vi和Emacs。而其中的vi使用更为广泛,因此不管你喜欢使用哪一种,vi都是需要掌握的。而vim是vi的增强版,许多Linux都已经使用vim替代vi了(可以查看手册来确定),好在vim兼容vi的所有命令,我们可以使用vim来学习vi。
快速使用
如果你只是想临时使用vi简单编辑下文件,则只看下面几个步骤即可
-
使用vi file 打开/创建文件file -
打开后,按下i 进入编辑模式,可以在光标处输入字符,使用上下左右移动光标,<backspace>和<delete>删除字符 -
编辑完成后,按下<esc>退出编辑模式,输入命令:wq 保存并退出,或者输入:q! 放弃修改,强行退出。
启动vi
为了学习vi,需要让vim以兼容模式启动,命令如下
vi -C [file...]
选项-C 表示兼容模式,会使vim尽可能的像vi一样,等我们学会vi后再去掉不迟。
- 当指定了文件名时,打开指定文件,若文件不存在,则会创建再打开
- 当没有指定文件名时,会打开空白文件,在保存时需要指定文件名
使用:q 可以退出vi
当你使用vi编辑文件时,会将文件的内容复制到编辑缓冲区,因此我们所编辑的是副本。
使用view 可以用只读模式打开文件
tip:使用:set number 可以显示行号,:set nonumber 可以隐藏行号
命令模式和编辑模式
- 命令模式:所有键入都会被解释成命令,例如
x 表示删除一个字符 - 编辑模式:所有键入都直接插入到编辑缓冲区中,例如按下
x 会输入字符x
当vi启动时处于命令模式,按下i 可以进入编辑模式。在编辑模式中按下esc 键可以进入命令模式
常用的进入编辑模式的命令如下:
i :改变到编辑模式,在当前光标前插入数据a :改变到编辑模式,在当前光标后插入数据C :进入编辑模式,将当前光标到行尾的字符都删除cc 和S :进入编辑模式,将当前行的字符都删除R :进入编辑模式,但此时的输入会替换当前字符c +移动光标:进入编辑模式,删除移动前光标到移动后间的字符,例如cw 可以删除一个单词
退出vi
ZZ 和:wq :保存并退出:q :退出vi,若有修改未保存则提示:q! :强行退出,无论修改是否已保存
保存文件
:w :保存到原始文件:w file :另存为新文件file:w! file :另存为新文件file,若文件存在则覆盖:w>> file :将修改后的文件追加到file的末尾
移动光标
可以使用上下左右键来移动光标,但效率太低。
下面列举一些我觉得好用的移动光标的命令,他们都无需按回车即可执行,注意大小写,且需要在命令模式中使用。
命令 | 功能 |
---|
h | 向左移动一个字符 | j | 向下移动一个字符 | k | 向上移动一个字符 | l(小写L) | 向右移动一个字符 | <Space> | 向右移动一个字符 | <Enter> | 移动到下行的开头 | ^ | 将光标移动到当前行的第一个非空格/制表符的字符上 | w(小写) | 将光标移动到下一个单词的词首 | e | 将光标移动到下一个单词的词尾 | b | 将光标移动到上一个单词的词首 | W(大写) | 同w, 忽略标点符号 | E | 同e, 忽略标点符号 | B | 同v, 忽略标点符号 | ^D | 向下移动半屏 | ^U | 向上移动半屏 | gg | 跳转到第一行 | G | 跳转到最后一行 |
标记与跳转
使用m +字母可以标记当前位置。例如命令ma ,将当前位置标记为a。
如果需要跳转到a位置,可以使用如下命令
`a :反引号+a,调整到a位置'a :单引号+a,跳转到a所在行首
tip:通常标记为m,因为mm 按起来方便,也好记
搜索
使用/ 或? 进行搜索,/ 表示向后搜索,? 表示向前搜索。例如
/hello
表示从当前光标开始向后搜索hello,输入n 可以查找下一个,N 查找上一个
可以使用正则表达式匹配,例如
/^h
表示查找以h为开头的位置
替换
使用:s ,语法为:
:s/pattern/replace/
其中pattern是要被替换的模式,replace是替换结果,例如将hello替换成hi。
:s/hello/hi/
注意:其只会替换当前行的第一个匹配项,如果希望在替换当前行所有的匹配项,则在命令最后加上g ,如果希望在替换前确认,则在最后加上c ,例如
:s/hello/hi/gc
如果最后没有g 或c ,可以省略最后的/ 。在确认过程中可以使用^C 终止替换
在替换时可以指定行号和范围,例如在57行到60行里进行替换的命令如下
:57,60s/hello/hi/
% 可以表示整个编辑缓冲区,例如在整个文档中进行替换的命令如下
:%s/hello/hi/
删除文本
删除文本常用的命令如下:
x :删除当前光标处字符dd :删除当前行X :删除光标左边字符d +移动光标:删除从当前光标到移动后位置间的字符,例如dG 表示删除当前行(包括)到文档末尾所有内容,dgg 表示删除当前行(包括)到文档开头所有内容:%d :删除所有内容,其中% 表示所有行,可以替换成指定行号
撤销与恢复
u :撤销上一命令对编辑缓冲区的修改。对于vim来说,多次按下u 将撤销前面多条命令,而对于vi来说,第二次按下u 将撤销上次撤销,即取消撤销U :撤销自移动到当前行的那一刻起,对当前行所进行的所有改 变。. :重复上一命令对编辑缓冲区的修改。非常神奇,例如你进入编辑模式,输入了hello后回到命令模式,接下来只要按下. 就可以在光标位置输入hello了
复制粘贴
vi中有一个无名缓冲区,类似于剪切板,可以存储一次复制/剪切的内容。在vi中所有删除命令,其实都相当于剪切,会将内容放到剪切板中。
粘贴可以使用p 或P (put),p 将内容粘贴在光标后,P 将内容粘贴在光标前。若剪切板中为一行/多行,则p 将内容粘贴在光标后一行,P 将内容粘贴在前一行。
复制可以使用y 或yy ,其中y 的用法和d 一样,后跟移动光标,将移动前到移动后间的字符复制。yy 表示复制当前行
|