本章将对之前学习的编辑命令如" c "," d ",“ y ”等命令进行总结,并学习一些新的知识:其他进入vi的方法,利用缓冲区来存储拖曳或删除的文本以及如何在文件中做标记。
更多命令的组合:
之前已经不止一次讲过,对于" c ", " d "," y "等命令具有"command""TextObject"的使用形式,即这些编辑命令可以与光标移动命令进行组合使用,通过光标移动命令来表示编辑命令将会影响的文本范围。现在将这些组合命令进行简单的总结,也是对之前学习知识的回顾:
更改 删除 复制 从光标位置到......
cH dH yH 当前屏幕顶端
cM dM yM 当前屏幕中间
cL dL yL 当前屏幕底端
c+ d+ y+ 下一行
c5| d5| y5| 本行第五列
c2) d2) y2) 往下第二个句子(文件结束方向)
c{ d{ y{ 往前一个段落(文件开始方向)
c/pattern d/pattern y/pattern 往下pattern第一次出现的地方
cn dn yn 下一个模式
cG dG yG 到文件结尾
c9G d9G y9G 到文件第九行
打开vi的选项:
之前已经讲过 "vi filename"这种简单的方法来使用vi编辑器打开文件,还有很多好用的vi命令打开选项。前进到特定位置:可以在命令行中指定打开文件后光标第一次移动的方式,例如根据行号或搜索结果移动。
vi +n file:在第n行打开文件;
vi + file:在最后一行打开file;
vi +/pattern file:在第一个出现pattern的地方打开file;
这些命令中可以使用" + ",也可以使用" - ",一般来说,两种方法都能接受,但实际测试时,发现用" - "会出现错误,如下图所示,是不是书上又讲错了?暂时先记录下来吧。
这些vi编辑器的打开选项对程序员来说非常有用。例如当编译一个源文件时出错时,编译器都会把编译出错的相关行号信息显示出来。因此我们可以直接在打开文件时就定位当相应的行上,如下图所示:
而且,当我们在编辑文件的时候,如果正好编辑到一半而不得不暂时离开时,可以在当前位置用某个模式标记起来,如"HERE",当我们回来时,只需要"vi +/HERE file"即可。
只读模式:可以以只读模式打开一个文件,这样就不必担心不经意间修改文件了:
vi -R filename;
view filename;
view命令也像vi命令,其实view只是vi的链接:
如果在只读模式中想要修改文件并保存修改,则需要使用" :w! "。感叹号就代表覆盖掉只读模式。
恢复缓冲区:当编辑文件时,如果系统发生了错误,此时自从上一次存档以来所做的文件改动都会消失,可以使用-r选项恢复系统死机时的编辑缓冲区。
善加利用缓冲区:vi -r 或者 ex -r:得到系统保存下来的所有文件列表;
vi -r filename:可以恢复文件名对应的编辑缓冲区;
:pre:强制系统即使在没有死机时也保存缓冲区;
之前已经提过,对于最后一次删除或拖曳的内容(删除和拖曳操作共享相同的缓冲区)会被保存到缓冲区中,可以使用放置命令将这些文本放回到文件中。
同时,vi编辑器会将最后九次删除操作保存到有编号的缓冲区中,可以恢复这些缓冲区中的任何一个。但是只有以行为单位的删除本文才会被保存到编号缓冲区中,对于删除一行中的一部分,或者单词的一部分等,都不会被保存到编号缓冲区中,此时只能在删除操作发生之后立即用p命令进行恢复。
在这些编号缓冲区中,最后一次删除的内容保存在缓冲区1,倒数第二次删除的内容保存到缓冲区2,依此类推。如果要恢复某个编号缓冲区内容,首先输入 "(双引号),再指定缓冲区编号,再使用放置命令,例如 "1p。
如果不确定哪个缓冲区中存放了要恢复的内容,不需要不停的输入 "np进行尝试。相反,因为在p命令之后使用重复命令" . "时,会自动增加缓冲区的编号,再结合撤销命令(u),即可按编号逐步查看每个缓冲区的内容,从而进行正确的恢复,命令形式如下:"1pu.u.u.u. 依此类推。
同时,vi可以将拖曳或删除的文本放在以字母为标号的命名缓冲区中,这些文本可以保存到26个缓冲区(a-z)中,并且可以在编辑会话的任何时候使用放置命令来恢复这些文本。如果某个命名缓冲区中已经存放了文本,此时继续向该缓冲区中放置文本,则新的文本会覆盖该缓冲区中已经存在的文本,即之前的文本会消失。
要将文本保存到命名缓冲区中,需要在拖曳或删除命令之前加上双引号(")以及缓冲区的名字(a-z),例如:"add即将删除的该行内容保存到命名为a的缓冲区中。恢复时,只需要输入双引号,加上缓冲区的名字(a-z),以及放置命令p,即可恢复某个命名缓冲区的内容,如"ap。当使用大写字母指定缓冲区时,拖曳或删除的文本会附加到相应的缓冲区中。
对一处做标记:
可以在文本的某处做一个看不见的书签,然后在别处编辑时,可以根据相关的命令回到相应的书签位置。需要注意的是,标记只在当前编辑会话中有效,并不会存储在文件中。
mx:将当前位置标记为x(x可以是任何字符);
'x:(单引号)将光标移动到标记x所在行的第一个字符;
`x:(反引号)将光标移动到以x标记的字符处;
``:(两个反引号)在移动位置之后,回到上一个标记;
'':(两个单引号)回到上一个标记所在行的开头;
本章vi编辑器命令总结:
vi +n,vi +,vi +/pattern,vi -R,view, vi -r,:pre,"1p,"ayy,"ap,mx,'x,`x,``,''。