vi 或 vedit 命令

用途

以全屏显示方式编辑文件。

语法

{ vi | vedit } [ -l ] [ -R ] [ -tTag ] [ -v ] [ -wNumber] [ -yNumber ] [ -r [ File ]] [{ + | -c } { 子命令 }] [ File ...]

描述

vi 命令启动基于基础 ex 编辑器的全屏编辑器。 因此,ex 子命令可以在 vi 编辑器中使用。 vedit 命令启动适用于初学者的 vi 编辑器版本。 在 vedit 编辑器中,报告选项设置为 1,设置了 showmode 选项和 novice 选项,使其成为一个行编辑器。

您可以通过指定要编辑的文件名启动 vi 编辑器。 如果在命令行上提供多个 File 参数,vi 编辑器按指定的顺序编辑每一个文件。 现有文件上的 vi 编辑器在屏幕末尾显示文件的名称,行数和字符数。 在多字节语言环境的情况下,字符数要解释成字节数。

由于 vi 编辑器是全屏编辑器,所以可以逐屏编辑文本。 vi 编辑器在编辑缓冲区为正在编辑的文件制作副本,并且文件内容直到保存更改才会更改。 光标在显示屏幕上的位置表明它在文件中的位置,并且子命令在光标位置影响该文件。

vi 编辑器限制

以下列表提供了 vi 编辑器的最大限制。 这些计数采用单字节字符集。

  • 每个全局命令列表最多包含 256 个字符
  • 在一个 shell 转义命令中最多包含 2048 个字符
  • 在一个字符串值选项中最多包含 128 个字符
  • 在一个标记名中最多包含 30 个字符
  • 最多包含 128 个映射宏,总共 2048 个字符
  • 默认限制最多包含 1,048,560 行
  • 宏名和宏文本被限制在 100 个字符内。
注: vi 编辑器支持最多 2 GB 的编辑缓冲区。
vi 编辑方式

vi 编辑器按以下方式操作:

描述
命令方式 当启动 vi 编辑器时,它处于命令方式。 您可以输入任何子命令,除了那些指定仅用于文本输入方式的子命令。 当子命令和其他方式结束时,vi 编辑器返回命令方式。 按 Esc 键取消子命令。
文本输入方式 在此方式中使用 vi 编辑器来添加文本。 使用以下任何子命令输入文本输入方式: A 子命令, A 子命令, 子命令, 子命令, O 子命令, O 子命令, CX 子命令 (其中 X 表示子命令的作用域) , C 子命令, S 子命令, S 子命令和 R 子命令。 输入这些子命令之一后,即可输入文本到编辑缓冲区中。 要返回命令方式,按 ESC 键正常退出或按“中断”(Ctrl-C 按键顺序)非正常结束。
最后一行方式 带有前缀 : (冒号) , / (斜杠) , ? 的子命令 (问号) , ! (惊叹号) 或 !! (两个感叹号) 在屏幕结束时显示的行上读取输入。 当您输入初始字符时, vi 编辑器会将光标放置在屏幕的末尾,您可以在其中输入命令的剩余字符。 按 Enter 键运行该子命令,或按“中断”(Ctrl-C 按键顺序)取消它。 当 !! 使用前缀,光标仅在输入两个感叹号后移动。 当使用 : 前缀进入最后行方式时,如果在指定计数的命令之前使用以下字符,vi 编辑器赋予它们特定含义:
%
所有行,而不管光标的位置
$
最后行
.
当前行
注: 可以使用向上方向键和向下方向键来浏览最后一行方式子命令的历史记录。
定制 vi 编辑器
可以按照以下定制 vi 编辑器:
  • 设置 vi 编辑器选项
  • 定义宏
  • 映射键
  • 设置缩写
