EXINIT环境变量和.exrc文件
有两种方式来个性化VI编辑器。如果你在主目录下生成了一个叫做.exrc的文件,当VI启动的时候,那里面所有的命令都会被读到。另外一种方法是设置一个叫做EXINIT的环境变量。该选项在你的shell的建立文件里被设置。如果你使用/bin/csh (C-Shell),命令如下(被放置在.cshrc文件里面):setenv EXINIT '...'。
如果你使用/bin/sh or /bin/ksh,命令如下(被放置在.profile文件中):export EXINIT EXINIT='...'。
就像例子中所说的,不要放在…。在这个空间中,放置你想要建立的命令。例如,如果你想自动缩进,行编号,以及wrap边界三个字符,setenv命令(对于C shell来说)像这样:setenv EXINIT 'set ai nuwm=3'。
如果你想在setenv EXINIT中放置不止一个命令,用竖线(|)将命令隔开。例如,在命令模式中,要将“g”命令映射到“G”字符,命令是:map g G,与上面的命令结合,可以得到:setenv EXINIT 'set ai nuwm=3|map g G'。
如果你想生成叫做.exrc的文件,你可以在文件中放置与EXINIT之后的引用一样的东西。
当终端出现问题的时候恢复你的工作
VI编辑器编辑你的文件的一个临时副本,当编辑结束之后,或者当你叫它保存的时候,它就将临时文件的内容放到原始文件中。如果在你编辑文件的时候发生了故障,VI编辑器会试图保存你正在做的任何工作,并且为了之后的恢复而存储它。(注意:如果在你编辑文件的时候VI死掉了,它会给你发一封邮件告诉你如何恢复它。-r选项代表恢复。如果你正在编辑文件vitalinfo,而你意外退出了,“vi”编辑器的-r选项可以帮你忙。该命令像这样:vi -r vitalinfo。在使用-r选项一次之后,你必须要将你恢复的内容保存到实际的文件中。-r选项只能在每一个失败的VI会话中使用一次。)
有关在工作台上使用VI的警告
当你使用工作台时,必须要知道两件事情:一次(连续)编辑相同的文件许多次,以及改变屏幕的大小。
因为VI编辑你的原始文件的一个副本,并且将那个副本的内容保存到原始文件中,如果你登录了好几次,并且使用VI编辑相同的文件好几次,如果你一次保存在一个窗口上,然后又保存到另外一个窗口上,第一次保存的对于文件的改变会被覆盖掉。确保对于每个文件,你只是运行一个副本。
如果你使用一个工作台的一个终端程序,你可以通过拖动窗口的边界来改变屏幕的大小。如果你对大小还不尽满意,输入以下命令:eval `resize`。如果这个命令无效,另外一个命令如下:eval `/usr/bin/X11/resize`。
如果大小是错误的,编辑器不会正常运行。如果你对于屏幕尺寸存在任何疑问,可以向计算机实验室的管理员求助,他会帮你设置正确的尺寸。
VI命令的总结
以下是按照功能分类的VI命令的一个总结列表。有可能还会有其它命令,可以查看VI的在线手册。为了方便,你可以以文本文件方式保存该文件,然后删除你认为自己不会用的一些命令,并打印出剩下的较短的文件。
剪切与粘贴/删除文字
":指定一个任何命令使用的缓存。在"之后输入一个字母或数字,它们会对应一个缓存。
D:从当前光标所在位置向后删除直到行尾。
P:在当前光标位置或行之前粘贴专门的缓存。如果没有指定缓存(使用"命名),“P”就使用通用缓存。
X:删除光标之前的字符。
Y:将当前行整形到指定的缓存。如果没有指定缓存,就使用通用缓存。
d:删除,直到where。“dd”删除当前行。一个数字就表示删除那么多行。被删除的内容放置在由"命令指定的缓存中。如果没有指定缓存,就使用通用缓存。
p:在当前光标位置或行之后粘贴专门的缓存。如果没有指定缓存(使用"命名),“p”就使用通用缓存。
x:删除光标之下的字符。输入一个数字表示要删除多少字符。被删除的字符位于光标之后。
y:整形,将结果放到一个缓存中。“yy”整形当前行。输入一个数字表示要整形的行数。可以用"命令来指定缓存。如果没有指定缓存,就使用通用缓存。
插入新的文字
A:在当前行之后追加。
I:在一行的开头处插入。
O:在当前光标位置的上面一个新行进入插入模式。
a:进入插入模式,输入的字符会在当前光标位置之后插入。如果在命令之前输入一个数字,那么会插入内容多次。
i:进入插入模式,输入的字符会在当前光标位置之前插入。如果在命令之前输入一个数字,那么会插入内容多次。
o:在当前光标位置之下的一个新行进入插入模式。
在文件内移动光标
^B:向后回滚一页。输入数字就会回滚那么多页。
^D:向前滚动半个窗口。输入数字会滚动那么多行。
^F:向前滚动一页。输入数字会滚动那么多页。
^H:将光标向左移动一个空格。输入数字会移动那么多个空格。
^J:在同一列向下移动光标一行。输入数字会向下移动那么多行。
^M:移动到下一行的第一个字符处。
^N:在同一列向下移动光标一行。输入数字会向下移动那么多行。
^P:在同一列向上移动光标一行。输入数字会向上移动那么多行。
^U:向后回滚半个窗口。输入数字会回滚那么多行。
$:将光标移动到当前行的末尾。输入数字会移动到下面行的末尾。
%:将光标移动到匹配的括号处。
^:将光标移动到第一个非空白的字符处。
(:将光标移动到一个句子的开头。
):将光标移动到下一个句子的开头。
{:将光标移动到前一个段落。
}:将光标移动到下一个段落。
|:将光标移动到指定的列(由count指定)。
+:将光标移动到下一行的第一个非空白字符处。
-:将光标移动到之前一行的第一个非空白字符处。
_:将光标移动到当前行的第一个非空白字符处。
0:将光标移动到当前行的第一列。
B:将光标回移一个字,跳过punctuation。
E:将光标向前移动到一个字的结尾,跳过punctuation。
G:跳到由count指定的行处。如果没有指定数目,就跳转到文件的末尾。
H:将光标移动到屏幕顶端的第一个非空白字符处。
L:将光标移动到屏幕底端的第一个非空白字符处。
M:将光标移动到屏幕中间的第一个非空白字符处。
W:将光标向前移动到一个字的开头,跳过punctuation。
b:将光标回移一个字。如果光标在字的中间,就将光标移动到那个字的第一个字符处。
e:将光标前移一个字。如果光标在字的中间,就将光标移动到那个字的最后一个字符处。
h:将光标向左移动一个字符的位置。
j:将光标向下移动一行。
k:将光标向上移动一行。
l:将光标向右移动一个字符的位置。
w:将光标向前移动一个字。如果光标在字的中间,就将光标移动到下一个字的第一个字符处。
在屏幕上移动光标
^E:向前滚动一行。用count指定滚动的行数。
^Y:向后滚动一行。用count指定滚动的行数。
z:用以下选项重画屏幕。“z<回车>”将当前行放到屏幕的顶部;“z.”将当前行放到屏幕的中间;“z-”将当前行放到屏幕的底部。如果你在“z”命令之前指定一个数字,它就将当前行变到指定的行处。例如,“16z.”将第16行放到屏幕的中间。
替换文字
C:从当前光标位置处变到行的结尾。
R:用输入的一系列字符(以Esc键结尾)替换屏幕上的字符。
S:改变一整行。
c:改变直到。“cc”改变当前行。用count指定改变的行数。
r:替换光标下的一个字符。用count指定替换的字符数。
s:替换(Substitute)光标下的一个字符,并进入插入模式。用count指定替换的字符数。在最后一个替换的字符处放一个美元($)符号。
搜索文字或字符
,:在相反方向上重复上一个f,F,t或T命令。
/:在文件里向下搜索/之后的字符串。
;:重复上一个f,F,t或T命令。
?:在文件里向上搜索?之后的字符串。
F:在当前行向后搜索“F”命令指定的字符。如果找到了,就将光标移动到那个位置。
N:重复由“/”或“?”给出的搜索,不往相反方向搜索。
T:在当前行向后搜索“F”命令指定的字符。如果找到了,就移动到那一列。
f:在当前行搜索“f”命令之后指定的字符。如果找到了,就将光标移动到那个位置。
n:重复上一个“/”或“?”搜索。
t:在当前行搜索“t”命令之后指定的字符。如果找到了,就将光标移动到那个字符位置之前的一列。
操纵字符/行格式
~:转换光标之下的字符事例(Switch the case of thecharacter under the cursor)。
<:Shift the lines up towhere to the left by one shiftwidth. "<<" shifts the currentline to the
left,and can be specified with a count。
>:Shift the lines up towhere to the right by one shiftwidth. ">>" shifts the currentline to
theright, and can be specified with a count。
J:将当前行和下一行合并起来。用count指定合并的行数。
保存与退出
^\:退出“VI”模式,进入“EX”模式。EX编辑器是行编辑器,VI就是建立在其上的。重新进入VI的EX命令是“:vi”。
Q:退出“VI”模式,进入“EX”模式。ex编辑器是一个逐行(line-by-line)编辑器。重新进入VI的EX命令是“:vi”。
ZZ:退出编辑器,如果有任何改动就保存。
其它一些指令
^G:显示当前的文件名和状态。
^L:清除并重画屏幕。
^R:重画屏幕并移除假的行。
^[:退出键。取消部分形成的命令。
^^:回到上次编辑的文件处。
!:执行一个shell。如果指定了a,使用!执行的程序将特定的行作为标准输入,同时也会替换带执行程序的标准输出的那些行。“!!”将当前行作为输入来执行一个程序。例如,“!4jsort”会从当前光标位置拿掉五行并执行sort。在键入命令之后,会有一个你可以输入命令的单独的exclamation点。
&:重复之前的“:s”命令。
.:重复最后一次修改文件的那个命令。
::开始输入一个EX编辑器命令。当用户输入回车的时候,此命令马上执行。
@:输入在特定缓存中存储的命令。
U:将当前行恢复到光标进入行之前的状态。
m:用“m”命令之后的特定字符来标记当前位置。
u:撤销对文件所作的最后一次修改。再次输入“u”会恢复修改。
EX命令
VI编辑器建立在另外一个叫做EX的编辑器之上。EX编辑器只通过行来编辑。在VI编辑器中,用:命令来开始键入一个EX命令。以下的列表并不完全,但是给出的命令是用得比较多的。如果用某些命令(如“:s”和“:w”)来修改不止一行,在命令之前必须指定范围。例如,要替换掉从第3行到第15行的内容,命令是“:3,15s/from/this/g”。
:abstring strings
缩写。如果在VI中输入一个与strings相关的字,编辑器会自动插入相应的字。例如,缩写“:ab usa United States ofAmerica”会在输入“usa”的时候插入字“United States of America”。
:mapkeys new-seq
映射。此命令将一个关键字或一个关键字序列映射到另外一个关键字或一个关键字序列。
:q
退出VI。如果对内容有任何改动,编辑器会发出一个警告信息。
:q!
不保存而退出VI。
:s/pattern/to_pattern/options
替换。此命令用to_pattern中的字符串替换指定的pattern。如果没有参数(选项),此命令只是替换第一个出现的pattern。如果给定了“g”,所有出现的pattern都会被替换掉。例如,命令“:1,$s/Dwayne/Dwight/g”会替换掉将所有出现的“Dwayne”替换为“Dwight”。
:set[all]
给VI和EX设定一些个性化的选项。“:set [all]”命令给出了所有可能的选项。
:unastring
移除之前由“:ab”定义的缩写。
:unmkeys
移除由“:map”定义的移除映射。
:vifilename
开始编辑一个新文件。如果没有保存对内容作出的改动,编辑器会给出一个警告。
:w
写出当前文件。
:wfilename
将缓存写到指定的文件名。
:w>> filename
将缓存的内容追加到文件中。
:wq
写缓存并退出。
作者:Ben Yoshino (ben@wiliki.eng.hawaii.edu)
翻译:周兆熊(zhouzxijc@gmail.com)