Usr_20

Nvim :help 页面,生成源代码 使用 tree-sitter-vimdoc 解析器。


VIM 用户手册 - 作者 Bram Moolenaar
快速输入命令行命令
Vim 有几个通用功能可以使输入命令更容易。冒号命令可以缩写、编辑和重复。几乎所有内容都提供自动完成。
20.1 命令行编辑 20.2 命令行缩写 20.3 命令行自动完成 20.4 命令行历史记录 20.5 命令行窗口
下一章:usr_21.txt 离开并返回 上一章:usr_12.txt 巧妙技巧 目录:usr_toc.txt

命令行编辑

当您使用冒号 (:) 命令或使用 / 或 ? 搜索字符串时,Vim 会将光标放在屏幕底部。您可以在那里输入命令或搜索模式。这被称为命令行。当用于输入搜索命令时也是如此。
编辑您键入的命令的最明显方法是按 <BS> 键。这会擦除光标之前的字符。要擦除之前键入的另一个字符,请首先使用光标键移动光标。例如,您键入了以下内容
:s/col/pig/
在您按下 <Enter> 之前,您注意到“col”应该改为“cow”。要更正此问题,请键入 <Left> 五次。光标现在就在“col”之后。键入 <BS> 和“w”进行更正
:s/cow/pig/
现在您可以直接按下 <Enter>。您无需在执行命令之前将光标移动到行尾。
在命令行中移动的最常用按键
<Left> 左移一个字符 <Right> 右移一个字符 <S-Left><C-Left> 左移一个词 <S-Right><C-Right> 右移一个词 CTRL-B<Home> 移动到命令行开头 CTRL-E<End> 移动到命令行结尾
注意: <S-Left>(按住 Shift 键并按下向左箭头键)和 <C-Left>(按住 Ctrl 键并按下向左箭头键)在所有键盘上都不起作用。其他 Shift 和 Ctrl 组合也是如此。
您也可以使用鼠标移动光标。

删除

如前所述,<BS> 删除光标之前的字符。要删除整个单词,请使用 CTRL-W
/the fine pig
CTRL-W
/the fine
CTRL-U 删除所有文本,因此您可以重新开始。

覆盖

<Insert> 键在插入字符和替换现有字符之间切换。从以下文本开始
/the fine pig
使用 <S-Left> 两次(或 <Left> 八次,如果 <S-Left> 不起作用)将光标移动到“fine”的开头。现在按下 <Insert> 切换到覆盖模式并键入“great”
/the greatpig
哎呀,我们丢失了空格。现在,不要使用 <BS>,因为它会删除“t”(这与替换模式不同)。相反,按下 <Insert> 从覆盖模式切换到插入模式,然后键入空格
/the great pig

取消

您想到执行 : 或 / 命令,但改变了主意。要丢弃您已经键入的内容,而无需执行它,请按 CTRL-C<Esc>
注意: <Esc> 是通用的“退出”键。不幸的是,在传统的 Vi 中,在命令行中按下 <Esc> 会执行命令!由于这可能被视为错误,因此 Vim 使用 <Esc> 取消命令。但是,使用 'cpoptions' 选项可以使其与 Vi 兼容。当使用映射(可能为 Vi 编写)时,<Esc> 也与 Vi 兼容。因此,使用 CTRL-C 是一种始终有效的办法。
如果您位于命令行开头,按下 <BS> 将取消命令。这就像删除该行开头的 ":" 或 "/" 一样。

20.2 命令行缩写

一些 ":" 命令非常长。我们已经提到 ":substitute" 可以缩写为 ":s"。这是一种通用机制,所有 ":" 命令都可以缩写。
命令可以缩写到多短?有 26 个字母,还有更多命令。例如,":set" 也以 ":s" 开头,但 ":s" 不会启动 ":set" 命令。相反,":set" 可以缩写为 ":se"。当命令的较短形式可以用于两个命令时,它仅代表其中一个命令。没有逻辑决定代表哪个,您必须学习它们。在帮助文件中,提到了可用的最短形式。例如
:s[ubstitute]
这意味着 ":substitute" 的最短形式是 ":s"。以下字符是可选的。因此 ":su" 和 ":sub" 也有效。
在用户手册中,我们将使用命令的完整名称或仍然可读的简短版本。例如,":function" 可以缩写为 ":fu"。但由于大多数人无法理解它的含义,因此我们将使用 ":fun"。(Vim 没有 ":funny" 命令,否则 ":fun" 也会令人困惑。)
建议在 Vim 脚本中编写完整的命令名称。这样可以更容易地在您进行以后的更改时重新阅读。除了像 ":w" (":write") 和 ":r" (":read") 这样的常用命令之外。一个特别令人困惑的是 ":end",它可能代表 ":endif"、":endwhile" 或 ":endfunction"。因此,始终使用完整的名称。