设置 vi 编辑器选项
以下列表描述可以使用 set 命令更改的 vi 编辑器选项。 这些选项的缺省设置是 off。 如果打开了这些开关选项中的一个选项,在选项之前输入 no 即可重新关闭它。 如果想中断 autowrite vi 选项,那么输入 noaw,其中 no 关闭选项,aw 指定 autowrite 选项。
注: 输入 vi 选项时不包含括号。
vi 选项(缩写) 描述
autoindent (ai) 通过使用 希夫特 选项指定的制表符停止位之间的间距,在 文本输入方式 中自动缩进到上一行的缩进。 缺省值为 noai。 要将光标退回到前面的制表符停止位,请按 Ctrl-D 按键顺序。 该选项对于全局命令不起作用。
autoprin (ap) 在任何更改编辑缓冲区的命令后面打印当前行。 缺省值为 ap。 该选项只应用于一行上一系列命令中的最后一个命令,并且对全局命令不起作用。
autowrite (aw) 在执行:n子命令、:ta子命令、Ctrl-A、Ctrl -] 和 Ctrl-T键序列以及.NET命令之前,自动将编辑缓冲区写入文件! 子命令 (如果自最后一个 子命令以来编辑缓冲区发生更改)。 缺省值为 noaw
backtags (bt) 允许 Ctrl-T 子命令将文件编辑位置返回到先前发出 Ctrl-] 子命令的位置。 如果设置了 nobacktags ,那么 Ctrl-T 将与 Ctrl-] 相同。 缺省值为 背景标签
beautifying text (bf) 在文本输入(除了制表符、换行符和换页指示符)的过程中,防止用户在编辑缓冲区中输入控制字符。 缺省值为 nobf。 此选项应用于命令输入。
closepunct (cp=) 处理结束标点列表,特别当文本自动换行(wraptype 选项)时。 在多字符标点符号前面加上字符数; 例如:cp=3..;)}. 命令在回绕时不分割关闭标点。
directory (dir=) 显示包含编辑缓冲区的目录。 缺省值为 dir = /var/tmp
edcompatible (ed) 在多重替换过程中,保留 g(全局)和 c(确认)子命令后缀,并使 r(读取)后缀像 r 子命令一样工作。 缺省值为 noed
exrc (exrc) 如果未设置该标志,那么在初始化过程中忽略当前目录下任何 .exrc 文件,除非当前目录是 HOME 环境变量命名的。 缺省值为 noexrc
hardtabs (ht=) 告诉 vi 编辑器显示屏幕上硬件制表符停止位之间的距离。 (该选项必须与基础的终端或终端仿真器的制表符设置相匹配。) 缺省值为 ht=8
history (hist=) 设置对最后行方式历史记录命令的限制。 初始值为 hist=32tvi 命令的历史记录大小为零 (hist=0)。
ignorecase (ic) 当搜索正则表达式时,忽略大写和小写之间的区别。 缺省值为 noic
linelimit (ll=) 设置最大行数,如每个 -y 命令行选项。 该选项只有和 .exrc 文件或 EXINIT 环境变量配合使用时有效。
lisp (lisp) 除去 ( ), { }, [ [ 和 ] ] 的特殊意义,并为 s 表达式启用 =(格式化打印)运算符,以便能够编辑表处理(LISP)程序。 缺省值为 nolisp
list (list) 显示带有制表符 (^ I) 和标记的行结束符 ($) 的文本。 缺省值为 诺利斯特
magic (magic) 处理。 (句点) , [(左括号) 和 * (星号) 字符作为搜索模式时使用的特殊字符。 在关闭方式中,只有 ( )(圆括号)和 $(美元符)保持特殊意义。 但是,可以通过在其他字符前面加上 \ (反斜杠) 来激活其特殊意义。 缺省值为 magic
mesg (mesg) 如果以可视方式设置,打开对终端的写入许可权。 该选项只有和 .exrc 文件或 EXINIT 环境变量配合使用时有效。 缺省值为 on
modeline (modeline) 如果在文件开始五行或最后五行中找到 vi 编辑器命令行,那么运行该命令行。 vi 编辑器命令行可以位于一行中的任意位置。 要使 vi 编辑器能够识别命令行,该行必须包含空格或制表符,后跟ex:vi:请指定有效字符串。 命令行以第二个 :(冒号)结束。 vi 编辑器尝试将第一个和第二个冒号之间的任意数据解释为 vi 编辑器命令。 缺省值为 nomodeline
novice 指明是否处于 novice 方式。 您不能使用 set 命令更改该值。
number (nu) 以行号作为前缀显示行。 缺省值为 nonu
optimize (opt) 加速缺少光标寻址的终端的操作。 缺省值为 noopt
paragraphs (para=) 定义开始段落的 vi 宏名。 缺省值为 para=IPLPPPQPP\ LIpplpipnpbp。 如果重新指定了一个段落,单字母 nroff 宏(如 .P 宏)必须将空格包含为被引用字符。
partialchar (pc=) 出现在最后的显示列,该列中双宽字符不能完全显示。 缺省字符为 -(负号)。
prompt 当处于命令方式时,通过打印 :(冒号)提示输入新的 vi 编辑器命令。 缺省值为 on
readonly (ro) 设置永久的只读方式。 缺省值为 noreadonly
redraw (redraw) 在哑工作站上模仿智能工作站。 缺省值为 nore
remap 允许根据其他宏来定义宏。 缺省值为 on
report (re=) 设置在消息显示之前命令能重复的次数。 对于产生许多消息的子命令,例如全局子命令,完成命令序列后显示消息。 缺省值为 report=5。
scroll (scr=) 设置用户上下滚动窗口内容时滚动的行数。 缺省值为窗口大小的 1/2,向下舍入。
sections (sect=) 定义开始段落的 vi 宏名。 缺省值为 sect=NHSHHH\ HUuhsh+c。 如果重新指定了一个段落,单字母 nroff 宏(如 .P 宏)必须将空格包含为被引用字符。
shell (sh=) 定义用于 ! 的 shell 子命令或 :! 子命令. 缺省值为登录 shell。
shiftwidth (sw=) 设置 自动缩进 选项, shift 命令 ( >< )以及文本输入命令 ( Ctrl-D 和 Ctrl-T 键序列) 所使用的软件制表符停止位的距离。 vi 选项只影响行首的缩排。 缺省值为 sw=8
showmatch (sm) 当如输入 )(右圆括号)或 } (右花括号)时显示 ((匹配的左圆括号)或 { (左花括号)。 缺省值为 nosm
showmode (smd) 当 vi 编辑器处于输入方式时显示消息加以指明。 缺省值为 nosmd
slowopen (slow) 在插入期间,延迟更新显示屏幕。 缺省值为 noslow
tabstop (ts=) 在显示的文件中设置制表符停止位之间的间距。 缺省值为 ts=8
tags (tags =) 定义使用 标签 命令创建的功能名称的数据库文件的搜索路径。 缺省值为 tags=tags\ /usr/lib/tags
term (term=) 设置正在使用的工作站类型。 缺省值为 term=$TERM,其中 $TERMTERM shell 变量的值。
terse (terse) 允许 vi 编辑器显示消息的短格式。 缺省值为 noterse
timeout (to) 为字符的输入设置两秒的时间限制。 当设置 timeout 选项时,此限制容许宏中的字符作为单独的字符输入和处理。 要恢复宏的使用,请设置 notimeout 选项。 缺省值为
ttytype 为正在使用的终端指明 tty 类型。 不能从 vi 编辑器更改此值。
warn (warn) ! 之前显示警告消息 如果是在编辑缓冲区中进行更改但未写入文件后首次发出 shell 命令,那么子命令将执行 shell 命令。 缺省值为 warn
window (wi=) 设置显示在一个文本窗口中的行数。 缺省值取决于操作时使用的波特率:如波特率为 600 波特或更少,那么缺省值为 8 行;如波特率为 1200 波特,那么缺省值为 16 行;如波特率为更高的速率,那么缺省值为全屏减去 1 行。
wrapmargin (wm=) 设置从一行到下一行自动换行的页边距。 缺省值为 wm=0。 值 0 0 将关闭自动换行。
wrapscan (ws) 允许字符串搜索从编辑缓冲区结尾处自动换行到下一行首部分。 缺省值为 ws
wraptype (wt=) 指明用于在行尾使单词换行的方法。 缺省值为 general。 可以指定下列四个值中的一个值:
一般
允许在单词中断处(如两个字符之间的空白)自动换行。 此设置为缺省值。
字 (word)
允许在单词上自动换行。
僵硬
允许在列上和结束标点之前自动换行。
灵活的
允许在列上自动换行,但是一个标点符号可以扩展到超过页边距。
writeany (wa) 关闭通常在 子命令之前进行的检查。 缺省值为 nowa

要查看已从缺省设置更改的 vi 编辑器设置的列表,请输入:set然后按下空格键。 按 Enter 键返回到命令方式。

要查看 vi 编辑器设置的完整列表,请输入set all。按 Enter 键以返回到命令方式。

要打开 vi 编辑器选项,请输入set Option。此命令会自动使您返回到命令方式。

要打开多个 vi 编辑器选项,请输入set Option Option Option。此命令打开三个指定的 vi 编辑器选项并使您返回到命令方式。

要关闭 vi 编辑器选项,请输入set noOption。此命令会自动使您返回到命令方式。

要更改 vi 编辑器选项的值,请输入set Option=Value。此命令会自动使您返回到命令方式。

可以使用 vi 编辑器的 :set 子命令来仅为此编辑会话设置选项,或为此编辑会话和所有将来的编辑会话设置选项。

只为此编辑会话设置或更改 vi 编辑器选项,请从命令行输入 :set 子命令。

要为所有编辑会话设置 vi 选项,将 :set 子命令放置在 .profile 文件(由 shell 在登录时读取)的 EXINIT 环境变量中,或将 set 子命令放置在 .exrc 文件中。 vi 编辑器首先查找 EXINIT 环境变量并运行其命令。 如果 EXINIT 环境变量不存在,那么 vi 编辑器查找 $HOME/.exrc 文件并运行其命令。 最后,不管以前的结果如何,vi 编辑器查找本地 .exrc 文件并运行其命令。
注: 此过程为 true ,但使用 特维 命令 (trusted vi) 时除外。 在此情况下,vi 编辑器查找并只运行 /etc/.exrc 文件。

有关通过设置 EXINIT 环境变量来更改选项的信息,请参阅 环境 文件中对环境变量的描述。

.exrc 文件可以包含 set Option=Value; 格式的子命令,例如:
set cp=3 . . ;

要在 .exrc 文件中包含注释,请将 "(双引号)作为该行的第一个字符。

定义宏

如果经常使用一条子命令或一系列子命令,可以使用 vi 编辑器来定义发出子命令或子命令序列的宏。

要定义一个宏,请将子命令序列输入到以字母表中一个字母命名的缓冲区中。 小写字母 a 到 z 覆盖缓冲区的内容,大写字母 A 到 Z 将文本附加到缓冲区先前的内容,这样可以逐块构建宏。

例如,要定义名为 c 的缓冲区宏以搜索单词 corner 并使单词 corner 后的第三行成为当前行,请输入以下命令:
o /corner/+3

然后按 ESC 键并输入以下命令:

"c

其中 c 是缓冲区宏的名称。

要将文本添加到已定义缓冲区的先前内容,请输入o viSubcommand,按 Esc 键,然后输入"CapitalLetter,其中 CapitalLetter 变量指定大写字母 A 到 Z。 例如,要构建名为 T 的缓冲区宏以搜索单词 corner 并允许您添加更多命令,请输入以下命令:

o corner
然后按 ESC 键并输入以下命令:
"T

其中 T 是缓冲区宏的名称。 任何时候都可以重复本过程将更多的 vi 子命令添加到相同的缓冲区。

例如,要添加移动光标到前面行并删除该行的命令,请输入以下命令:
o -dd
这里 -(负号)意为将光标上移一行,而 dd 表示删除当前行。 按 ESC 键并输入以下命令:
"Tdd

要启动宏,请输入@Letter,其中 信件 变量指定您要使用的缓冲区宏的字母名称。 要再次使用同一宏,请输入@@(两个 at 符号)。 例如,输入@T以启动 T 缓冲区宏,并运行 搜索移动光标删除行 命令。 输入@@T以再次启动 T 缓冲区宏。

系统使用的字符集通过整理表定义。 该表影响 vi 宏的性能。

映射键

您可以使用 :map:map!, 以及 :ab 子命令,用于将击键映射到命令或命令序列。 :map 子命令在命令方式中使用。 :map!:ab 子命令在文本输入方式下使用。 可以为此编辑会话和所有以后的编辑会话映射键,或者仅为当前编辑会话(以两种方式中的一种方式)映射键。

为所有以后的编辑会话映射键,请将子命令置于 $HOME/.exrc 文件中。 vi 编辑器每次启动时会读取此文件。 映射保持对每一次编辑会话有效。

要从命令方式仅为当前编辑会话映射键,请在执行 vi 编辑器会话期间启动该子命令。 要只通过文本输入方式为当前编辑会话映射键,请在 vi 编辑器会话期间在命令行上输入子命令。 映射保持仅对当前编辑会话有效。

请注意如果使用IBM®3161 ASCII 显示站、IBM3163 ASCII 显示站或IBM3101 ASCII 显示站,vi 编辑器的默认键映射可能会导致数据丢失。 要查看缺省映射,请发出 :map 子命令。 ESC-J 或 Shift-J 按键顺序产生特殊的问题。 这些按键顺序删除从光标的当前位置到文件尾所有的信息。 为了避免出现问题,请使用 .exrc 文件来更改此按键顺序。

:map :map!, 并且 :ab 子命令按如下所示定义和使用:

描述
:map 在命令方式中定义宏。 在 vi 编辑器中,:map 子命令允许通过按单一键来运行指定的命令或命令序列。

要在命令方式中映射键,启动带空的编辑缓冲区的 vi 编辑器而不使用 vi 命令 命名 vi 文件或在 vi 编辑器启动后输入任何东西到缓冲区。 可以使用 :map 子命令完成以下任务:

  • 要将字符映射到编辑命令序列,请输入:
    :map Letter viSubcommand
  • 要在命令方式中取消先前映射的字符,请输入:
    :unmap Letter
  • 要为命令方式显示当前映射列表,请输入:
    :map

vi 编辑器不使用以下键,但是可以在命令方式中和 :map 子命令配合使用这些键:

  • 字母 s、g、K、q、V 和 v
  • 控制键序列 Ctrl-A、Ctrl-K、Ctrl-O、Ctrl-W 和 Ctrl-X
  • 符号 _(下划线), *(星号), \ (反斜杠) 和 =(等号)

尽管可以映射已被 vi 编辑器使用的键,但只要映射有效,就无法使用键的常用功能。 有些终端允许将命令序列映射到功能键。 如果处于 LISP 方式,那么不能使用 =(等号),因为它已由 vi 编辑器使用。

将字母 v 映射到命令序列,这些命令将查找下一次出现的单词map并将其更改为单词MAP,输入以下命令:

:map v /map<Ctrl-V><Enter>cwMAP<Ctrl-V><Esc><Ctrl-V><Enter>

上一个示例指示 vi 编辑器查找下一次出现的map(/map<Ctrl-V><Enter>) ,更改mapMAP(cwMAP) ,结束更改字子命令 (<Ctrl-V><Esc>),并输入命令(<Ctrl-V><Enter>).

需求: 要阻止 vi 编辑器解释 Enter 键,映射时必须在该键前面加上 Ctrl-V 键序列。 此情况对 Esc、Backspace 和 Delete 键也成立。

要映射控制字符 Ctrl-A、Ctrl-K 和 Ctrl-O,同时按 Ctrl 键和相应的字母。 例如,要将 Ctrl-A 按键顺序映射到保存文件和编辑系列中下一个文件的命令序列,请输入以下命令:

:map <Ctrl-A> :w<Ctrl-V><Enter>:n<Ctrl-V><Enter>

要映射控制字符 Ctrl-T、Ctrl-W 和 Ctrl-X,必须首先用 Ctrl-V 按键顺序为它们转义。

 

要映射 |(管道符),首先必须用两个 Ctrl-V 按键顺序为它转义,这通过以下示例说明:将字符 g 映射到命令序列,该命令序列转义到 shell,连接文件 /etc/motd 并输出到 wc 命令:

:map g :!cat /etc/motd <Ctrl-V><Ctrl-V>| wc<Ctrl-V><Enter>

如果终端允许映射功能键,必须用 #number 按键顺序引用它们,以指定想映射的功能键的号码。 在下例中,F1 功能键映射到删除一个单词并将光标下移三个单词的命令序列:

:map #1 dwwww

为了使功能键映射起作用,功能键给终端类型的输出必须和 terminfo 文件中定义的输出相匹配。 这些定义由 kfnumber 条目表示,其中,kf1 代表 F1 功能键,kf2 代表 F2 功能键,等等。 如果当按功能键时所获取的输出与此条目不匹配,在任何映射可以发生之前,必须使用终端的设置方式去纠正设置以便和这些终端数据库条目相匹配。

也可以映射某些键盘特殊键,如 Home、End、Page Up 和 Page Down 键。 对于大多数的终端,这些键已经在 vi 编辑器中映射。 可以通过使用 :map 子命令验证此映射。 如果这些键还没有映射,可以如下使用 :map 子命令:

:map <Ctrl-V><End> G
:map <Ctrl-V><Home> 1G
:map <Ctrl-V><PageUp> <Ctrl-F>
:map <Ctrl-V><PageDown> <Ctrl-B>

要在命令方式中获取所有当前映射列表,请输入 :map 子命令。 则前例显示如下:

v       v          /map<Ctrl-M>cwMAP<Ctrl-[>Ctrl-M>
<Ctrl-A>  <Ctrl-A>   :w<Ctrl-M>:n<Ctrl-M>
g         g          :!cat /etc/motd | wc <Ctrl-M>
提示: Ctrl-V 和 Enter 键序列显示为 Ctrl-M 键序列,而 Ctrl-V 和 Escc 键序列显示为 Ctrl-[键序列。
:map! 当处于文本输入方式时,将字符串映射到单个键。 要在文本输入方式中映射键,启动带空的编辑缓冲区的 vi 编辑器而不使用 vi 命令命名 vi 文件或在 vi 编辑器启动后输入任何内容到缓冲区。 您可以使用 :map! 子命令完成以下任务:
  • 要在文本输入方式中映射一个字母到一个或多个 vi 字符串,请输入:
    :map! Letter String
  • 要在文本输入方式中取消先前映射的字母,请输入:
    :unmap! Letter
  • 要显示在文本输入方式中已映射到特殊键的现有字符串列表,请输入:
    :map!

当处于文本输入方式时,输入映射键会生成指定的字符串。 Ctrl-V 和 Esc 按键顺序进入命令方式,回到当前单词的开始(bbw),并启动 cw(change-word)子命令。 例如:

:map! % <Ctrl-V><Esc>bbwcw

当输入文本时,如果意识到已经输错了一个单词,可以通过按 %(百分号)键并重新输入该单词。 编辑器自动返回到插入方式。

重要信息: 选择要用于 :map! 的密钥时请务必小心 子命令后面的 !(感叹号)提示。 在映射键后,如果不先发出 : 取消映射! ,那么不能再将其作为文本输入。 子命令后面的 !(感叹号)提示。
:ab 将键或按键顺序映射到字符串以用于文本输入方式。 当输入具有几个重复的短句、名称或标题时,:ab 子命令十分有用。

以下示例将替换单词city用短语Austin, Texas 78759无论何时以文本输入方式输入,且后跟空格,句点或逗号:

:ab city Austin, Texas 78759

例如,如果在输入文本时,您输入以下内容:

My current residence is city.

按 Tab 键将展开单词city阅读:

My current residence is Austin, Texas 78759.

缩写在单词中不扩展。 例如,如果您输入My current residence iscity,字 iscity 不展开。

如果 :map! 子命令用于映射插入方式的缩写,那么所有出现的缩写都将展开,而不考虑出现的位置。 如果您使用了 :map! 上一个示例的子命令 (:map! city Austin, Texas 78759),那么每当您输入单词时city,无论前面或后面是什么,这个词将被展开到Austin, Texas 78759. 因此,该词iscityisAustin, Texas 78759.

重要信息: 在选择用于 :ab 子命令的键时请务必小心。 一旦键已定义,除非先发出 :unab 子命令,否则它们就不能再作为文本输入。
设置缩写

集合 命令具有与 地图! 类似的行为 命令,但 集合 命令仅当缩写是单独的单词时,才会将字符串替换为缩写。 可以 使用 vi 编辑器的 set 命令完成以下任务:

  • 列出现有的缩写
  • 除去缩写
  • 设置(定义)缩写
    提示: 使用空的编辑缓冲区启动 vi 编辑器。 不要使用 vi 命令命名 vi 文件或在 vi 编辑器启动后输入任何内容到缓冲区。 按 Esc 键以确保处于命令方式。
    描述
    列出缩略语 输入 :ab 命令来列出现有的缩写。 按 Enter 键返回到命令方式。
    要除去缩写 输入 :anab Abbreviation 命令以除去缩写,其中 Abbreviation 变量指定不再想缩写的字符串。
    要设置 (定义) 缩写 输入 :ab Abbreviation String 命令来设置缩写,其中 Abbreviation 变量指定定义为缩写的字符串,而 String 变量指定被缩写的字符串。 只有当缩写是单独的单词时,缩写可以被字符串替代。

    例如,如果输入 :ab kn upper 命令,然后输入acknowledge在文本输入方式下,由于单词确认中的 kn 字符串不是单独的单词,因此未启动设置的缩写字符串。

    但是,如果输入 :ab kn upper 命令,然后输入make the kn line all kncasewhile 在文本输入方式下,结果为 make the upper line all uppercase

标志

描述
-c子命令 在开始用 vi 查看之前,执行 ex 编辑器子命令。 光标移到被最近执行的子命令影响的行。 当输入一个空操作数时,如 -c' ',vi 编辑器将光标置于文件的第一行。 -c 标志不能与 + 标志兼容。 不要同时指定这两个标志。
-l 在 LISP 方式中进入 vi 编辑器。 在此方式中,vi 编辑器适当地为 LISP 代码创建缩排,修改 (){}[[]] 子命令以便适当地为 LISP 进行操作。
-r[文件] 在 vi 编辑器或系统故障之后恢复文件。 如果不指定 File 变量,vi 编辑器显示所有保存过的文件列表。
-R 设置只读选项以保护文件使其不被覆盖。
-t标记 编辑包含 Tag 变量的文件并将 vi 编辑器定位于它的定义。 要使用此标志,您必须首先使用 标签 命令创建函数名及其位置的数据库。
-v 在详细方式中进入 vi 编辑器。
-w Number 将缺省窗口大小设置为 Number 变量指定的值。 当在低速线路上使用 vi 编辑器时,此标志十分有用。
-y Number 用任何大于 1024 的值覆盖 1,048,560 的最大行设置。 由于 vi 编辑器使用额外的行进行缓冲区处理,请求的行数应该是需要的两倍。
+[子命令] 在开始编辑之前,执行 ex 编辑器子命令。 如果不指定 Subcommand 变量,光标将置于文件的首行。 此 + 标志与 -c 标志不兼容。 不要同时指定这两个标志。

vi 一般子命令语法

使用以下一般语法来输入子命令:

[名称缓冲区] [操作员] [数字] 对象
提示: 方括号指示可选项。
描述
[名称缓冲区] 指定临时文本存储区域。
[操作员] 指定子命令或操作;指导 vi 编辑器。
[数字] 将操作范围或行地址指定为一个整数。
对象 指定操作对象,如文本对象(字符、单词、句子、段落、节、字符串)或文本位置(一行、在当前行中的位置、屏幕位置)。
子命令前的计数

可以在许多子命令前放一个数字。 vi 编辑器以下面方式之一解释此数字:

  • 转至由 Number 参数指定的行:
    5G
    10Z
  • 转至由 Number 参数指定的列。
    25|
  • 上下滚动由 Number 参数指定的行数:
    10Ctrl-U
    10Ctrl-D

vi 编辑器子命令

使用子命令执行以下种类的操作:

  • 移动光标
  • 编辑文本
  • 操纵文件
  • 其他操作

移动光标

按以下方式使用子命令在文件内移动光标:

  • 在行内移动
  • 按字符位置在行内移动
  • 移到单词
  • 按行位置移动
  • 移到句、段落或节
  • 通过重绘屏幕移动
  • 翻页和滚动
  • 搜索模式
  • 在文件中标记具体位置并返回
在行内移动

命令方式中输入以下子命令。 可以通过按 Esc 键取消不完整的命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
左箭头hCtrl-H 将光标左移一个字符。
下箭头jCtrl-JCtrl-N 将光标下移一行(它仍然在同一列中)。
上箭头kCtrl-P 将光标上移一行(它仍然在同一列中)。
向右箭头l 将光标右移一个字符。
按字符位置在行内移动

命令方式中输入以下子命令。 可以通过按 Esc 键取消不完整的命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
^ 将光标移到第一个非空字符。
0 将光标移到行首。
$ 将光标移到行尾。
fx 将光标移到下一个 x 字符。
Fx 将光标移到最后一个 x 字符。
tx 将光标移到下一个 x 字符的前一列。
Tx 将光标移到最后一个 x字符的后一列。
; 重复最近的 fFtT 子命令。
, 以反方向重复最近的 fFtT 子命令。
数字| 将光标移到指定列。
移到单词

命令方式中输入以下子命令。 有关 vi 子命令格式的更多信息,请参阅 vi 一般子命令语法

描述
w 将光标移到下一个小字。
b 将光标移到前一个小字。
e 将光标移到下一个小字的结尾。
W 将光标移到下一个大字。
B 将光标移到前一个大字。
E 将光标移到下一个大字的结尾。
按行位置移动

命令方式中输入以下子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
H 将光标移动到屏幕上的第一行。
L 将光标移到屏幕的最后一行。
M 将光标移到屏幕的中间行。
+ 将光标移到它的第一个非空字符的下一行。
- 将光标移到它的第一个非空字符的前一行。
Enter 将光标移到它的第一个非空字符的下一行。
移到句、段落或节

命令方式中输入以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
( 将光标置于前一句的开始,或前一个 s 表达式(如果处于 LISP 方式)。
) 将光标置于下一句的开始,或下一个 s 表达式(如果处于 LISP 方式)。
{ 将光标置于前一个段落的开始,或下一个列表(如果处于 LISP 方式)。
} 将光标置于下一个段落的开始,如果处于 C 方式,那么置于下一节,或者如果处于 LISP 方式则置于下一个列表。
]] 将光标置于下一节,或者下一个函数(如果处于 LISP 方式)。
[[ 将光标置于前一节,或者前一个函数(如果处于 LISP 方式)。
通过重绘屏幕移动

命令方式中输入以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
z 重新绘制屏幕,并将当前行显示在屏幕的开头。
z- 重新绘制屏幕,并在屏幕的末尾显示当前行。
z. 重绘屏幕,并使当前行位于屏幕中间。
/模式/z- 将屏幕重新绘制为在末尾包含由 模式 参数指定的字符串的行。
翻页和滚动

命令方式中输入以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
Ctrl-U 向上滚动 1/2 屏幕。
Ctrl-D 向下滚动 1/2 屏幕。
Ctrl-F 向前滚动一个屏幕。
Ctrl-B 向后滚动一个屏幕。
Ctrl-E 将窗口向下滚动一行。
Ctrl-Y 将窗口向上滚动一行。
z+ 向上翻页
z^ 向下翻页
搜索模式

命令方式中输入以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
[数字]G 将光标置于由 Number 参数指定的行号,或者最后一行(如果没有指定 Number 参数)。
/模式 将光标置于包含由 Pattern 参数指定的字符串的行的下一行。
?模式 将光标置于包含由 Pattern 参数指定的字符串的行的上一行。
n 在同一方向重复上次对 Pattern 参数指定的文本的搜索。
N 在相反方向重复上次对 Pattern 参数指定的文本的搜索。
/模式/+数字 将光标置于与由 Pattern 参数指定的字符串相匹配的行后面的指定行数。
?模式?-数字 将光标置于与由 Pattern 参数指定的字符串相匹配的行前面的指定行数。
% 查找与当前光标位置的括号或大括号相匹配的括号或大括号。

编辑文本

用于编辑的子命令使您能执行以下任务:

  • 在文件中标记具体位置并返回
  • 将文本添加到文件
  • 在输入方式下更改文本
  • 从命令方式更改文本
  • 复制和移动文本
  • 恢复和重复更改
在文件中标记具体位置并返回

命令方式中输入以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
" 将光标移到当前行的前一位置。
" 将光标移到包含当前行前一位置的行首。
mx x 参数指定的字母标记当前位置。
`x 将光标移到由 x 参数指定的标记。
'x 将光标移到包含由 x 参数指定的标记的行首。
将文本添加到文件 (文本输入方式)

命令方式 中输入以下子命令以将 vi 编辑器更改为文本输入方式。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述

a文本

在光标后面插入由 Text 参数指定的文本。 通过按 Esc 键结束 文本输入方式

A文本

添加由 Text 参数指定的文本到行尾。 通过按 Esc 键结束 文本输入方式

i文本

在光标前面插入由 Text 参数指定的文本。 通过按 Esc 键结束 文本输入方式

I文本

在行中的第一个非空字符前插入由 Text 参数指定的文本。 通过按 Esc 键结束 文本输入方式

o

在当前行后添加空行。 通过按 Esc 键结束 文本输入方式

O

在当前行之前添加空行。 通过按 Esc 键结束 文本输入方式
在输入方式下更改文本

仅在 文本输入方式中使用以下子命令。 这些命令在命令方式中有不同的含义。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述

Ctrl-D

回退到前一个自动缩排停止位。
^ Ctrl-D 只结束该行的自动缩排。
0Ctrl-D 将光标退回到左页边。
Esc 结束插入并返回到命令状态。
Ctrl-H 擦除上一个字符。
Ctrl-Q 如果 xon 禁用则输入任意字符。
Ctrl-V 输入任意字符
Ctrl-W 擦除上一个小字。
\ 引用擦除和行删除符。
Ctrl-? 中断并结束插入或 Ctrl-D 按键顺序。
从命令方式更改文本

命令方式中使用以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述

C

更改行的剩余部分(同 c$ 一样)。

cc

更改一行
cw 更改一个单词
cw文本 将字更改为 Text 参数指定的文本。
D 删除行的剩余部分(同 d$ 一样)。
dd 删除一行。
dw 删除一个单词。
J 连接行。
rx x 指定的字符替换当前字符。

R文本

Text 参数指定的文本覆盖字符。

s

替代字符(同 cl 一样)。

S

替代行(同 cc 一样)。
u 撤销上次更改。
x 删除光标位置的字符。
X 删除光标前的一个字符(同 dh 一样)。
<< 将一行向左移位。
<L 将从光标位置开始的所有行向左移到屏幕末尾。
>> 将一行向右移位。
>L 将从光标位置开始的所有行向右移到屏幕末尾。
~ 将光标位置的字母更改为相反的大小写格式。
! 缩排 LISP。
复制和移动文本

命令方式中使用以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
p 将撤销缓冲区中的文本还原到光标之后。
P 将撤销缓冲区中的文本还原到光标之前。
"xp x 缓冲区中的文本还原
"xd 将文本删除到 x 缓冲区。
y 将跟随的对象(例如 word 为 w)放到撤销缓冲区。
"xy 将跟随的对象放到 x 缓冲区,其中 x 为任意字母。
Y 将行放到撤销缓冲区。
恢复和重复更改

命令方式中使用以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
u 撤销最后一次更改。
提示: 撤销后,光标将移动到更新后的当前行上的第一个非空白字符。
U 如果最后一次更改以来光标还没有离开该行,那么恢复当前行。
. 重复上次更改或增加 "np 命令。
注意:
  1. 这条子命令将重复最后一次的更改,包括撤销命令。 因此,一次撤销后,重复一次撤销而不是重复最后一次更改。
  2. 这条子命令不是为和宏配合使用设计的。 输入 @@ (两个位于字符) 以重复宏。
"n p 检索完整行或行块的倒数第 n 次删除。

操纵文件

用于操纵文件的子命令允许执行在以下各节中概述的任务:

  • 保存对文件的更改
  • 编辑另一个文件
  • 编辑文件列表
  • 查找文件信息
保存对文件的更改

命令方式中使用以下子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
:w 将编辑缓冲区内容写入原始文件中。 如果您是在 编辑器中使用此子命令,那么不需要输入: (冒号)。
:w File 将编辑缓冲区内容写入由 File 参数指定的文件中。 如果您是在 编辑器中使用此子命令,那么不需要输入: (冒号)。
:w! File 用缓冲区内容覆盖由 File 参数指定的文件。 如果您是在 编辑器中使用此子命令,那么不需要输入: (冒号)。
编辑另一个文件

命令方式中输入以下子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
:e File 编辑所指定的文件。 如果您是从 编辑器使用此子命令,那么不需要输入: (冒号)。
:e! 重新编辑当前文件并废弃所有更改。
:e + File 从结尾开始编辑所指定的文件。
:e + Number File 从指定行号开始编辑所指定的文件。
:e # 编辑备用文件。 在用 :e 命令访问另一个文件之前,备用文件通常是以前的文件名。 但是,如果当调用一个新文件时更改在当前文件中处于暂挂状态,那么该新文件成为备用文件。 此子命令与 Ctrl-A 子命令相同。
:r File 通过在当前行之后添加新行,将文件读入编辑缓冲区。 如果您是从 编辑器使用此子命令,那么不需要输入 : (冒号)。
:r !命令 运行指定的命令,并通过在当前光标位置之后添加新行将其输出放入文件中。
:ta 标记 Tag 标记符位置开始,编辑包含该标记符的文件。 要使用此子命令,您必须先使用 标签 命令创建函数名及其位置的数据库。 如果您是从 编辑器使用此子命令,那么不需要输入 : (冒号)。
Ctrl-] 从标记位置开始,编辑包含与当前字关联的标记的文件。 要使用这条子命令,必须首先使用 ctags 命令创建一个函数名及其位置的数据库。 Ctrl-T 在先前发出 Ctrl-] 子命令的编辑位置编辑文件。 如果已经发出了多个 Ctrl-] 子命令,那么可以使用多个 Ctrl-T 子命令来返回到发出 Ctrl-] 子命令的先前编辑位置。
Ctrl-A 编辑备用文件。 备用文件通常使用前一个当前文件名。 但是,如果当调用一个新文件时更改在当前文件中处于暂挂状态,那么该新文件成为备用文件。 此子命令与 :e # 子命令相同。
编辑文件列表

命令方式中输入以下子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
:n 编辑命令行上输入的列表中的下一个文件。 如果您正在从 编辑器使用此子命令,那么不需要: (冒号)。
:n Files 指定一个要编辑的新文件列表。 如果您是从 编辑器使用此子命令,那么不需要 : (冒号)。
查找文件信息

命令方式中输入以下子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
Ctrl-G 显示当前文件名、当前行号、文件中行数和光标定位于文件整体的百分比。

其他操作

vi 编辑器提供以下各节描述的子命令:

  • 调整屏幕
  • 输入 shell 命令
  • 中断和结束 vi 编辑器
调整屏幕

命令方式中输入以下子命令。 可以通过按 Esc 键取消不完整的子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
Ctrl-L 清除和重绘屏幕。
Ctrl-R 重绘屏幕并消除以 @ (位于符号)标记的空行。
z Number 使窗口长度能显示指定行数。
输入 shell 命令

以下子命令允许在 vi 编辑器内运行命令。 在 命令方式中输入以下子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
:sh 进入 shell 以便能运行多条命令。 通过按 Ctrl-D 按键顺序可以返回到 vi 编辑器。 如果您在 编辑器中使用此子命令,那么不需要: (冒号)。
:!命令 运行指定的命令然后返回到 vi 编辑器。 如果您在 编辑器中使用此子命令,那么不需要: (冒号)。
提示: : # (备用文件) , % (当前文件) 和 ! (先前命令) 特殊字符在跟随 :! 时展开 子命令后面的 !(感叹号)提示。 要避免这些字符中的任意字符被扩展,可使用 \ (反斜杠)。
:!! 重复最后一个 :!命令 子命令.
Number!!命令 运行指定的命令并用命令输出替换由 Number 指定的行 如果未指定某个数字,那么 1 值为 1。 如果命令期望标准输入,那么指定的行将用作输入。
!对象命令 运行指定的命令并用命令输出替换由 Object 参数指定的对象 如果命令需要标准输入,那么指定的对象用作输入。
中断和结束 vi 编辑器

命令方式中输入以下子命令。 如果需要有关 vi 子命令格式的信息,请参阅 vi 一般子命令语法

描述
Q 以命令方式进入 编辑器。
ZZ 退出 vi 编辑器,保存更改。
:q 退出 vi 编辑器。 如果更改了编辑缓冲区的内容,vi 编辑器显示一条警告消息并且不退出。 如果您正在从 编辑器使用此子命令,那么不需要: (冒号)。
:q! 退出 vi 编辑器,废弃编辑缓冲区。 如果您正在从 编辑器使用此子命令,那么不需要: (冒号)。
Esc 结束文本输入或结束一条不完整的子命令。
Ctrl-? 中断一条子命令。

退出状态

返回以下退出值:

描述
重大安全事件数量 指示成功完成。
>0 指示发生错误。

输入文件

输入文件必须是文本文件或和文本文件相似的文件,不完整的最后一行(该行不包含空字符)除外。

.exrc 文件必须是由 ex 命令组成的文本文件。

$HOME/.vi_history 文件是自动生成的文本文件,用于记录最后一行方式命令历史记录。

缺省情况下,vi 编辑器从将要编辑的文件读取行,而不将这些行中任意一行解释成任何格式的 vi 编辑器命令。