声明:本文首发于个人公众号:写点代码
1 vi的工作方式是命令方式和输入方式
处于命令方式时,用户键入的内容被当作vi的命令来解释,一般处于命令方式下按键无回显(以冒号打头的命令和查找命令/除外)。编辑命令i,a等,可以从命令方式转
到输入方式。处于输入方式时,用户键入的所有内容全部作为输入的正文内容,用户可以输入多行,每输入完一行后按回车转入下一行,正文输入时有回显。输入完毕按键盘左上角的Esc键,返回到命令方式。
2 命令子集
(1)单字符移动:左下上右;
h 光标左移一列;j 光标下移一行;k 光标上移一行;l 光标右移一列。在vi中有许多命令可以在命令前加上一个整数,标志这个命令连续执行多少遍,例:5h 光标左移5列
(2)翻页
Ctrl-B: 向后翻页(Backward);Ctrl-F: 向前翻页(Forward);Ctrl-U: 向上翻半页(Up);Ctrl-D: 向下翻半页(Down)。同样可以加数字,比如6Ctrl-F:向前翻6页
(3)将光标移至当前行首 ^将光标移至当前行尾 $ ,需要使用ctrl辅助
(4)移到右一个单词 w W,移到左一个单词 b B
使用这种方法,向左/右移动光标,尤其是需要连续移动光标定位到某一位置时,比单字
符移动命令更快和更有效。w,b与W,B的区别是它们对“单词”的定义不同。小写命令的命令w和b,以非字母,数字,下划线之外的所有字符作为“单词”分界符。大写命令的命令W和B,仅以空白符(空格或者制表符)作为“单词”分界符。同前述其它命令类似,也可以使用类似6w 3W 5b 10B命令。
(5)移到指定的行
:476 将光标定位于第476行
:1 将光标定位于第1行(文件首)
:$ 将光标定位于文件尾
:$-10 将光标定位于文件倒数第10行
在描述行号时,可以使用圆点(.)代表当前行号,使用$代表最后一行的行号,而且
可以使用整数加减法,如前述的最后一例。
(6) 括号配对命令 %
先把光标移到一个花括号(或圆括号,或方括号)上,按%键,则光标自动定位到与它
配对的那一个括号。
(7)设置书签
vi允许设置以单个英文字母命名的最多26个标记(mark),许多编辑器把这种功能叫
“书签(bookmark)”。vi的书签记忆了一个行号。设置书签的命令是m。例如:按下按键ma,尽管终端上没什么特别的显示信息,但是,vi已经将当前行号记为名字为a的书签。最多可以使用26个书签,设置的所有书签,在vi退出后,不再保存。 vi许多编辑命令可以使用命名的书签,将光标移动到指定书签处的命令是'(单引号) 例: 'a 连续按下单引号和字母a,光标会移动到书签a处。
(8)删除
① 删除当前字符的命令:x
类似的,命令5x删除从当前光标开始的5个字符。
② 删除当前行的命令:dd
类似的,命令3dd删除从当前行开始的3行。
③ 与光标移动命令相关的删除命令
d'e 从当前光标处删除到书签e处(书签e需要事先用命令m设置好)
d$ 从当前光标处删除到行尾
d^ 从当前光标处删除到行首
dw 删除一个单词
d% 将光标移动到一个括号字符上,删除和它配对的括号括起的段落。
(9)字符替换
替换光标处字符的命令是r。
例:ra命令将当前光标处字符替换为a。
如果希望将当前光标处开始的三个字符依次替换为abc,则需要按命令rarbrc。
替换多个字符的命令是R。
例:命令Rabcdef,然后按Esc键
该命令把从当前光标开始的字符依次替换为abcdef,用Esc来结束多字符替换命
令。这类似于以“覆盖”(overwrite)方式进入编辑状态。
(10)取消和重复
① 命令u
取消上一次的编辑操作。例如:误删除了一段正文,用u命令可以恢复到删除前的状
态(undo)。再如:把文件中的所有abc字符串替换成xyz字符串,用u命令可恢复到替换
前状态。
vi的取消操作,只能回退一次,不像现在Windows上流行的很多编辑软件那样,可
以回退很多步。许多新版本的vi对这个问题作了改进。
② 命令.
重复上一次的编辑操作。按圆点键,可以重复上一次的编辑操作。例如:按3dd命令
删除了三行,然后按圆点键就再删除三行,如果接着连续按圆点键,则每按一次删除三
行。
(11)文件命令
① 存盘退出 ZZ
存盘退出 :wq
② 存盘不退出 :w
③ 不存盘退出 :q!
④ 读入一个文件插入到当前行之下
:r a.c
⑤ 写文件
把第50行至文件尾的内容写到文件junk中
:50,$w junk
如果文件junk事先已经存在,使用下述命令强制把它覆盖掉
:50,$w! junk
如果编辑了文件之后,无法存盘(例如:文件没有写权限),那么可以用
:w file1
将当前编辑好的文件内容存到一个另个文件中。
(12)段落的删除,复制和移动
① 删除(delete)
:10,50d 删除第10-50行
:1,.d 删除文件首至当前行的部分
② 复制(copy)
:5,10co56 复制第5-10行到第56行之下
③ 移动(move)
:8,34m78 移动第8-34行到第78行之下
行号描述时除了可以使用圆点代表当前行,$代表最后一行,还可以使用“书签”,
例如:下面的命令中'e代表书签e的行号。
:'e,.d
(13)剪贴板
将缓冲区中保留的信息粘贴到光标处,使用p命令(put或paste)。
除了上述的d命令之外,还有“抽取(yank)”命令y,它仅仅把指定的信息拷贝到缓冲
区,但不删除它们。用法和d命令类似。
在信息保留到缓冲区之后,就可以使用p命令,将它们粘贴到文件合适的位置。
vi除了使用这个默认的缓冲区之外,还有26个用单个英文字母命名的有名字的缓冲
区。与缓冲区有关的三个命令是d,y,p,在使用有名字缓冲区时,在这些命令前加两个
字符的前缀,一个字符是双引号,一个字符是英文字母代表的缓冲区名字。例如:
"a3dd 删除当前行开始的3行,并把信息保留到a缓冲区中。
"by'e 拷贝当前光标到书签e处内容到b缓冲区中。
"ky%
光标定位在一个括号字符上,拷贝从此开始到和它配对的括号处的段落到缓冲区k中.
"kp
粘贴出缓冲区k中的内容。
(14)其它命令
① 两行合并J (大写字母,Join)
把当前行下面的行合并到当前行。
② 刷新屏幕显示Ctrl-L
当正在编辑一个文件时,由于其它用户给本终端发送的信息显示到屏幕上,或者某
一后台进程的输出冲掉了当前的vi显示。那么,在阅读完这些“突然”出现的信息后,
按Ctrl-L键,恢复vi原先的屏幕显示。在more命令中也介绍过类似的功能。
③ 状态显示 Ctrl-G
在屏幕最下面一行列出正在编辑的文件的名字,总行数,当前行号,文件是否被修
改过等信息
(15)模式查找
在vi的模式查找命令中,使用“正则表达式”来描述一个字符串模式。命令格式为:
/模式
例:/[0-9][0-9]*
从文件当前位置开始向下查找能与正则表达式[0-9][0-9]*匹配的字符串,找到
后,光标将定位于该处。继续查找命令:n和N。小写字母n键,向下继续查找下一个(next),查到文件尾后,自动折到文件首继续向下查找(循环搜索)。大写字母N,向上继续查找下一个,查到文件头后自动折到文件尾继续向上查找(循环搜索)。
(16)模式替换
① 基本用法
在vi的模式替换命令(substitution)中,也使用“正则表达式”来描述一个字符串模式。
命令格式为:
:行号,行号s/模式/替换字符串/g
其中,模式描述使用正则表达式。替换命令结束后在屏幕的最下面的状态行显示替换次
数
参考内容:书籍《实用UNIX教程》