短选项名称

在用户手册中,使用选项名称的长版本。许多选项也有短名称。与 ":" 命令不同,只有一个短名称有效。例如,'autoindent' 的短名称是 'ai'。因此,这两个命令执行的操作相同
:set autoindent
:set ai
您可以在此处找到长名称和短名称的完整列表:option-list.

20.3 命令行自动完成

这是 Vim 的众多功能之一,它本身就是从 Vi 切换到 Vim 的理由。一旦您使用过它,就无法再离开它了。
假设您有一个包含以下文件的目录
info.txt intro.txt bodyofthepaper.txt
要编辑最后一个文件,您使用以下命令
:edit bodyofthepaper.txt
很容易键入错误。更快的办法是
:edit b<Tab>
这将导致相同的命令。发生了什么?<Tab> 键会自动完成光标之前的单词。在本例中为“b”。Vim 会在目录中查找,发现只有一个以“b”开头的文件。这肯定就是您要查找的文件,因此 Vim 会为您完成文件名。
现在键入
:edit i<Tab>
Vim 会发出蜂鸣声,并显示
:edit info.txt
蜂鸣声表示 Vim 找到多个匹配项。然后它使用找到的第一个匹配项(按字母顺序)。如果您再次按下 <Tab>,您将看到
:edit intro.txt
因此,如果第一个 <Tab> 没有为您提供您要查找的文件,请再次按下它。如果还有更多匹配项,您将依次看到它们。如果您在最后一个匹配项上按下 <Tab>,您将回到您最初键入的内容
:edit i
然后它会从头开始。因此,Vim 会循环遍历匹配项列表。使用 CTRL-P 反向遍历列表
<------------------- <Tab> -------------------------+ | <Tab> --> <Tab> --> :edit i :edit info.txt :edit intro.txt <-- CTRL-P <-- CTRL-P | +---------------------- CTRL-P ------------------------>

上下文

当您键入 ":set i" 而不是 ":edit i" 并按下 <Tab> 时,您会看到
:set icon
为什么您没有看到 ":set info.txt"?这是因为 Vim 有上下文感知的自动完成功能。Vim 会查找的单词类型取决于它前面的命令。Vim 知道您不能在 ":set" 命令后面使用文件名,但可以使用选项名称。同样,如果您重复键入 <Tab>,Vim 会循环遍历所有匹配项。有很多匹配项,最好先键入更多字符
:set isk<Tab>
显示
:set iskeyword
现在键入“=”并按下 <Tab>
:set iskeyword=@,48-57,_,192-255
这里发生的是 Vim 插入选项的旧值。现在您可以编辑它。使用 <Tab> 自动完成的内容是 Vim 在该位置预期的内容。只需尝试一下看看它是如何工作的。在某些情况下,您将无法获得您想要的内容。这可能是因为 Vim 不知道您想要什么,或者因为该情况没有实现自动完成。在这种情况下,您将看到插入了 <Tab>(显示为 ^I)。

列出匹配项

如果有很多匹配项,您希望看到概述。按 CTRL-D 完成此操作。例如,在以下操作之后按 CTRL-D
:set is
结果为
:set is
incsearch  isfname    isident    iskeyword  isprint
:set is
Vim 会列出匹配项,然后返回您键入的文本。您现在可以查看列表以查找您想要的内容。如果它不在那里,您可以使用 <BS> 更正该单词。如果有许多匹配项,请在按下 <Tab> 自动完成其余部分之前键入更多字符。如果您仔细观察,您会注意到“incsearch”不是以“is”开头的。在本例中,“is”代表“incsearch”的短名称。(许多选项都有短名称和长名称。)Vim 足够智能,知道您可能想将选项的短名称扩展为长名称。

