目录
- 正文
- 打开文件进入编辑
- 注意当前模式
- 光标移动
- 插入内容
- 删除
- 撤销操作
- 拷贝粘贴
- 保存/退出
- 在两个文件中复制粘贴
- 搜索字符串
- 替换字符串
正文
下面介绍vi 的一般用法,本文适合初学者入门,但不适合作为手册进行查询,如果需要以命令导向的手册,请使用$ man vi|more
打开文件进入编辑
编辑一个文件:
$ vi example.txt
同时编辑多个文件:
$ vi file1 file2 … fileN
如果使用vi 编辑的某个文件没有正常保存退出,会遗留一个隐含的文件:.filename.swp ,使用如下命令恢复从最后一次保存到非正常退出前所做的编辑:
$ vi -r filename
注意当前模式
进入文件编辑后,vi有四种模式,一种是插入模式(按键盘i 进入),这个模式下键盘输入会作为字符增加到文件中。
另一种是编辑模式,这个状态下可以直接输入命令来移动光标,删除字符等操作,不需要回车确认,每一个命令按键都会直接发生作用。在插入模式下按ESC 键会回到编辑模式。
第三种是命令模式,在编辑模式下按冒号”:” 即进入命令模式,这时键盘输入的字符会出现在屏幕下方,回车后,命令执行。这个模式下可以输入保存、字符串搜索、退出编辑等命令。命令模式下,按回车或者ESC 键,回到编辑模式。
第四种是搜索模式,在编辑模式下输入斜杠”/” 或者问号”?” 即进入搜索模式。
上面的四种模式是我为了描述方便所起的名字,下面将引用到。
光标移动
光标的上、下、左、右移动,分别对应按键:k、j、h、l (编辑模式)。
定位到最后一行,输入大写G(编辑模式)。
回到第一行,输入小写g(编辑模式)。
跳到第n 行,在命令模式下输入数字n ,回车。
显示当前所在行数和列数,编辑模式下输入ctrl+g 。
插入内容
在当前字符前面插入内容,编辑模式下输入i ,进入了插入模式,然后输入内容,输入完成之后,按ESC 回到编辑模式。
在当前字符后面插入内容,编辑模式下输入a ,其它操作与上面相同。
在本行首插入内容,编辑模式下输入大写I 。其它操作与上面相同。
在本行尾追加内容,编辑模式下输入大写A 。其它操作与上面相同。
删除
删除当前光标的字符,编辑模式下输入x ,如果希望删除当前光标前面的字符,输入大写X 。
删除一行,编辑模式下连续两次输入d 。删除一个单词,编辑模式下依次输入dw 。
从当前光标删除至行尾,编辑模式下依次输入d$ 。
撤销操作
撤销刚才的一次修改,编辑模式下输入u ,撤销对这一整行的修改,输入大写U 。
如果希望撤销对文件的所有修改,命令模式下依次输入e! ,回车(输入冒号”:” 进入命令模式,:e!)。
拷贝粘贴
拷贝一行内容,编辑模式下连续输入两次y 。
将剪贴板中的一行粘贴到当前行的后面,编辑模式下输入p 。
拷贝n 行内容,编辑模式下输入数字n(n是要拷贝的行数,从当前行算起),然后输入y ,拷贝完成,输入p 粘贴多行。
保存/退出
如果保存并关闭文件,命令模式下输入x ,回车即可。
如果保存,同时继续文件编辑,命令模式下输入w ,回车。
如果放弃所有更改,直接退出,命令模式下输入q! ,回车。
命令模式下输入wq 与x 等价。
在两个文件中复制粘贴
需要将file2 的某行粘贴到file1 中。
同时打开两个文件,中间用空格分隔:
$ vi file1.txt file2.txt
打开后当前编辑的为file1 ,在命令模式下输入n ,切换到file2。
找到相关行,编辑模式下输入yy ,再进入命令模式,输入大写N ,切换回上一个文件(以打开顺序为准),找到相关位置,编辑模式下输入p ,粘贴完毕。
搜索字符串
要搜索字符串abc ,在搜索模式下(编辑模式下输入斜杠”/” 或者问号”?” 即进入搜索模式),输入abc ,回车。
如果找到,光标会定位到从当前位置到第一个出现字符串abc 的位置,输入n 会跳到下一个abc 出现的位置,输入大写N ,跳到上一个abc 出现的位置。
斜杠”/” 与问号”?” 的区别,前者向后正向搜索,后者向前反向搜索。
替换字符串
要将当前行中的所有字符串abc 替换成efg ,命令模式下输入s/abc/efg/g ,回车。
上面命令只会替换abc 而不会替换ABC 或者aBc 。如果希望忽略大小写,加上参数i ,s/abc/efg/gi ,回车。
如果希望进行全文件范围替换,命令模式下输入%s/abc/efg/g ,回车。
如果替换的字符串中包含了例如斜杠”/” 这样的特殊字符,使用反斜杠”\” 转义。
命令模式下,输入%s/\/image/\/img/gi ,回车
以上命令会将文件中所有的字符串/image 替换成 /img ,并且不区分image 的大小写。