vi
vi是一个面向显示的交互式文本编辑器:终端的屏幕充当您正在编辑的文件的窗口。您对该文件所做的更改将反映在您看到的内容中。
查看英文版
1 vi 运行系统环境
2 vi 语法
3 使用 Vi
4 在vi中移动
5 简单的更改
6 重新排列和复制文本
7 高级命令
8 专题
9 技术细节
10 快速参考
vi 运行系统环境
unix
Unix&Linux
vi 语法
vi [ -| -s ] [-l] [-L] [-R] [ -r [ filename ] ] [-S] [-t tag] [-v] [-V] [-x] [-w] [-n ] [-C] [+command | -c command ] filename选项
-|-s | 禁止所有交互式用户反馈。在处理编辑器脚本时,这很有用。 |
-l | 设置用于编辑LISP程序。 |
-r | 列出由于编辑器或系统崩溃而保存的所有文件的名称。 |
-rfilename | 编辑器或系统崩溃后编辑文件名。恢复崩溃发生时缓冲区中文件名的版本。 |
-L | 与-r相同 |
-R | 只读模式;设置了只读标志,以防止意外覆盖文件。 |
-S | 此选项结合使用与-t标签选项告诉VI的标签文件可能不进行排序,并且,如果二进制搜索(这依赖于一个排序的标签文件)标签没有找到它,要慢得多线性搜索也应该完成。由于线性搜索的速度很慢,因此大标签文件的用户应确保对标签文件进行排序,而不要使用此标志。创建标记文件通常会产生排序的标记文件。有关标签文件的更多信息,请参见ctags。 |
-ttag | 编辑包含标签tag的文件,并将编辑器置于其定义处。 |
-V | 详细模式。当通过标准输入读取ex命令时,输入将回显到标准错误。在shell脚本中处理ex命令时,这可能很有用。 |
-X | 加密选项;使用时,vi模拟ex的X命令并提示用户输入密钥。该密钥用于使用crypt函数的算法对文本进行加密和解密。的X命令使一个受过教育的猜测,以确定文本是否在被加密或不读出。临时缓冲区文件也使用-x选项键入的密钥的转换版本进行加密。如果输入了空的加密密钥(即,在提示后立即按下返回键),则文件不会被加密。这是解密用错误键入的加密密钥(例如,退格键或撤消密钥)错误加密的文件的好方法。 |
-wn | 将默认窗口大小设置为n。在较慢的速度线上使用编辑器时,这很有用。 |
-C | 加密选项;与-x选项相同,除了vi模拟ex的C命令。C命令类似于ex的X命令,除了假定读入的所有文本均已加密。 |
+command|-ccommand | 通过执行指定的编辑器命令(通常是搜索或定位命令)来开始编辑。 |
filename | 要编辑的文件。 |
查看英文版
使用 Vi
vi是一个面向显示的交互式文本编辑器:终端的屏幕充当您正在编辑的文件的窗口。您对该文件所做的更改将反映在您看到的内容中。
使用vi可以很容易地在文件中的任何位置插入文本。大多数vi命令在文件中四处移动光标。您可以以字符,单词,句子和段落为单位前后移动光标。某些运算符,例如d表示删除,c表示更改,可以与运动命令结合使用,以自然的方式对整个单词,段落等进行操作。
编辑文件启动vi会话的最常见方法是告诉它要编辑哪个文件。要编辑名为filename的文件,请使用以下命令:
vi filename
屏幕将清除,并且文件文本将出现在屏幕上。如果文件名尚不存在,vi会在一个新文件中启动您,并告诉您保存您的工作时,它将使用您指定的文件名。
编辑的副本:“缓冲区”编辑器不会直接修改您正在编辑的文件。而是在内存中将此文件的副本称为buffer。除非您将所做的更改写回到原始文件中,否则实际上不会影响文件的内容。
方向键在大多数终端上,您可以使用箭头键来移动光标。向左和向右将光标向左或向右移动一个字符,然后向上或向下将光标向上或向下移动一行。移动光标的另一种方法是使用h,j,k和l键:
H | 剩下 |
j | 下 |
k | 向上 |
l | 对 |
有点历史性的琐事:之所以使用hjkl键,是因为Bill Joy开发的原始计算机系统没有单独的箭头键。而是,键盘使用hjkl键作为箭头键。
铁杆vi用户将告诉您,hjkl键是移动光标的唯一“真正”方法,因为您可以将手保持在键入位置,但是您应该使用最适合自己的方法。
特殊键:Esc,返回和删除Escape键在vi中很重要:它用于取消您开始键入的任何命令,并在您插入或添加文本后返回到命令模式。如果您忘记了自己所处的模式或正在做什么,则可以使用Escape键。您可以多次单击它以返回命令模式并取消您一直在做的任何事情。
Return键(或“ Enter键”)用于完成某些命令并执行它们。
Delete键是另一个要按下的“安全”键。它会中断编辑器的所有操作,并使您返回到编辑器的默认状态,有时也称为“静态”状态。
退出viZZ命令将把缓冲区的内容写入正在编辑的文件中,并退出vi。
如果没有要保存的更改,也可以使用命令:q退出编辑器。如果您所做的更改尚未保存,则编辑器将不允许您以这种方式退出。
如果要退出并放弃所做的更改,可以告诉编辑器,您可以通过使用:q!退出来确定您知道自己在做什么。。这将立即退出vi,所有未保存的更改都将丢失。
查看英文版
在vi中移动
编辑器有几个命令可用于在文件内移动。其中最有用的一个是Control-D(也表示为^ D)。此命令在文件中“向下滚动”(D代表“向下”)。^ U(“向上”)类似:它在文件中向上滚动一页。这两个命令还将光标移动到新位置。
如果只想查看文件的更多内容,但将光标留在原处,则可以使用^ E在屏幕底部“显示”另外一行。^ Y(不代表任何东西,但在键盘上的U旁边)在屏幕顶部显示一行。
还有其他方法可以在文件中四处移动。键^ F和^ B向前和向后移动一页(称为“分页”),在屏幕之间保持几行连续性,因此可以使用这些键而不是^ D和^ U来读取文件。如果你希望。
注意“滚动”(^ U,^ D)和“分页”(^ B,^ F)之间的区别。滚动留下更多的上下文,但是分页仅留下几行。由您决定哪一个更容易四处移动和读取文件。
正在搜寻将您自己放置在文件中的另一种方法是给编辑器一个要搜索的字符串。如果键入“ /”,后跟一个字符串,然后按Enter键,则编辑器将在文件中搜索该字符串的下一个出现位置,并将光标放在该位置。按n将转到此后的下一个事件。
如果要向后搜索字符串而不是正向,请使用?代替/。在一个?字符串搜索,按n键将带您进入相同(向后)方向的连续出现。
如果您给编辑器提供的搜索字符串不存在于文件中,则编辑器将打印一条消息,通知您找不到它,并且光标将不会移动。
如果只希望搜索字符串在行的开头匹配,则应以插入符号(“ ^ ”)开头。要仅在行末匹配,请在搜索字符串后加一个美元符号(“ $ ”)。所以使用命令
/^mystring
仅当“ mystring ”位于一行的开头时,才会找到匹配项。同样,命令
/mystring $
只匹配行末尾出现的“ mystring ”。
“转到”命令G后面带有数字时,将“转到”一行:它将转到该行号并将光标定位在该行。如果使用不带数字的G,它将光标移动到文件的最后一行。
因此,使用命令
1G
将光标移动到文件的第一行;
30G
将光标移到第30行,然后
G
不管数字是多少,都将光标移动到最后一行。
找出文件中的位置您可以按^ G在文件中找到您的位置。此底线将显示您正在编辑的文件的名称,当前行数,缓冲区中的行数以及光标当前位于缓冲区中的百分比。
回到你刚才的地方每当您以上述任何一种方式移动光标时,都可以通过键入``(将两个反引号引起来)将光标移回原来的位置。所以,如果您输入
G
移至文件末尾,但随后您意识到您需要回到原来的位置(无论您是否记得在哪里),可以键入
``
回到您的原始位置。执行搜索后,此方法也有效。请记住此命令,因为它非常有用!
行超出文件末尾如果您接近文件结尾,并且最后一行不在屏幕底部,则vi将在实际文件结尾之后的任何行上打印波浪号(“ 〜 ”)。这表示文件的最后一行在屏幕上。也就是说,任何显示“ 〜 ”的行都在文件末尾。例如,当您开始编辑新文件时,您会注意到这一点:每行都将以波浪号开头。
在屏幕上四处走动正如我们已经提到的,您可以使用箭头键或h,j,k和l左右移动光标一个光标,或上下移动一行。
您也可以使用+移至下一行或-移至上一行。这类似于使用向上和向下(或Ĵ和ķ),所不同的是将光标将自动被放置在第一非空白上的行字符。
这些键中的任何一个,如果它们会将您带到屏幕的第一行之前或最后一行之后,都将沿正确的方向滚动显示一行。按返回键与按+相同。您还可以将光标定位在当前显示的文本屏幕的顶部,中间或底部:
H将带您到屏幕顶部(“主页”)行。在H之前加上数字将带您到主行加上该行数。例如,3H将光标移至屏幕上显示的第三行文本。
M是类似的命令:它将光标移动到屏幕中间。
L将光标移至屏幕的最后一行。如果您在数字前面加上数字,它将光标移至显示的最后一行之前的那一行。因此5L将光标移至当前显示的倒数第二行。
行内移动w将光标移至该行的下一个单词,b将光标移至上一个单词。
e使您前进到当前单词的末尾,而不是下一个单词的末尾。
如果单词被标点,例如用撇号或逗号,则w和b将在标点处停止。如果改为使用W和B,它们将在忽略标点的同时移动光标。
这些命令全部换行到一行的末尾(或开头),如果它们对下一个或上一个单词的搜索走了那么远,则移至上一行或下一行。
摘要:运动钥匙这是我们刚刚讨论过的移动键的概述,以及一些其他功能。
空格键 | 将光标前进一个位置 |
^ B | 向后翻页 |
^ D | 向下滚动 |
^ E | 在屏幕底部露出一条线 |
^ F | 向前翻页 |
^ G | 位置状态检查 |
^ N | 下一行,同一列 |
^ P | 前一行,同一列 |
^ U | 向上滚动 |
^ Y | 在屏幕顶部显示一条线 |
+ | 下一行,在第一个非空白字符处 |
- | 前一行,第一个非空白字符 |
/string | 向前扫描字符串。如果未指定字符串,则扫描最后一个扫描的字符串。 |
? | 向后扫描string。如果未指定字符串,则扫描最后一个扫描的字符串。 |
B | 向后倒一个单词,忽略标点符号 |
linenumberG | 转到指定行号(一个整数)。默认为最后一行。 |
H | 将光标移到屏幕的第一行 |
M | 屏幕中线 |
L | 屏幕的最后一行 |
W | 转发一个单词,忽略标点符号 |
b | 向后倒一个字 |
e | 当前单词的结尾 |
n | /或下一个实例?搜索模式 |
w | 下一个字 |
查看英文版
简单的更改
更改文件的最基本命令是i(插入)命令。键入i后,您键入的所有内容(直到您按Esc键)都将光标位置插入到缓冲区中。
i命令的伴随命令是a(“追加”)命令。操作就像我,除了它开始插入文本后的光标位置,而不是在光标所在位置。
有时,您想在光标所在的行之后立即开始在新行上进行编辑。为此,请使用o命令。要在光标所在的行之前开始新行,请使用O命令。就像i和a一样,您键入的任何文本都会插入到缓冲区中,直到您按Esc为止。
使用以下任何命令插入文本时,可以使用^ W删除整个单词,并将光标留在前一个单词之后一个空格
需要注意的一件事是,当您退格时,您不会擦除任何未插入的字符。另外,您不能退格到上一行;当您到达当前行的开头时,backspacing将停止。
进行小更正在vi中进行小的修正很容易。如果您需要删除不应该出现的字符,请将光标移到该字符上方,然后按x删除它。您还可以在按x之前提供一个数字,它将删除那么多字符。因此,如果您有“ 发现 ” 一词,并且将光标移到v上并键入
4x
...您将剩下“ 迪斯科 ” 一词。
如果要用另一个字符替换单个字符,请将光标移到该字符上,然后按r,然后按应该替换它的字符。因此,如果您键入“ mistoke ”,然后将光标移到“ o ”上并键入
ra
... o将被替换为a,使您留下“ 错误 ” 一词。
在[R命令是相似的,但你可以用它来代替不止一个性格比较; 如果您按R键并开始输入,则您键入的每个字符都将替换那里已经存在的每个字符。因此,如果您有“ 错误” 一词,然后将光标移到字母t上,然后键入
Rsile
...您会看到“ 错误 ”一词变成了“ 导弹 ” 一词。您可能还会注意到,如果在此模式下退格,则将逐字母还原原始文本。完成后,按Esc键停止替换字符。
经营者命令d用作删除操作符:按d,然后移动键将删除光标将移动到的任何位置。例如,键入dw将删除下一个单词,而键入db将向后删除到上一个单词。键入d SPACE将删除一个字符;这与输入x相同。
另一个有用的运算符是c,代表变化。命令cw将更改一个单词:它将删除单词的所有内容,并将您置于插入模式下以键入应替换它的文本。
重复更改每次使用命令进行更改时,都可以键入“ 。 ”重复更改。因此,如果您使用dw删除单词,请输入。也将删除下一个单词。您可以输入来重复一遍。几次,如省略号(“ ... ”)。
在线操作输入dd将删除整行。
键入cc将更改整行,将其删除并将其置于插入模式。
您可以一次在dd或cc前面加上一个数字来删除或更改多行。例如,5dd将删除5行。您还可以提供类似dL的命令,该命令将从光标中删除每一行,直到屏幕上的最后一行,包括d3L,从光标中删除每一行到倒数第二行。当您进行这样的大更改时,特别是如果所做的更改超出了在一个屏幕中可以看到的范围时,编辑器会向您显示一条消息,告诉您已完成的操作。
撤消要撤消上一次更改,请键入u。要重做(撤消撤消),请再次键入u。
与vim不同,vi仅提供一级撤消。但是,您可以使用U(大写U)撤消对当前行所做的任何更改。按U可以将当前行恢复为开始更改前的状态。
摘要:进行更改SPACE | 将光标前进一个位置 |
^W | 插入时删除单词 |
. | 重复上一次更改命令 |
O | 打开并在当前行上方输入新行 |
u | 撤消您对当前行所做的更改 |
a | 在光标后附加文本 |
c | 将您指定的对象更改为之后输入的文本 |
d | 删除您指定的对象 |
i | 在光标之前插入文本 |
o | 在当前行下方打开并输入新行 |
u | 撤消上一次更改 |
查看英文版
重新排列和复制文本
fx移动光标,找到当前行的下一个x字符。之后,如果按;您的光标将移动到下一个相同字符的位置。F是类似的命令,但在同一行中向后搜索,而不是向前搜索。
的˚F和˚F命令可以被组合,例如,与d命令。键入dfx会删除光标中的所有内容,直到该行中下次出现x为止。有时您想要删除(但不包括)下次出现的字符x。在这种情况下,请使用命令dtx。t代表“至”。
行的开头用零(“0”)表示,插入符号(“^”)表示该行的第一个非空白字符,行的结尾用美元符号(“$”)表示。如果按^,光标将放置在该行的第一个非空白字符处;如果按0,光标将位于行的开头;如果按$,光标将位于行的末尾。
要删除从光标到行尾的所有内容,请输入d $。要删除从光标到行首的所有内容,请键入d0...,依此类推。
高级文本对象有时以整个句子为单位移动会很有帮助。在(和)命令分别移动到一个和下一个句子的开头。因此,命令d)删除当前句子末尾的所有内容;和d(删除当前句子开头的所有内容;如果您已经在句子开头,则删除整个先前的句子。
句子定义为以句点(“。”),感叹号(“!”)或问号(“?”)结尾,其后是行尾或空格。空格,行尾或。,?或!之后可能会出现任意数量的结尾),],“和'字符。
的{和}命令上移动段落,和操作[[和]在部分移动。可以通过特殊的宏或行首的换页符来定义“节”。
重新排列和复制文本编辑器有一个特殊的未命名缓冲区,用于保存最后删除或更改的文本,还有一组命名缓冲区a到z,可用于保存文本副本并在文件中移动文本。
的y命令“猛拉”的对象的副本到匿名的缓冲器。如果以缓冲区名称开头,则会将该对象放入命名缓冲区。指定缓冲区的方式是双引号(“),然后是字母a-z,然后是y命令。因此” ay将对象拖入名为a的缓冲区中。
可以使用命令p或P将缓冲区中的文本(未命名的缓冲区或您命名的缓冲区之一)粘贴到文档中。p将缓冲区内容粘贴到光标位置之后(很像一个追加),P将缓冲区内容粘贴到光标位置(很像一个插入符)。
如果您拉动的文本形成一行的一部分,或者是诸如句子之类的对象,且部分跨越多条行,那么当您将文本放回原位时,它将被放置在光标之后(如果使用P)。如果选中的文本形成整行,则它们将作为整行放回,而不会更改当前行。在这种情况下,粘贴行为更像是o或O命令。因此,命令YP将复制当前行,并将您置于该副本的位置,该位置位于当前行之前。Y是yy的方便缩写。
命令Yp还将复制当前行,并将其放置在当前行之后。您可以给Y多行拉动,从而复制多行。例如,“3YP”将复制三行,并将它们放置在当前行之前。
要在缓冲区中移动文本,您需要在一个地方删除它,然后将其放回另一个地方。您可以在删除操作之前加上要在其中存储文本的缓冲区的名称,例如“ a5dd”,它将在命名缓冲区a中删除5行。然后,您可以将光标移动到这些行的最终放置位置并执行“ ap”或“ ap”以将其放回去。实际上,您可以通过以下命令来切换和编辑另一个文件:放回行:ename形式,其中name是您要编辑的另一个文件的名称。如果进行了更改,则必须编写当前编辑器缓冲区的内容(或丢弃它们),然后编辑器才允许您编辑新文件。
普通的delete命令会将文本保存在未命名的缓冲区中,以便普通的粘贴会将其放回到文件中。但是,更改文件时,未命名的缓冲区会丢失,因此要将文本从一个文件移动到另一个文件,您应该使用命名缓冲区。
移动和重新排列文本的摘要^ | 在线上的第一个非空白字符 |
0 | 线的起点 |
$ | 队伍的尽头 |
) | 转发到下一个句子休息 |
( | 返回上一个句子中断 |
} | 转发到下一段 |
{ | 后退到上一段 |
]] | 转到下一节 |
[[ | 返回上一节 |
fx | 在行中向前查找字符x |
Fx | 在行中向后查找字符x |
p | 在光标后粘贴文本 |
P | 在光标之前粘贴文本 |
y | yan |
Y | 拉整条线 |
t | 转发到字符x,以进行操作 |
TX | 返回字符x,以进行操作 |
查看英文版
高级命令
到目前为止,我们已经看到了如何将文件写入磁盘并退出(ZZ),或者简单地将文件写入并继续编辑(:w)。
如果您更改了文件,但想要不保存而退出,请使用命令:q!。:q命令退出编辑器,但只有在自上次写入(上次保存)以来未进行任何更改的情况下,它才允许您执行此操作。但是,感叹号告诉编辑者“是的,我真的很想这样做。”
同样,您可以使用:ename命令编辑另一个文件,其中name是您要编辑的文件的名称。但是,如果您尚未保存更改,则编辑器将不允许您执行此操作。但是,如果再次使用感叹号(:e!name),编辑器将按照您的要求进行操作:它将放弃所做的更改并打开文件名进行编辑。
如果您没有指定文件名,只需使用命令:e!,编辑器将重新加载您正在处理的文件的保存版本。就像其他文件编辑器中的“还原”命令一样。它将放弃您的更改,并恢复到文件的最后保存版本。
逃脱到壳如果要运行shell命令而不退出编辑器,则可以使用命令:!命令。系统将运行命令command,命令完成后,编辑器将要求您按Enter键,然后返回到编辑屏幕。当要求您按Enter时,您还可以输入另一个:命令。这将运行下一个命令而不重绘屏幕。
如果要完全放在外壳的命令提示符下,请使用命令:sh。这将使您进入外壳,可以像往常一样在其中使用它。完成后,键入Control-D(^ D),您将返回到vi。
在许多系统上,您也可以随时在编辑器内简单地键入^ Z放入您的shell中。从技术上讲,这会将vi置于后台。要返回vi,请在shell命令提示符下键入fg(“ foreground”),vi将再次成为您的前台进程。
标记和返回如前所述,命令``(两个反引号)使您在通过/,/或G之类的命令移动光标后返回到上一个位置。您还可以使用单字母标签标记您在文件中的位置,并在以后返回这些标记。使用命令mx进行标记,其中x是要分配给标记的字母。要返回标记的位置,可以使用命令`x
例如,如果键入ma,则将字母a标记为当前光标位置。然后,如果将光标移动到文件中的其他位置,则始终可以使用命令`a返回到该行。标记会一直保留,直到您开始编辑另一个文件,或者直到您通过将标记设置在其他位置来覆盖标记为止。
当使用诸如d之类的运算符并引用标记的行时,有时您会希望引用所标记的行,而不是该行中的实际光标位置。在任何时候,您都可以使用'x(而不是`x)来引用行本身。因此,命令d`a将删除从当前光标位置到标记a的确切位置的所有内容,而命令d'a将删除直到标记a所在的整行(包括该行)的所有内容。
在没有运算符的情况下使用,'x会将您带到标记x所在行的第一个非空白字符。
调整屏幕如果屏幕图像由于任何原因弄乱了,您可以使用Control-L(^ L)刷新屏幕。
如果您想随时将屏幕居中放置在光标上,请输入z-。要调整屏幕,使光标所在的行位于屏幕顶部,请输入z并按Enter。要调整屏幕,使光标所在的行位于屏幕底部,请键入z。。
zz与z-相同,它将使屏幕居中,使光标所在的线位于屏幕的中心。
查看英文版
专题
编辑器有一组选项,您可以使用:set命令设置。要将选项opt设置为val,请使用命令:set opt = val。
切换选项都可以用下面的命令来设置设置 选择,和取消用命令设置没有选择。
您可以设置以下一些最有用的选项:
选项名称 | 默认值 | 描述 |
---|---|---|
autoindent | noai | 自动缩进 |
autowrite | noaw | 编辑时自动写入文件 |
ignorecase | noic | 搜索时忽略大小写 |
lisp | nolisp | (,{,)和}命令处理S表达式 |
list | nolist | 标签打印为^ I ; 标有$的行尾 |
magic | nomagic | 人物。,[和*在扫描中是特殊的(“魔术”) |
number | nonu | 行以行号开头显示 |
paragraphs | para=IPLPPPQPbpP | LI宏名称以段落开头 |
redraw | nore | 在哑终端上模拟智能终端 |
sections | sect = NHSHH | HU宏名称开始新的部分 |
shiftwidth | sw = 8 | <,>和其他“移位”命令的移位距离 |
showmatch | nosm | 显示匹配(或{位置如)或}被输入,例如 |
showmode | nosmd | 显示输入模式说明 |
slowopen | slow | 插入期间推迟显示更新 |
term | dumb | 您使用的终端类型 |
这些语句可以放在环境变量 EXINIT中,也可以在运行vi时通过在它们前面加上:来给出。
您可以随时在vi中输入:set来查看所有选项及其设置的列表。要查看特定选项的当前设置,请使用命令:set opt ?。
set可以缩写为se。可以在一行上设置多个选项,例如:se ai aw nu。
用:set设置的选项仅在当前编辑器会话中持续。
如果要将缺省设置放入环境变量EXINIT中,以便每次运行vi时都将其加载,则可以用竖线(“ | ”)分隔它们,从而在一行上指定多个命令。例如,如果您的外壳是csh,则可以使用以下外壳命令设置EXINIT:
setenv EXINIT'set ai aw terse | map @ dd | map#x'恢复丢失的线
如果您删除多行然后希望将它们返回,则可能会遇到问题。但是,编辑器将最后删除的9个文本块保存在一组编号为1到9的寄存器中。您可以通过命令“ n p ”将第n个先前删除的文本恢复到文件中。这些文件与命名缓冲区相似,不同之处在于它们引用了先前删除的文本块的编号。
通常,当您键入一个句点(“ 。 ”)时,它会重复您所做的最后一次更改。作为一种特殊情况,当该时间段重复引用带编号的缓冲区的更改时,该数字在重复命令之前递增。让我们看看它是如何工作的,以及为什么有用:
假设您删除了一些重要的内容,并且知道它在您之前的九个块删除之一中,但是您不确定哪一个。如果要返回查看先前删除的所有九个块,可以按照以下方法进行操作:可以使用以下命令
" 1p
粘贴最近删除的文本的内容(缓冲区号1)。如果这不是您想要的文本,则可以撤消(u)并使用重复该命令。,粘贴缓冲区2的命令。换句话说,输入命令
"1pu.u.u.u.
和打字一样
"1pu"2pu"3pu"4pu"5p
并且您可以轻松地返回编号的缓冲区,直到找到要返回的文本。
当然,在上例中,可以使用命令P代替p来将文本放在光标之前而不是光标之后。
恢复丢失的文件如果系统崩溃,您可以在几处更改后恢复所做的工作。回到系统后,使用以下命令启动vi:
vi -r name
其中name是您正在编辑的文件的名称。这将使您的工作恢复到尽可能靠近上次停止的位置。
如果您不使用名称指定文件,而是输入
vi -r
那么您将收到可以恢复的文件列表。
连续文字输入当您输入大量文本时,在右边界附近自动断行很方便。您可以通过给出命令:se wm = 10来引起这种情况。这将导致所有行在距屏幕右边缘至少10列的位置断开。
如果编辑器中断了输入行,并且您希望将其放回原处,则可以告诉它使用J将这些行连接起来。您可以像3J中连接3行那样给J计数要连接的行数。如果合适,编辑器在连接的行的接合处提供空白,并将光标留在该空白处。如果不想,可以用x杀死空白。
编辑程序的功能编辑器具有许多用于编辑程序的命令。程序编辑与文本编辑最不同的地方是程序主体的缩进结构。编辑器有一个自动缩进帮助你生成正确缩进项目设施。
要启用此功能,可以给出命令:se ai。现在尝试用o打开新行,并在几个标签后的行中键入一些字符。如果现在开始另一行,请注意,编辑器在该行的开头提供空白以使其与上一行对齐。您不能在此缩进上退格,但是可以使用^ D键在提供的缩进上退格。
每次键入^ D时,您都将备份一个位置,通常到8列边界。此金额是可设置的;编辑器有一个称为shiftwidth的选项,您可以设置该选项来更改此值。尝试输入命令:se sw = 4,然后再次尝试自动缩进。
为了在程序中左右移动,有运算符<和>。这些将您指定的行右移或左移一个shiftwidth。尝试<<和>>左右移动一行,而
如果您有一个复杂的表达式,并且希望了解括号的匹配方式,请将光标放在左括号或右括号上,然后点击%。这将显示匹配的括号。这也适用于括号{和}和方括号[和]。
如果您正在编辑C程序,则可以使用[[和]]键前进或后退到以{开头的行,即一次声明一个函数。当]]与运算符一起使用时,它将在以}开头的行之后停止。有时对y]]有用。
缓冲区的过滤部分您可以使用运算符在缓冲区的各个部分上运行系统命令!(感叹号)。本质上,它将文件的一部分作为标准输入发送到shell命令,然后用命令的标准输出替换文本的该部分。
总而言之,指定发送什么文本和发送什么命令的方式是!(运动说明符)命令名。该运动-符可以W¯¯对下一个字操作,例如,或}下一个段落,等命令的名称是shell命令,任何参数可能需要。
这对于使用sort命令进行排序特别有用。您可以使用它来对文件中的行进行排序。例如,如果您要输入一个随机单词的列表,每行一个,并以空行结束,那么您将备份到列表的开头,并给出命令!} sort,这将对数据进行排序您刚刚输入就在眼前。这是一个非常强大的功能!自己尝试一下。
用于编辑LISP代码的命令如果您正在编辑一个LISP程序,你应该将选项口齿不清做SE口齿不清:。这将更改(和)命令以在s表达式上向前和向后移动。的{和}命令是像(和),但在原子不停止。这些可用于跳到下一个列表,或快速通过注释。
该自动缩进选项适用不同的LISP,在第一供应缩进对齐参数到最后打开的列表。如果没有这样的参数,则缩进比最后一级多两个空格。
还有另一个对LISP键入有用的选项,即showmatch选项。尝试使用:se sm进行设置,然后尝试键入“ ( “,一些单词,然后输入“” )。注意,光标显示的“位置( ”其中匹配“ )简单地”。仅当匹配的“ ( ”出现在屏幕上,并且光标停留在那里最多一秒钟时,才会发生这种情况。
编辑器还具有一个运算符,用于重新对齐现有的行,就像使用lisp和autoindentset 键入它们一样。这是=运算符。在函数开头尝试命令=%。这将重新对齐函数声明的所有行。
编辑LISP时,[[和]]前进和后退至以(开头的行,这对于处理整个函数定义很有用。
宏vi有一个无参数的宏功能,该功能可让您进行设置,以便在单击单个键时,编辑器的作用就好像您已经按了更长的键序列一样。如果您发现自己重复输入相同的命令序列,则可以进行设置。
宏一般有两种:
- 将宏主体放在命名宏缓冲区x中的位置。然后,您可以键入@ x来调用宏。该@可以再接再@重复上次的宏。
-
您可以将vi中的map命令(通常在EXINIT环境变量中)与以下形式的命令一起使用:
:map lhs rhsCR
将lhs映射到rhs中。有限制:lhs应该是一个按键(1个字符或一个功能键),因为必须在1秒钟之内输入(除非设置了notimeout,在这种情况下,您可以根据需要缓慢键入它,并且vi将等待)您要在回声之前完成它)。lhs不能超过10个字符,rhs不能超过100 个字符。要在lhs或rhs中添加空格,制表符或换行符,应使用^ V对其进行转义。如果在vi内给出map命令,可能需要将^ V加倍。,而不是ex。rhs内部的空格和制表符无需转义。
因此,要使q键写入并退出编辑器,可以给出以下命令
:map q :wq^V^VCR CR
这意味着每当您键入q时,就好像您已经键入了四个字符:wqCR一样。需要一个^ V,因为没有它,回车符将结束:命令,而不是成为地图定义的一部分。之所以有两个^ V,是因为在vi内必须键入两个^ V才能得到一个。第一个CR是rhs的一部分,第二个CR 终止:命令。
宏可以用删除
unmap lhs
如果宏的lhs是“ #0 ”到“ #9 ”,则它将映射特定的功能键,而不是2个字符的“ #”序列。为了使没有功能键的终端可以访问此类定义,形式“ #x ”表示所有终端上的功能键x(并且无需在一秒钟内键入)。可以使用宏以通常的方式更改字符“ # ”:
:map ^V^V^I #
例如使用标签。这不会影响仍然使用#的map命令,而不会影响可视模式的调用。
的撤消命令反转整个宏呼叫作为一个单元,如果所作的任何更改。
在单词映射表之后放置“ ! ”会导致映射应用于输入模式,而不是命令模式。因此,要使^ T在输入模式下与4个空格相同,可以键入:
:map! ^T ^Vb/b/b/b/
其中b /是空白。所述^ V是必要的,以防止坯料被取作之间的空白LHS和RHS。
单词缩写单词缩写与输入模式下的宏类似。这使您可以键入一个简短的单词,并将其扩展为一个或多个更长的单词。这些命令是:abbreviate和:unabbreviate(:ab和:una),并且语法与:map相同。例如:
:ab eecs Electrical Engineering and Computer Sciences
导致“ eecs ” 一词始终更改为“ 电气工程和计算机科学 ”一词。单词缩写与宏的区别在于仅影响整个单词。如果将“ eecs ”键入为较大单词的一部分,则将其保留下来。同样,分词在键入时也会回显。无需将缩写作为单个击键,因为它应该与宏相同。
查看英文版
技术细节
编辑器将长长的逻辑行折叠到显示中的许多物理行上。使行前进的命令使逻辑行前进,并且将以一个动作跳过一行的所有段。命令|将光标移动到特定的列,这可能对于将光标移到长线的中间以将其分成两部分很有用。
编辑器仅在显示屏上显示整行。如果显示屏上没有足够的空间容纳逻辑行,则编辑器将物理行留空,仅在该行上放置一个@作为占位符。当您在哑终端上删除行时,编辑器通常只会将@行清除以节省时间(而不是重写屏幕的其余部分)。您始终可以通过提供^ R命令来最大化屏幕上的信息。
如果需要,可以使编辑器在显示屏上的每一行之前放置行号。输入命令:se nu启用此功能,并输入命令:se nonu将其关闭。通过给出命令:se list,可以将制表符表示为^ I并以“$”表示行尾。:se nolist将其关闭。
最后,当文件的最后一行在屏幕中间时,将显示仅包含字符“〜”的行。这些代表超出文件逻辑末尾的物理行。
更多文件操作命令下表列出了使用vi时可以使用的文件操作命令。
:w | 写回更改 |
:wq | 写并退出 |
:x | 编写(如有必要)并退出(与ZZ相同)。 |
:ename | 编辑文件名 |
:e! | 重新编辑,放弃更改 |
:wname | 编辑,从头开始 |
:e +n | 编辑,从第n行开始 |
:e # | 编辑备用文件 |
:wname | 写文件名 |
:w!name | 覆盖文件名 |
:x,ywname | 写行X通过ÿ到名 |
:rname | 将文件名读入缓冲区 |
:r !cmd | 将cmd的输出读取到缓冲区 |
:n | 编辑参数列表中的下一个文件 |
:n! | 编辑下一个文件,放弃对当前文件的更改 |
:nargs | 指定新的参数列表 |
:tatag | 编辑包含标签tag的文件,位于标签 |
所有这些命令后均带有CR或Esc。最基本的命令是:w和:e。对单个文件的正常编辑会话将以ZZ命令结束。如果您要进行长时间的编辑,则可以在进行大量编辑后偶尔给出:w命令,然后以ZZ结尾。当您编辑多个文件时,可以用:w结尾一个文件,并通过给出:e命令开始编辑新文件,或者设置自动写入并使用:nfile。
如果您对文件的编辑者副本进行了更改,但又不想将其写回,则必须输入!!在命令之后,您将否则使用;这将迫使编辑器放弃您所做的任何更改。请谨慎使用。
的:电子命令可以给出+参数在该文件的末尾开始,或+Ñ参数在一行开始Ñ。实际上,n可以是任何不包含空格的编辑器命令,有用的是类似+ /pat或+?的扫描。拍拍。在为e命令形成新名称时,可以使用字符%替换为当前文件名,或使用字符#替换为备用文件名。备用文件名通常是您键入的姓氏,而不是当前文件。因此,如果您尝试执行:e并得到尚未写入文件的诊断信息,则可以给出:w命令,然后给出:e#命令以重做先前的:e。
可以通过找出该绑定到使用被写入的范围的线写缓冲区的一部分到一个文件^ g,和之后给予这些数字:和前瓦特,通过分离,的。您也可以用m标记这些行,然后在w命令上使用格式为'x,'y的地址。
您可以使用:r命令在当前行之后将另一个文件读入缓冲区。您可以类似地从命令中读取输出,只需使用!cmd而不是文件名即可。
如果要连续编辑一组文件,可以在命令行上给出所有名称,然后使用命令:n依次编辑每个文件。也可以通过给:n命令一个文件名列表或一个要扩展的模式来重新指定要编辑的文件列表,就像您在初始vi命令中指定的那样。
如果您正在编辑大型程序,您会发现:ta命令非常有用。它利用功能名称及其位置的数据库(可以由ctags之类的程序创建)来快速查找您提供其名称的功能。如果:ta命令要求编辑器切换文件,则必须:w或放弃任何更改,然后再切换。您可以重复:ta命令,不带任何参数来再次查找相同的标签。
有关搜索字符串的更多信息当使用/和?在文件中搜索字符串时。,编辑器通常会将您置于字符串的下一个或上一个出现的位置。如果您使用的运算符是d,c或y,那么您很可能希望影响到包含模式的行之前的行。你可以给一个搜索形式/拍/ -ñ来指代ñ“日行下一行之前包含拍拍,或者您可以使用+而不是-来指代线包含一个后拍。如果您不提供行偏移量,那么编辑器将影响到匹配位置的字符,而不是整行。因此使用“+0”影响匹配的行。
通过提供命令:se ic,可以使编辑器在搜索时忽略单词的大小写。:se noic命令关闭此功能。
提供给搜索的字符串实际上可能是正则表达式。如果您不需要或不需要此功能,则应
set nomagic
在您的EXINIT中。在这种情况下,只有字符^和$在模式中是特殊的。然后,字符\也很特殊(因为它在系统中的每个地方都是最多的),可用于获取扩展的模式匹配工具。在向前扫描中的/之前或\之前还必须使用\。在任何情况下都可以向后扫描。下表列出了设置魔术后的扩展形式。
^ | 在模式的开头,匹配行的开头 |
$ | 在模式末尾,与行尾匹配 |
. | 匹配任何字符 |
\ < | 匹配单词的开头 |
\> | 匹配单词的结尾 |
[str] | 匹配str中的任何单个字符 |
[str] | 匹配任何不在str中的单个字符 |
[x-y] | 匹配x和y之间的任何字符 |
* | 匹配任意数量的前面的模式 |
如果您使用魔法模式,则。[和*原语以\开头。
有关输入模式的更多信息在输入模式下,可以使用许多字符进行更正。下表总结了这些内容。
^H | 删除最后一个输入字符 |
^W | 删除由b定义的最后一个输入词 |
erase | 您的擦除字符,与^ H相同 |
Kill | 您的杀死角色,删除此行的输入 |
\ | 逃脱后面的^ H,然后擦除并杀死 |
Esc | 结束插入 |
Del | 中断插入,异常终止 |
CR | 开始新的一行 |
^D | 自动缩进 |
0^D | 杀死所有自动缩进 |
^^D | (caret-control-D)与0 ^ D相同,但恢复缩进的下一行 |
^V | 引用文件中的下一个非打印字符 |
对输入进行更正的最常用方法是键入^ H来纠正单个字符,或者键入一个或多个^ W来支持不正确的单词。如果在常规系统中将#用作擦除字符,它将像^ H一样工作。
您的系统终止字符(通常为@,^ X或^ U)将删除您在当前行上输入的所有内容。通常,您既不能擦除行边界周围的输入,也不能擦除使用此插入命令未插入的字符。要在开始新行之后对上一行进行更正,您可以按Esc键结束插入,移至上方进行更正,然后返回要继续的位置。附加在当前行末尾的命令A通常对于继续操作很有用。
如果您希望输入擦除或杀死字符(例如#或@),则必须在其前面加上\,就像在普通系统命令级别上那样。键入非打印字符到文件的更一般的方式是用先于他们^ V。所述^ V回波作为^字符在其上光标休止符。这表明编辑器希望您键入控制字符。实际上,您可以键入任何字符,然后它将被插入文件中。
如果您正在使用自动缩进,你可以通过它提供通过键入缩进BACKTAB^ d。这备份到一个shiftwidth边界。这仅在提供的autoindent之后立即起作用。
使用自动缩进时,您可能希望在行的左边缘放置一个标签。可以轻松地做到这一点的方法是输入^然后^ d。编辑器将光标移到左边距为一行,然后在下一行恢复上一个缩进。如果您希望取消所有缩进并且不让它回到下一行,也可以键入0,然后紧跟一个^ D。
仅大写的终端如果您的终端只有大写字母,您仍然可以通过使用常规系统约定在此类终端上打字来使用vi。通常将键入的字符转换为小写,并且可以在它们前面加上\来键入大写字母。字符{〜}|`在此类终端上不可用,但您可以将它们转义为\(\ ^\)\!\'。这些字符以与键入相同的方式显示在显示屏上。
Vi和Exvi实际上是在ex编辑器中进行编辑的一种模式。运行vi时,可以通过给出命令Q转到ex的面向行的编辑器。上面介绍的所有:命令都可以在ex中获得。同样,大多数ex命令可以使用:从vi调用。只要给他们不带:,然后给他们加上CR。
在极少数情况下,vi可能会发生内部错误。在这种情况下,您将得到诊断,并处于ex的命令模式下。然后,您可以保存您的工作,如果你希望通过给命令退出X之后的:它的前提示您,或者您也可以重新进入VI通过给前一个VI命令。
有一些东西,你可以在做更容易EX比六。面向生产线的材料的系统更改特别容易。编辑者可以读取高级编辑文档编找出了很多有关这种风格的编辑。有经验的用户经常将ex命令模式和vi命令模式混合使用,以加快工作速度。
查看英文版
快速参考
这是所有最有用的vi命令的摘要。任何时候需要快速记住vi的任何功能时,都可以参考它。
进入/离开编辑器在命令行中:
|
启动vi并加载文件名 | |
vi+nname | 启动vi并加载文件名,将光标放在第n行 | |
vi-ttag | 启动vi,然后从标签开始编辑 | |
vi-r | 列出可以恢复的文件 | |
vi-rname | 启动vi,并恢复以前编辑的文件名 | |
viname1name2... | 启动vi,加载文件name1进行编辑;使用:n命令加载任何其他命名的文件 | |
vi-Rname | 启动vi,并以只读模式加载文件名 |
在vi内部:
ZZ | 从vi退出,保存更改 |
^Z | 后台vi并返回到命令外壳。使用fgshell内置命令恢复前台vi操作 |
:w | 写入更改(保存文件) |
:wq | 写更改(保存)并退出 |
:q | 如果没有未保存的更改,请立即退出 |
:q! | 立即退出,丢弃所有未保存的更改 |
:ename | 编辑文件名 |
:e! | 恢复为当前文件的最后保存版本 |
:e+name | 加载要编辑的文件名,将光标置于文件末尾 |
:e+nname | 从第n行开始加载要编辑的文件名 |
:e# | 编辑备用文件 |
^^ | (控制符)。:e#的同义词 |
:wname | 写入文件名(另存为...) |
:w!name | 覆盖文件名 |
:sh | 放入命令行外壳;^ D返回 |
:!cmd | 运行shell命令cmd,然后返回至vi |
:n | 编辑指定为vi参数的下一个文件 |
:nargs | 指定文件的新参数列表VI来编辑 |
:f | 显示正在编辑的当前文件和当前行数 |
^G | :f的同义词 |
:tatag | 标记文件条目标记 |
^] | 与:ta相同,以下单词是标签 |
^F | 向前一屏 |
^B | 向后一屏 |
^D | 向下滚动半屏 |
^U | 向上滚动半屏 |
numG | 转到线NUM(如果最后一行NUM不指定) |
/pat | 搜索模式拍的下一次出现 |
?pat | 搜索先前出现的图案拍 |
n | 沿最后搜索方向重复最后搜索 |
N | 重复最后搜索,与最后搜索方向相反 |
/pat/+n | 在下一次出现模式pat之后搜索到第n行 |
?pat?-n | 在上一次出现模式pat之前搜索到第n行 |
]] | 移至下一部分/功能 |
[[ | 移至上一部分/功能 |
% | 查找匹配的(,),{或} |
的Esc键键离开每个下面的文本输入模式,除了[R,这是仅用于输入单个字符。
i | 插入方式:在光标之前插入文本 |
a | 追加模式:将文本追加到光标之后 |
A | 文本被添加到该行的末尾 |
I | 文本插入到行的开头 |
o | 在当前行之后打开新行以输入文本 |
O | 在当前行之前打开新行以输入文本 |
rx | 用字符x替换光标下的字符 |
R | 替换多个字符 |
H | 将光标移动到窗口的第一行(“主页”) |
L | 将光标移到窗口的最后一行 |
M | 将光标移到窗口的中线 |
+ | 将光标移动到下一行的第一个非空白字符 |
- | 将光标移动到上一行的第一个非空白字符 |
CR | (回车/ Enter键。)与+相同 |
downorj | 下一行,同一列 |
upork | 前一行,同一列 |
^ | 将光标移到行上的第一个非空白字符 |
0 | 将光标移到行首 |
$ | 将光标移到行尾 |
rightorlorSPACE | 将光标向前移动一个字符 |
leftorhor^H | 将光标移回一个字符 |
fx | 查找该行中字符x的下一个出现 |
Fx | 查找该行中字符x的上一次出现 |
tx | 向上移动到X向前 |
TX | 向后移回x |
; | 重复最后一个f,F,t或T |
, | 逆; |
num| | 移至第num列 |
(这些命令中的每个命令都可以使用两次来影响整行):
d | 删除 |
C | 更改(例如删除,但将您置于插入模式下以输入应更改为的文本) |
< | 左移线shiftwidth空格数 |
> | 右移线shiftwidth空格数 |
!(movement-command)shell-command | 通过shell命令过滤文本 |
= | 缩进LISP |
y | 将线拉入缓冲区 |
w | 向前的话 |
b | 向后单词 |
e | 字尾 |
) | 下一个句子休息 |
} | 到下一段 |
( | 到上一个句子的中断 |
{ | 至上一段 |
W | 下一个以空格分隔的单词 |
B | 到前一个以空格分隔的单词 |
E | 到以空格分隔的单词的末尾 |
p | 光标后粘贴 |
P | 在光标之前粘贴 |
“Xp | 从缓冲区x粘贴 |
“Xÿ | 拉入缓冲区x |
“Xd | 删除到缓冲区x |
u | 撤消上一次更改 |
u | 恢复当前行 |
. | 重复上一次更改 |
“dp | 找回Ð日最后一个删除 |
`` | 转到先前的位置 |
'' | 转到先前的位置,在行中的第一个非空白处 |
mx | 用字母x标记位置 |
`x | 移到标记为x的位置 |
'x | 移动到行中第一个非空白字符x的位置 |
C | 换行 |
D | 删除其余行 |
s | 替代字符 |
S | 替代线 |
J | 连接线 |
x | 删除单个字符 |
X | 删除光标前的单个字符 |
y | 拉线和yy一样 |
^L | 清除并重画 |
z(Enter) | 重画屏幕,当前行在顶部 |
z- | 重画屏幕,当前行在底部 |
z. | 以当前行为中心重绘屏幕 |
zz | 与z相同。 |
^E | 向下滚动窗口一行(但不要移动光标) |
^Y | 向上滚动窗口一行(但不要移动光标) |
dw | 删除一个词 |
de | 删除一个单词,保留其所有标点符号不变 |
dd | 删除一行 |
3dd | 删除3行(例如) |
cwnew | 改成新词 |
eas | 将单词复数(在其末尾加s) |
xp | 转置两个字符 |
vi myfile.txt
编辑文件myfile.txt。
查看英文版