还有更多

CTRL-L 命令将单词自动完成到最长的无歧义字符串。如果您键入 ":edit i" 并且有文件“info.txt”和“info_backup.txt”,您将看到 ":edit info"。
'wildmode' 选项可用于更改自动完成的工作方式。'wildmenu' 选项可用于获取匹配项的菜单式列表。使用 'suffixes' 选项指定不太重要的文件,它们将显示在文件列表的末尾。使用 'wildignore' 选项指定完全不列出的文件。
有关所有这些内容的更多信息,请参阅:cmdline-completion

20.4 命令行历史记录

在第 3 章中,我们简要提到了历史记录。基本原理是您可以使用 <Up> 键来回忆以前的命令行。<Down> 然后带您回到更新的命令。
实际上有五个历史记录。我们将在此处提及的是 ":" 命令的历史记录以及 "/" 和 "?" 搜索命令的历史记录。"/" 和 "?" 命令共享同一个历史记录,因为它们都是搜索命令。另外三个历史记录分别是表达式、调试模式命令以及 input() 函数的输入行的历史记录。 cmdline-history
假设您已经执行过 ":set" 命令,键入了十个以上的冒号命令,然后想要再次重复该 ":set" 命令。您可以按下 ":",然后十次按下 <Up>。有一个更快的办法
:se<Up>
Vim 现在将回到之前以 "se" 开头的命令。很有可能这就是你想要执行的 ":set" 命令。至少你应该不需要经常按 <Up> 键(除非你只执行了 ":set" 命令)。
<Up> 键将使用你已输入的文本并将其与历史记录中的行进行比较。只有匹配的行才会被使用。如果你没有找到你要查找的行,请使用 <Down> 键返回到你的输入并进行修正。或者使用 CTRL-U 键重新开始。
要查看历史记录中的所有行
:history
这就是 ":" 命令的历史记录。使用此命令可以显示搜索历史记录
:history /
CTRL-P 将与 <Up> 键的功能类似,但它不关心你已经输入了什么内容。类似地,CTRL-N<Down> 键也是如此。CTRL-P 代表上一个,CTRL-N 代表下一个。

20.5 命令行窗口

在命令行中输入文本的方式不同于在插入模式下输入文本。它不允许使用许多命令来修改文本。对于大多数命令来说这没有问题,但有时你必须输入一个复杂的命令。这就是命令行窗口发挥作用的地方。
使用此命令打开命令行窗口
q:
Vim 现在将在底部打开一个(较小的)窗口。它包含命令行历史记录,并在最后面有一个空行
+-------------------------------------+
|other window                              |
|~                                      |
|file.txt=============================|
|:e c                                      |
|:e config.h.in                              |
|:set path=.,/usr/include,,              |
|:set iskeyword=@,48-57,_,192-255     |
|:set is                              |
|:q                                      |
|:                                      |
|command-line=========================|
|                                      |
+-------------------------------------+
你现在处于正常模式。可以使用 "hjkl" 键进行移动。例如,使用 "5k" 移动到 ":e config.h.in" 行。输入 "$h" 移动到 "in" 的 "i" 位置并输入 "cwout"。现在你已经将该行更改为
:e config.h.out
现在按 <Enter> 键,该命令将被执行。命令行窗口将关闭。<Enter> 命令将执行光标所在的行。无论 Vim 是否处于插入模式或正常模式都没有关系。命令行窗口中的更改将丢失。它们不会导致历史记录发生改变。除了你执行的命令将被添加到历史记录的末尾,就像所有已执行的命令一样。
当你想要查看历史记录概述,查找类似的命令,稍微修改它并执行它时,命令行窗口非常有用。可以使用搜索命令查找某个内容。在前面的示例中,可以使用方法 "?config" 搜索命令查找包含 "config" 的先前命令。这有点奇怪,因为你正在使用命令行在命令行窗口中进行搜索。当你输入该搜索命令时,你无法打开另一个命令行窗口,因为只能存在一个命令行窗口。
下一章:usr_21.txt 离开并返回
版权:请参阅 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主菜单
命令索引
快速参考