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表示复制当前行
|