Cmdline

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


命令行模式用于输入 Ex 命令 (":"),搜索模式 ("/" 和 "?"),以及过滤命令 ("!")。
基本命令行编辑在用户手册第 20 章中解释 usr_20.txt

1. 命令行编辑 cmdline-editing

通常情况下,字符会插入到光标位置的前面。您可以使用左右光标键在命令行中移动。使用 <Insert> 键,可以在插入和覆盖字符之间切换。
请注意,如果您的键盘没有正常工作的光标键或任何其他特殊键,您可以使用 ":cnoremap" 为它们定义另一个键。例如,要定义 tcsh 样式的编辑键:tcsh-style
:cnoremap <C-A> <Home>
:cnoremap <C-F> <Right>
:cnoremap <C-B> <Left>
:cnoremap <Esc>b <S-Left>
:cnoremap <Esc>f <S-Right>
(<> 符号 <>; 请逐字输入)
cmdline-too-long
当命令行变得比屏幕上显示的更长时,只会显示适合的部分。光标只能在这个可见部分中移动,因此您无法编辑超出该部分的内容。
cmdline-history 历史记录 您输入的命令行会保存在一个历史记录表中。您可以使用向上和向下光标键来调用它们。实际上有五个历史记录表
一个用于 ':' 命令
一个用于搜索字符串
一个用于表达式
一个用于输入行,为 input() 函数输入。
一个用于调试模式命令 这些是完全独立的。每个历史记录只能在输入相同类型的行时访问。使用 'history' 选项来设置要记住的行数。 注意:
当您输入一个与较早命令行完全相同的命令行时,较早的命令行将被移除(以避免重复命令将较早命令从历史记录中移出)。
只有键入的命令会被记住。完全来自映射的命令不会被放到历史记录中。
所有搜索都会被放到搜索历史记录中,包括来自 "*" 和 "#" 等命令的搜索。但是对于映射,只记住最后一次搜索(以避免长映射破坏历史记录)。
命令行上有一个自动完成名称;参见 cmdline-completion
c_CTRL-V
CTRL-V 按字面插入下一个非数字字符。最多三个数字构成单个字节的十进制值。非数字字符和三个数字不会被用于映射。这与插入模式中的工作方式相同(见上文,i_CTRL-V)。对于特殊键,可以将 CTRL 修饰符包含到键中以生成控制字符。如果键没有控制字符,则会插入其 键符号 注意:在 Windows 下,CTRL-V 通常映射到粘贴文本。在这种情况下,请改用 CTRL-Qc_CTRL-Q
CTRL-Q 与 CTRL-V 相同。但在某些终端中,它用于控制流,在这种情况下它无法正常工作。

CTRL-SHIFT-V c_CTRL-SHIFT-V c_CTRL-SHIFT-Q

CTRL-SHIFT-Q 工作方式与 CTRL-V 相同,但不要尝试将 CTRL 修饰符包含到键中。
c_<Left> c_Left <Left> 光标左移。参见 'wildmenu' 以了解 wildmenu 完成模式下的行为。 c_<Right> c_Right <Right> 光标右移。参见 'wildmenu' 以了解 wildmenu 完成模式下的行为。 c_<S-Left>
<S-Left><C-Left> c_<C-Left>
光标左移一个单词 c_<S-Right>
<S-Right><C-Right> c_<C-Right>
光标右移一个单词 CTRL-B 或 <Home> c_CTRL-B c_<Home> c_Home 光标移动到命令行开头 CTRL-E 或 <End> c_CTRL-E c_<End> c_End 光标移动到命令行末尾。参见 'wildmenu' 以了解 wildmenu 完成模式下的行为。
c_<LeftMouse>
<LeftMouse> 将光标移动到鼠标单击的位置。
c_<MiddleMouse>
<MiddleMouse> 粘贴剪贴板内容(对于 X11 来说是主选择区)。这类似于使用 CTRL-R *,但不会在行之间插入 CR 字符。

CTRL-H c_<BS> c_CTRL-H c_BS

<BS> 删除光标前面的字符。 c_<Del> c_Del <Del> 删除光标下的字符(在行尾:光标前的字符)。 c_CTRL-W
CTRL-W 删除光标前面的 单词。这取决于 'iskeyword' 选项。 c_CTRL-U
CTRL-U 删除光标位置和行首之间的所有字符。之前的 vim 版本会删除行上的所有字符。如果这是首选行为,请将以下内容添加到您的 vimrc 中
:cnoremap <C-U> <C-E><C-U>
c_<Insert> c_Insert <Insert> 在插入和覆盖之间切换。
{char1} <BS> {char2}c_digraph
CTRL-K {char1} {char2} c_CTRL-K
输入二合字(参见 二合字)。当 {char1} 是一个特殊键时,该键的代码将以 <> 形式插入。
CTRL-R {register} c_CTRL-R c_<C-R> 插入编号或命名寄存器的内容。在键入 CTRL-R 和第二个字符之间,会显示 '"',表示您需要输入寄存器的名称。文本以您键入的方式插入,但不会使用映射和缩写。但是,不会通过 'wildchar' 触发命令行自动完成。并且结束命令行的字符将按字面意义插入 (<Esc>, <CR>, <NL>, <C-C>)。但是,<BS> 或 CTRL-W 仍然可以结束命令行,并且其余字符将在另一种模式下解释,这可能不是您想要的结果。特殊寄存器: '"' 无名寄存器,包含最后一次删除或粘贴的文本 '%' 当前文件名 '#' 备用文件名 "*" 剪贴板内容(X11:主选择区) '+' 剪贴板内容 '/' 最后一次搜索模式 ':' 最后一次命令行 '-' 最后一次小(小于一行)删除 '.' 最后一次插入的文本 c_CTRL-R_=
'=' 表达式寄存器:系统会提示您输入表达式(参见 表达式)(在表达式提示符处不起作用;一些操作,如更改缓冲区或当前窗口,不被允许,以避免副作用)当结果是 List 时,项目用作行。它们内部也可以包含换行符。当结果是 Float 时,它会自动转换为 String。请注意,当您只想移动光标而不插入任何内容时,您必须确保表达式计算结果为空字符串。例如
<C-R><C-R>=setcmdpos(2)[-1]<CR>
参见 寄存器 了解有关寄存器的信息。实现细节:使用 表达式 寄存器并调用 setcmdpos() 时,这会设置插入结果字符串之前的定位。使用 CTRL-R CTRL-R 在之后设置定位。
CTRL-R CTRL-F c_CTRL-R_CTRL-F c_<C-R>_<C-F> CTRL-R CTRL-P c_CTRL-R_CTRL-P c_<C-R>_<C-P> CTRL-R CTRL-W c_CTRL-R_CTRL-W c_<C-R>_<C-W> CTRL-R CTRL-A c_CTRL-R_CTRL-A c_<C-R>_<C-A> CTRL-R CTRL-L c_CTRL-R_CTRL-L c_<C-R>_<C-L> 插入光标下的对象: CTRL-F 光标下的文件名 CTRL-P 光标下的文件名,用 'path' 展开,如 gfCTRL-W 光标下的单词 CTRL-A 光标下的 WORD;参见 WORD CTRL-L 光标下的行
'incsearch' 设置为 true 时,使用当前显示匹配项末尾的光标位置。对于 CTRL-W,已经键入的单词部分不会再次插入。
c_CTRL-R_CTRL-R c_<C-R>_<C-R> c_CTRL-R_CTRL-O c_<C-R>_<C-O> CTRL-R CTRL-R {register CTRL-F CTRL-P CTRL-W CTRL-A CTRL-L} CTRL-R CTRL-O {register CTRL-F CTRL-P CTRL-W CTRL-A CTRL-L} 插入寄存器或光标下的对象。工作方式类似于 c_CTRL-R,但按字面意义插入文本。例如,如果寄存器 a 包含 "xy^Hz"(其中 ^H 是退格键),"CTRL-R a" 会插入 "xz",而 "CTRL-R CTRL-R a" 会插入 "xy^Hz"。
CTRL-\ e {expr} c_CTRL-\_e
计算 {expr} 并用结果替换整个命令行。系统会提示您输入表达式,键入 <Enter> 以完成输入。这在映射中最为有用。参见 表达式。参见 c_CTRL-R_= 了解有关插入表达式结果的信息。有用的函数是 getcmdtype()getcmdline()getcmdpos()。光标位置保持不变,除非光标位于行尾,则光标保持在行尾。setcmdpos() 可用于设置光标位置。沙盒 用于计算表达式以避免恶意的副作用。示例
:cmap <F7> <C-\>eAppendSome()<CR>
:func AppendSome()
   :let cmd = getcmdline() .. " Some()"
   :" place the cursor on the )
   :call setcmdpos(strlen(cmd))
   :return cmd
:endfunc
这不会递归工作,因此在已经编辑表达式时不起作用。但可以在映射中使用它。
c_CTRL-Y
CTRL-Y 当存在无模式选择时,将选择的内容复制到剪贴板中。如果没有选择,CTRL-Y 将作为字符插入。参见 'wildmenu' 以了解 wildmenu 完成模式下的行为。
c_CTRL-Z
CTRL-Z 触发 'wildmode'。与 'wildcharm' 相同,但始终可用。
CTRL-M 或 CTRL-J c_CTRL-M c_CTRL-J c_<NL> c_<CR> c_CR <CR><NL> 开始输入的命令
CTRL-[ c_CTRL-[ c_<Esc> c_Esc <Esc> 当输入且 'x' 不存在于 'cpoptions' 中时,退出命令行模式而不执行。在宏中或当 'x' 存在于 'cpoptions' 中时,开始输入的命令。 注意: 如果您的 <Esc> 键在键盘上很难按,请训练自己使用 CTRL-[c_META c_ALT ALT (META) 可能会像 <Esc> 一样起作用,如果和弦没有映射。例如,如果 <A-x> 没有命令行模式映射,则 <A-x><Esc>x 一样起作用。 c_CTRL-C
CTRL-C 退出命令行而不执行
c_<Up> c_Up <Up> 从历史记录中调用较旧的命令行,其开头与当前命令行匹配(见下文)。请参阅 'wildmenu' 以了解在 wildmenu 完成模式下的行为。 c_<Down> c_Down <Down> 从历史记录中调用更新的命令行,其开头与当前命令行匹配(见下文)。请参阅 'wildmenu' 以了解在 wildmenu 完成模式下的行为。
c_<S-Up> c_<PageUp> <S-Up><PageUp> 从历史记录中调用较旧的命令行 c_<S-Down> c_<PageDown> <S-Down><PageDown> 从历史记录中调用更新的命令行
CTRL-D 命令行完成(见 cmdline-completion'wildchar' 选项命令行完成(见 cmdline-completion)CTRL-N 命令行完成(见 cmdline-completion)CTRL-P 命令行完成(见 cmdline-completion)CTRL-A 命令行完成(见 cmdline-completion)CTRL-L 命令行完成(见 cmdline-completion)
c_CTRL-^
CTRL-^ 切换使用语言 :lmap 映射和/或输入法。当为搜索命令键入模式时,如果 'imsearch' 不为 -1,则 VAL 为 'imsearch' 的值,否则 VAL 为 'iminsert' 的值。当定义了语言映射时
如果 VAL 为 1(使用 langmap 映射),它将变为 0(不使用 langmap 映射)。
如果 VAL 不为 1,它将变为 1,因此启用 langmap 映射。当没有定义语言映射时
如果 VAL 为 2(使用输入法),它将变为 0(不使用输入法)
如果 VAL 具有其他值,它将变为 2,因此启用输入法。这些语言映射通常用于键入与键盘产生的字符不同的字符。 'keymap' 选项可用于安装大量此类映射。在输入命令行时,langmap 映射将关闭,因为您应该键入一个命令。在使用 CTRL-^ 打开它之后,新状态不会在下一个命令或搜索模式中再次使用。
c_CTRL-]
CTRL-] 触发缩写,而不插入字符。
有关命令行上的 Emacs 风格编辑,请参阅 emacs-keys
<Up><Down> 键将当前命令行作为搜索字符串。下一个/上一个命令行的开头将与此字符串进行比较。第一个匹配的行是新的命令行。当重复键入这两个键时,将再次使用相同的字符串。例如,这可以用来查找上一个替换命令:键入 ":s",然后键入 <Up>。可以通过多次键入 <S-Up> 来完成同样的事情,直到显示所需的命令行。(注意: 这些箭头键在所有终端上都不起作用)
:his :history :his[tory] 打印最后输入的命令的历史记录。
:his[tory] [{name}] [{first}][, [{last}]] 列出历史记录 {name} 的内容,它可以是:c[md] 或 : 命令行历史记录 s[earch] 或 / 或 ? 搜索字符串历史记录 e[xpr] 或 = 表达式寄存器历史记录 i[nput] 或 @ 输入行历史记录 d[ebug] 或 > 调试命令历史记录 a[ll] 以上所有
如果给出数字 {first} 和/或 {last},则会列出历史记录中相应范围内的条目。这些数字可以使用以下形式指定: :history-indexing
正数表示条目的绝对索引,如在 :history 列表的第一列中给出。即使删除了其他条目,此数字也会保持不变。(见 E1510
负数表示条目的相对位置,从最新的条目(索引为 -1)开始向后计数。
例如:列出搜索历史记录中条目 6 到 12
:history / 6,12
列出所有历史记录中的倒数第二个条目
:history all -2
列出所有历史记录中最新的两个条目
:history all -2,
:keepp[atterns] {command} :keepp :keeppatterns 执行 {command},而不向搜索历史记录中添加任何内容,并且在 :s:& 的情况下,不会修改最后一个替换模式或替换字符串。

2. 命令行完成 cmdline-completion

在编辑命令行时,可以使用一些命令来完成光标之前的单词。这对以下情况有效
命令名称:在命令行的开头。
++opt 值。
标签:仅在 ":tag" 命令之后。
文件名:仅在接受文件名的命令或可以设置为文件名的选项的设置之后。这被称为文件名完成。
Shell 命令名称:在 ":!cmd"、":r !cmd" 和 ":w !cmd" 之后。使用 $PATH。
选项:仅在 ":set" 命令之后。
映射:仅在 ":map" 或类似命令之后。
变量和函数名称:仅在 ":if"、":call" 或类似命令之后。
帮助项匹配的数量有限制(当前为 300),以避免在匹配项很多时出现长时间延迟。
以下是可用的命令
c_CTRL-D
CTRL-D 列出与光标前的模式匹配的名称。在显示文件名时,目录将突出显示(见 highlight-groups)。'suffixes' 匹配的名称将移至末尾。 'wildoptions' 选项可以设置为 "tagfile" 以列出匹配标签的文件。 c_CTRL-I c_wildchar c_<Tab> 'wildchar' 选项 对光标前的模式进行匹配。匹配项(如果有几个,则为第一个匹配项)将插入到模式的位置。(注意: 在宏中不起作用,因为 <Tab><Esc> 主要用作 'wildchar',并且它们在某些宏中具有特殊含义。)当再次键入时,如果有多个匹配项,则插入下一个匹配项。在最后一个匹配项之后,将再次使用第一个匹配项(循环)。可以使用 'wildmode' 选项更改行为。 c_<S-Tab>
<S-Tab>'wildchar'<Tab> 相同,但从最后一个匹配项开始,然后转到上一个匹配项。 c_CTRL-N
CTRL-N 在使用 'wildchar' 获得多个匹配项后,转到下一个匹配项。否则从历史记录中调用更新的命令行。 c_CTRL-P
CTRL-P 在使用 'wildchar' 获得多个匹配项后,转到上一个匹配项。否则从历史记录中调用较旧的命令行。 c_CTRL-A
CTRL-A 插入与光标前的模式匹配的所有名称。 c_CTRL-L
CTRL-L 对光标前的模式进行匹配。如果有一个匹配项,则将其插入到模式的位置。如果有多个匹配项,则插入最长的公共部分以替换模式。如果结果短于模式,则不会进行任何完成。 /_CTRL-L
'incsearch' 设置时,输入 "/" 或 "?" 的搜索模式并显示当前匹配项,则 CTRL-L 将从当前匹配项的末尾添加一个字符。如果设置了 'ignorecase''smartcase' 并且命令行没有大写字符,则添加的字符将转换为小写。 c_CTRL-G /_CTRL-G CTRL-G 当 'incsearch' 设置时,输入 "/" 或 "?" 的搜索模式并显示当前匹配项,则 CTRL-G 将移动到下一个匹配项(不考虑 search-offset)。使用 CTRL-T 移动到上一个匹配项。提示:在标准键盘上,T 在 G 的上方。 c_CTRL-T /_CTRL-T CTRL-T 当 'incsearch' 设置时,输入 "/" 或 "?" 的搜索模式并显示当前匹配项,则 CTRL-T 将移动到上一个匹配项(不考虑 search-offset)。使用 CTRL-G 移动到下一个匹配项。提示:在标准键盘上,T 在 G 的上方。
'wildchar' 选项默认设置为 <Tab>(在与 Vi 兼容的模式下为 CTRL-E;在以前版本中使用 <Esc>)。在模式中,匹配文件名时接受标准 通配符
当重复 'wildchar'CTRL-N 时,您将在匹配项之间循环,最终回到键入的内容。如果第一个匹配项不是您想要的,则可以使用 <S-Tab>CTRL-P 直接回到您键入的内容。
'wildmenu' 选项可以设置为在命令行上方显示匹配项。
'wildoptions' 选项提供其他配置以使用弹出菜单 'wildmenu' 并使用模糊匹配。
可以使用 'wildignorecase' 选项在文件名中忽略大小写。对于完成其他文本(例如命令名称),则使用 'ignorecase' 选项(但模糊匹配始终忽略大小写)。
如果您喜欢 tcsh 的自动列表补全,您可以使用此映射
:cnoremap X <C-L><C-D>
(其中 X 是要使用的命令键,<C-L>CTRL-L<C-D>CTRL-D) 这将找到最长的匹配项,然后列出所有匹配的文件。
如果您喜欢 tcsh 的自动列表补全,您可以使用 'wildmode' 选项来模拟它。例如,这模拟 autolist=ambiguous
:set wildmode=longest,list
这将找到第一个 'wildchar' 的最长匹配项,然后列出所有与下一个匹配的文件。
complete-script-local-functions
在完成用户函数名称时,在前面加上 "s:" 以查找脚本本地函数。
suffixes
对于文件名补全,您可以使用 'suffixes' 选项来设置具有几乎相同名称的文件之间的优先级。如果有多个匹配项,则将忽略扩展名位于 'suffixes' 选项中的那些文件。默认值为 ".bak,~,.o,.h,.info,.swp,.obj",这意味着以 ".bak"、"~"、".o"、".h"、".info"、".swp" 和 ".obj" 结尾的文件有时会被忽略。
一个空条目,两个连续的逗号,匹配不包含 "." 的文件名,因此没有后缀。这对于忽略 "prog" 并优先使用 "prog.c" 很有用。
示例
模式:文件:匹配
test* test.c test.h test.o test.c test* test.h test.o test.h 和 test.o test* test.i test.h test.c test.i 和 test.c
无法忽略带有两个点的后缀。
如果有多个匹配文件(在忽略与 'suffixes' 选项匹配的文件之后),则插入第一个文件名。您可以看到,当您两次输入 'wildchar' 且已完成的匹配项保持不变时,只有一个匹配项。您可以通过输入 'wildchar'CTRL-NCTRL-P 来获取其他匹配项。所有文件都包含在内,包括扩展名与 'suffixes' 选项匹配的文件。
要完全忽略具有某些扩展名的文件,请使用 'wildignore'
要仅匹配以键入文本结尾结尾的文件,请附加 "$"。例如,要仅匹配以 ".c" 结尾的文件
:e *.c$
这将不匹配以 ".cpp" 结尾的文件。如果没有 "$",它确实匹配。
如果您想在 xterm 中使用 <S-Tab> 来代替 CTRL-P,请在您的 .cshrc 中放入此命令
xmodmap -e "keysym Tab = Tab Find"
并在您的 vimrc 中放入此命令
:cmap <Esc>[1~ <C-P>
complete-set-option
使用 :set= 设置选项时,可以通过在 "=" 后面立即按 'wildchar' 来获取选项的旧值。例如,在 ":set dir=" 后输入 'wildchar' 将插入 'dir' 的当前值。这会覆盖对需要文件名的选项的文件名补全。
使用 :set=:set+=:set^= 时,具有预定义名称或语法(例如 'diffopt''listchars')或是一系列单字符标志(例如 'shortmess')的字符串选项,在使用 'wildchar' 时也会显示一个可能的补全值列表。
使用 :set-= 时,以逗号分隔的选项(如 'diffopt''backupdir')将分别显示每个项目。像 'shortmess' 这样的标志列表选项将显示整个旧值和各个标志。否则,补全将仅用整个旧值填充。

3. Ex 命令行 cmdline-lines

Ex 命令有一些特殊之处
:quote :comment 行首的 '"' 将导致整行被忽略。命令后面的 '"' 将导致该行剩余部分被忽略。这可用于添加注释。示例
:set ai                "set 'autoindent' option
无法向 shell 命令 ":!cmd" 或 ":map" 命令以及其他一些命令(主要是期望表达式的命令)添加注释,这些命令将 '"' 视为其参数的一部分
:argdo :autocmd :bufdo :cexpr (以及类似的) :cdo (以及类似的) :command :debug :display :echo (以及类似的) :elseif :execute :folddoopen :folddoclosed :for :grep (以及类似的) :help (以及类似的) :if :let :make :map (以及类似的,包括 :abbrev 命令) :menu (以及类似的) :mkspell :normal :ownsyntax :popup :registers :return :sort :syntax :tabdo :tearoff :vimgrep (以及类似的) :while :windo
:bar :\bar '|' 可用于分隔命令,因此您可以在一行中给出多个命令。如果您想在参数中使用 '|',请在前面加上 '\'。
这些命令将 '|' 视为其参数,因此不能后跟另一个 Vim 命令::argdo :autocmd :bufdo :cdo :cfdo :command :debug :eval :folddoopen :folddoclosed :function :global :help :helpgrep :ldo :lfdo :lhelpgrep :make :normal :perlfile :pyfile :python :registers :read ! :sign :tabdo :terminal :vglobal :windo :write ! :[range]! 用户定义的命令,不带 "-bar" 参数 :command
请注意,这很令人困惑(继承自 Vi):对于 ":g",'|' 包含在命令中,对于 ":s",它不包含在命令中。
要能够使用另一个命令,请使用 ":execute" 命令。示例(追加 "ls" 的输出并跳转到第一行)
:execute 'r !ls' | '[
有一个例外:当 'cpoptions' 中存在 'b' 标志时,对于 ":map" 和 ":abbr" 命令及其相关命令,需要使用 CTRL-V 而不是 '\'。您也可以使用 "<Bar>" 代替。另请参阅 map_bar
示例
:!ls | wc                view the output of two commands
:r !ls | wc                insert the same output in the text
:%g/foo/p|>                moves all matching lines one shiftwidth
:%s/foo/bar/|>                moves one line one shiftwidth
:map q 10^V|                map "q" to "10|"
:map q 10\| map \ l        map "q" to "10\" and map "\" to "l"
                                (when 'b' is present in 'cpoptions')
您也可以使用 <NL> 来分隔命令,就像使用 '|' 一样。要插入 <NL>,请使用 CTRL-V CTRL-J。将显示 "^@"。使用 '|' 是首选方法。但是对于外部命令,必须使用 <NL>,因为 '|' 包含在外部命令中。要避免 <NL> 的特殊含义,它必须以反斜杠开头。示例
:r !date<NL>-join
这将当前日期读入文件,并将其与上一行合并。
请注意,当 '|' 之前的命令产生错误时,后面的命令将不会执行。
由于 Vi 兼容性,以下奇怪的命令得到支持
:|                        print current line (like ":p")
:3|                        print line 3 (like ":3p")
:3                        goto line 3
在范围和命令名称之间允许使用冒号。它将被忽略(这与 Vi 兼容)。例如
:1,$:s/pat/string
当在期望文件名的位置使用字符 '%' 或 '#' 时,它们将扩展为当前文件和备用文件名(请参阅“编辑文件”一章 :_% :_#)。
文件名中的尾随空格将被忽略,除非用反斜杠或 CTRL-V 转义。请注意,":next" 命令使用空格来分隔文件名。转义空格以将其包含在文件名中。示例
:next foo\ bar goes\ to school\
开始编辑三个文件 "foo bar"、"goes to" 和 "school "。
当您想在命令中使用特殊字符 '"' 或 '|',或者想在文件名中使用 '%' 或 '#' 时,请在前面加上反斜杠。反斜杠在范围和 ":substitute" 命令中不是必需的。另请参阅 `=
:_!
'!'(感叹号)字符位于 Ex 命令之后,使命令以不同的方式执行。'!' 应该紧跟在命令之后,中间没有任何空格。如果您插入空格,'!' 将被视为命令的参数,其含义不同。例如::w! name 将当前缓冲区写入文件 "name",覆盖任何现有文件 :w !name 将当前缓冲区作为标准输入发送到命令 "name"

4. Ex 命令行范围 cmdline-ranges [range] E16

一些 Ex 命令接受其前面的行范围。这表示为 [range]。它由一个或多个行说明符组成,用 ',' 或 ';' 分隔。
基础知识在用户手册的第 10.3 节中解释。
:, :; 当用 ';' 分隔时,在解释下一个行说明符之前,光标位置将设置为该行。对于 ',' 不会发生这种情况。示例
4,/this line/
从第 4 行到光标行后的“this line”匹配。
5;/that line/
从第 5 行到第 5 行后的“that line”匹配。
大多数命令的默认行说明符是光标位置,但 ":write" 和 ":global" 命令的默认值为整个文件 (1,$)。
如果给出的行说明符多于命令所需的说明符,则第一个(或一些)说明符将被忽略。
可以使用以下方式指定行号: :range {address} {number} 绝对行号 E1247 . 当前行 :.
$ 文件中的最后一行 :$
% 等于 1,$(整个文件) :%
't 标记 t 的位置(小写) :'
'T 标记 T 的位置(大写);当标记在另一个文件中时,它不能用于范围 /{pattern}[/] {pattern} 匹配的下一行 :/
另请参阅下面的 :range-pattern ?{pattern}[?] {pattern} 匹配的上一行 :? 另请参阅下面的 :range-pattern \/ 之前使用的搜索模式匹配的下一行 \? 之前使用的搜索模式匹配的上一行 \& 之前使用的替换模式匹配的下一行
:range-offset
每个后面都可以跟着(多次)'+' 或 '-' 和一个可选的数字。这个数字将被加到或减去前面的行号。如果省略了数字,则使用 1。如果 '+' 或 '-' 前面没有任何内容,则使用当前行。 :range-closed-fold
当逗号后面的行号位于闭合的折叠中时,它将被调整为折叠的最后一行,因此整个折叠将被包含在内。
当添加数字时,这是在调整到折叠的最后一行之后完成的。这意味着这些行将被额外包含在范围内。例如
:3,4+2print
在以下文本中
1 one
2 two
3 three
4 four FOLDED
5 five FOLDED
6 six
7 seven
8 eight
当第 4 行和第 5 行构成一个闭合折叠时,最终打印第 3 行到第 7 行。第 7 行来自范围中的“4”,它被调整为闭合折叠的结束位置 5,然后加上偏移量 2。
减法示例(不太有用)
:2,4-1print
在以下文本中
1 one
2 two
3 三个折叠
4 four FOLDED
5 five FOLDED
6 六个折叠
7 seven
8 eight
当第 3 行到第 6 行构成一个闭合折叠时,最终打印第 2 行到第 6 行。第 6 行来自范围中的“4”,它被调整为闭合折叠的结束位置 6,然后减去 1,然后它仍然在闭合折叠中,使用该折叠的最后一行,即 6。
:范围模式
{pattern} 后的“/”和“?”用于将模式与后面的内容分隔开来。
“/”和“?”前面可以是另一个地址。搜索从那里开始。与使用“;”的区别在于光标不会移动。示例
/pat1//pat2/        Find line containing "pat2" after line containing
                "pat1", without moving the cursor.
7;/pat2/        Find line containing "pat2", after line 7, leaving
                the cursor in line 7.
{number} 必须在 0 到文件中行数之间。当使用 0(零)时,大多数命令将其解释为 1。将其用作计数的命令确实将其用作零 (:tag, :pop 等)。一些命令将零解释为“第一行之前”(:read,搜索模式等)。
示例
.+3                three lines below the cursor
/that/+1        the line below the next line containing "that"
.,$                from current line until end of file
0;/that                the first line containing "that", also matches in the
                first line.
1;/that                the first line after line 1 containing "that"
一些命令允许在命令后添加计数。此计数用作要使用的行数,从最后一个行指定器中给定的行开始(默认值为光标行)。接受计数的命令是那些使用范围但没有文件名参数的命令(因为文件名也可以是数字)。计数不能为负数。
示例
:s/x/X/g 5        substitute 'x' by 'X' in the current line and four
                following lines
:23d 4                delete lines 23, 24, 25 and 26
折叠和范围
当折叠处于活动状态时,行号将四舍五入以包含整个闭合折叠。参见 折叠行为
反向范围 E493
范围应先给出较低的行号。如果不是这种情况,Vim 将询问您是否应该交换行号。
反向范围已给出,可以交换
在全局命令“:g”中不会执行此操作。
您可以在命令前使用“:silent”来避免询问,届时范围将始终被交换。
计数和范围 N:
在输入“:”之前给出计数时,它将转换为
:.,.+(count - 1)
换句话说:光标处及之后“计数”行。示例:要删除三行
3:d<CR>                is translated into: .,.+2d<CR>
可视模式和范围 v_:
{Visual}:使用可视选定行作为范围启动命令行。代码 :'<,'> 用于此范围,这使得可以从命令行历史记录中选择类似的行,以在不同的可视选定行上重复命令。
:* :star :star-visual-range 当可视模式已结束时,使用可视区域作为范围的简便方法是 :*

5. Ex 命令行标志 ex-flags

这些标志受选定的 Ex 命令支持。它们打印光标在执行命令后最终停留的这一行
l 输出类似于 :list # 添加行号 p 输出类似于 :print
这些标志可以组合,因此“l#”同时使用行号和 :list 样式输出。

6. Ex 特殊字符 cmdline-special

注意:这些是在执行的命令行中的特殊字符。如果您想在输入时插入特殊内容,可以使用 CTRL-R 命令。例如,“%”代表当前文件名,而 CTRL-R % 会立即插入当前文件名。参见 c_CTRL-R
注意:如果您想避免 Vim 脚本中特殊字符的影响,您可能希望使用 fnameescape()。另请参见 `=
在 Ex 命令中,在可以使用文件名的位置,以下字符具有特殊含义。这些也可以在表达式函数 expand() 中使用。% 被替换为当前文件名。 :_% c_% # 被替换为备用文件名。 :_# c_# 这将记住每个窗口。 #n(其中 n 是一个数字)被替换为 :_#0 :_#n 缓冲区 n 的文件名。"#0" 与 "#" 相同。 c_#n ## 被替换为参数列表中的所有名称 :_## c_## 连接在一起,用空格隔开。名称中的每个空格前面都带有反斜杠。 #<n(其中 n 是一个大于 0 的数字)被替换为旧 :_#< c_#< 文件名 n。参见 :oldfilesv:oldfiles 以获取数字。 E809
请注意,除了“#<n”之外,这些都给出了输入时的文件名。如果需要绝对路径(当使用来自不同目录的文件名时),您需要添加“:p”。参见 文件名修饰符
“#<n”项返回一个绝对路径,但它将在您的主目录下方的文件前面加上“~/”。
请注意,空格前会插入反斜杠,以便命令能够正确解释文件名。但这对于 shell 命令来说并不会发生。对于那些命令,您可能需要使用引号(这对于包含引号和通配符的文件来说是失败的)
:!ls "%"
:r !spell "%"
要避免“%”和“#”的特殊含义,在其前面插入一个反斜杠。详情:无论有多少个反斜杠,只要前面有一个反斜杠,特殊含义就会始终被转义。
您输入:结果
# alternate.file \# # \\# \# 另请参见 `=
E499 E500 注意:这些是按字面意义输入的,它们不是特殊键! :<cword> <cword> <cword> 被替换为光标下的单词(类似于 star:<cWORD> <cWORD> <cWORD> 被替换为光标下的 WORD(参见 WORD:<cexpr> <cexpr> <cexpr> 被替换为光标下的单词,包括更多内容以形成 C 表达式。例如,当光标位于“ptr->arg”的“arg”上时,结果为“ptr->arg”;当光标位于“list[idx]”的“]”上时,结果为“list[idx]”。 :<cfile> <cfile> <cfile> 被替换为光标下的路径名(类似于 gf 使用的方式) :<afile> <afile> <afile> 在执行自动命令时,被替换为正在操作的缓冲区的文件名,或读写操作的文件。 E495 :<abuf> <abuf> <abuf> 在执行自动命令时,被替换为当前有效的缓冲区号。它并非针对所有事件设置,另请参见 bufnr()。对于“:r 文件”和“:so 文件”,它是当前缓冲区,正在读取/源的文件不在缓冲区中。 E496 :<amatch> <amatch> <amatch> 在执行自动命令时,被替换为执行此自动命令的匹配项。 E497 当文件名不用于匹配时(对于 FileType、Syntax 和 SpellFileMissing 事件),它与 <afile> 不同。当与文件名匹配时,它会扩展到完整路径。 :<sfile> <sfile> <sfile> 在执行 :source 命令时,被替换为源文件的文件名。 E498 在执行函数时,被替换为调用栈,与 <stack> 相同(这是为了向后兼容,建议使用 <stack><script>)。请注意,当 <sfile> 不在脚本内部使用时,文件名修饰符毫无用处。 :<stack> <stack> <stack> 被替换为调用栈,对于函数行使用“函数 {function-name}[{lnum}]”,对于脚本行使用“脚本 {file-name}[{lnum}]”,并在项目之间使用“..”。例如:“函数 {function-name1}[{lnum}]..{function-name2}[{lnum}]”如果没有调用栈,您会收到错误 E489:<script> <script> <script> 在执行 :source 命令时,被替换为源文件的文件名。在执行函数时,被替换为定义该函数的脚本的文件名。如果无法确定文件名,您会收到错误 E1274:<slnum> <slnum> <slnum> 在执行 :source 命令时,被替换为行号。 E842 在执行函数时,它是相对于函数开头的行号。 :<sflnum> <sflnum> <sflnum> 在执行脚本时,被替换为行号。它与 <slnum> 的区别在于,在任何情况下,<sflnum> 都被替换为脚本行号。 E961
文件名修饰符
:_%: ::8 ::p ::. ::~ ::h ::t ::r ::e ::s ::gs ::S %:8 %:p %:. %:~ %:h %:t %:r %:e %:s %:gs %:S 文件名修饰符可以在 "%"、"#"、"#n"、"<cfile>"、"<sfile>"、"<afile>" 或 "<abuf>" 之后使用。它们也与 fnamemodify() 函数一起使用。这些修饰符可以按以下顺序给出: :p 将文件名修改为完整路径。必须是第一个修饰符。还会将 "~/"(以及 Unix 上的 "~user/")更改为主目录的路径。如果名称是目录,则在末尾添加路径分隔符。对于不存在且没有绝对路径的文件名,结果不可预测。在 MS-Windows 上,8.3 文件名将扩展为长文件名。 :8 将路径转换为 8.3 短格式(目前仅在 MS-Windows 上)。将作用于现有路径的尽可能多的路径。 :~ 如果可能,将文件名缩减为相对于主目录的路径。如果文件名不在主目录之下,则文件名不会被修改。 :. 如果可能,将文件名缩减为相对于当前目录的路径。如果文件名不在当前目录之下,则文件名不会被修改。为了最大程度的缩短,请使用 ":~:."。 :h 文件名的头部(最后一个组件以及任何已删除的分隔符)。不能与 :e、:r 或 :t 一起使用。可以重复以删除末尾的多个组件。当文件名以路径分隔符结尾时,只删除路径分隔符。因此,对于目录名称,":p:h" 将导致目录名称本身(没有尾部斜杠)。当文件名是绝对路径(对于 Unix 而言以 "/" 开头;对于 Win32 而言以 "x:\" 开头)时,该部分不会被删除。当没有头部(路径相对于当前目录)时,结果为空。 :t 文件名的尾部(名称的最后一个组件)。必须位于任何 :r 或 :e 之前。 :r 文件名的根(删除最后一个扩展名)。当只有一个扩展名(以 '.' 开头的文件名,例如 ".nvimrc")时,不会被删除。可以重复以删除多个扩展名(最后一个扩展名先删除)。 :e 文件名的扩展名。只有在单独使用时才有意义。当没有扩展名时,结果为空。当只有一个扩展名(以 '.' 开头的文件名)时,结果为空。可以重复以包含更多扩展名。如果没有足够的扩展名(但至少有一个),则尽可能多地包含扩展名。 :s?pat?sub? 将第一个出现的 "pat" 替换为 "sub"。这与 :s 命令类似。"pat" 是正则表达式。任何字符都可以用作 '?',但它不能出现在 "pat" 或 "sub" 中。之后,可以再次使用先前的修饰符。例如 ":p",在替换后创建一个完整路径。 :gs?pat?sub? 将所有出现的 "pat" 替换为 "sub"。否则,这与 ":s" 类似。 :S 为 shell 命令转义特殊字符(参见 shellescape())。必须是最后一个。例子
:!dir <cfile>:S
:call system('chmod +w -- ' . expand('%:S'))
例子,当文件名是 "src/version.c",当前目录是 "/home/mool/vim"
:p                        /home/mool/vim/src/version.c
:p:.                                       src/version.c
:p:~                                 ~/vim/src/version.c
:h                                       src
:p:h                        /home/mool/vim/src
:p:h:h                /home/mool/vim
:t                                           version.c
:p:t                                           version.c
:r                                       src/version
:p:r                        /home/mool/vim/src/version
:t:r                                           version
:e                                                   c
:s?version?main?                       src/main.c
:s?version?main?:p        /home/mool/vim/src/main.c
:p:gs?/?\\?                \home\mool\vim\src\version.c
例子,当文件名是 "src/version.c.gz"
:p                        /home/mool/vim/src/version.c.gz
:e                                                     gz
:e:e                                                   c.gz
:e:e:e                                           c.gz
:e:e:r                                           c
:r                                       src/version.c
:r:e                                                   c
:r:r                                       src/version
:r:r:r                               src/version
extension-removal :_%< 如果在 "%"、"#"、"#n" 或 "CTRL-V p" 后面追加一个 "<",则将删除文件名的扩展名(文件名中最后一个 '.' 及其后的所有内容)。这是为了与版本 3.0 向后兼容,推荐使用 ":r" 形式。例子
%                current file name
%<                current file name without extension
#                alternate file name for current window
#<                idem, without extension
#31                alternate file number 31
#31<                idem, without extension
<cword>                word under the cursor
<cWORD>                WORD under the cursor (see |WORD|)
<cfile>                path name under the cursor
<cfile><        idem, without extension
注意: 在需要文件名的位置,将进行通配符扩展。在 Unix 上,将使用 shell 进行此操作,除非可以在内部进行(为了速度)。反引号也能工作,例如
:n `echo *.c`
但是,只有在扩展 "%"、"#" 等之前存在通配符时,才会进行扩展。这样可以避免扩展文件名内的通配符。如果你想扩展 <cfile> 的结果,请向其添加通配符。例子:(备用文件名是 "?readme?")命令扩展为
:e #                :e ?readme?
:e `ls #`        :e {files matching "?readme?"}
:e #.*                :e {files matching "?readme?.*"}
:cd <cfile>        :cd {file name under cursor}
:cd <cfile>*        :cd {file name under cursor plus "*" and then expanded}
另见 `=.
当扩展后的参数包含 "!" 并且用于 shell 命令(":!cmd"、":r !cmd" 或 ":w !cmd")时,将使用反斜杠转义 "!",以避免将其扩展为先前使用的命令。当 'shell' 选项包含 "sh" 时,这将执行两次,以避免 shell 尝试扩展 "!"。
filename-backslash
对于使用反斜杠作为目录分隔符的文件系统(Windows 文件系统),识别用于转义下一个字符的特殊含义的反斜杠有些困难。一般规则是:如果反斜杠后面跟着一个普通的文件名字符,则它没有特殊含义。因此,"\file\foo" 是一个有效的文件名,你不需要键入两次反斜杠。
一个例外是 "$" 符号。它是在文件名中有效的字符。但为了避免像 "$home" 这样的文件名被解释为环境变量,它需要被一个反斜杠前缀。因此,你需要在根目录中使用 "/\$home" 来表示 "$home" 文件。以下是一些例子
文件名称 解释为
$home 扩展为环境变量 $home 的值 \$home 当前目录中的 "$home" 文件 /\$home 根目录中的 "$home" 文件 \\$home "反斜杠",后面跟着扩展的 $home
另见 `=.

7. 命令行窗口 cmdline-window cmdwin

command-line-window
在命令行窗口中,可以像在任何窗口中编辑文本一样编辑命令行。它是一种特殊的窗口,因为你不能以普通的方式离开它。

打开 c_CTRL-F q: q/ q?

有两种方法可以打开命令行窗口:1. 从命令行模式,使用 'cedit' 选项指定的键。2. 从普通模式,使用 "q:"、"q/" 或 "q?" 命令。这将开始编辑一个 Ex 命令行 ("q:") 或搜索字符串 ("q/" 或 "q?")。请注意,这在录制过程中是不可能的("q" 会停止录制)。
当窗口打开时,它将填充命令行历史记录。最后一行包含到目前为止键入的命令。左侧列将显示一个字符,用于指示正在编辑的命令行类型,参见 cmdwin-char.
当编辑器打开时,Vim 将处于普通模式。
窗口的高度由 'cmdwinheight' 指定(或者如果空间不足,则更小)。窗口始终是全宽的,并位于命令行正上方。

编辑

你现在可以使用命令在窗口中移动和编辑文本。在普通模式和插入模式中都可以使用。
可以使用 ":"、"/" 和其他使用命令行的命令,但不能打开另一个命令行窗口。没有嵌套。 E11 E1188 命令行窗口不是普通窗口。无法移动到另一个窗口或编辑另一个缓冲区。所有执行此操作的命令在命令行窗口中都被禁用。当然,可以执行你在命令行窗口中输入的任何命令。其他文本编辑在关闭窗口时将被丢弃。

关闭 E199

有几种方法可以离开命令行窗口
<CR> 执行光标下的命令行。在插入模式和普通模式中都可以使用。 CTRL-C 在命令行模式下继续。光标下的命令行将用作命令行。在插入模式和普通模式中都可以使用。不会重新绘制,因此窗口将保持可见。 :quit 丢弃命令行并返回普通模式。":close"、CTRL-W c、":exit"、":xit" 和 CTRL-\ CTRL-N 也能工作。 :qall 退出 Vim,除非某些缓冲区中存在更改。 :qall! 退出 Vim,丢弃对任何缓冲区的更改。
关闭命令行窗口后,将恢复旧的窗口大小。执行的命令将应用于启动命令行的窗口和缓冲区。这就像命令行窗口不存在一样工作,除了将有一个额外的屏幕重新绘制。用于命令行窗口的缓冲区将被删除。除了使用 <CR> 执行的那一行以外,对其他行的任何更改都将丢失。
如果你想执行光标下的命令,然后让命令行窗口再次打开,你可能会发现以下映射很有用
:autocmd CmdwinEnter * map <buffer> <F5> <CR>q:

各种

当已经存在命令行窗口时,不能使用命令行窗口(没有嵌套)。
打开命令行窗口时,将设置一些选项: 'filetype' "vim",当编辑 Ex 命令行时;这将在启用 'rightleft' 关闭 'modifiable' 打开 'buftype' "nofile" 'swapfile' 关闭 时启动 Vim 语法高亮显示
允许将缓冲区内容写入文件。这是一种保存命令行历史记录并稍后将其读回的简单方法。
如果 'wildchar' 选项设置为 <Tab>,并且命令行窗口用于 Ex 命令,那么将添加两个映射,以便在命令行窗口中使用 <Tab> 进行补全,如下所示
:inoremap <buffer> <Tab> <C-X><C-V>
:nnoremap <buffer> <Tab> a<C-X><C-V>
请注意,在普通模式下按 <Tab> 会对下一个字符进行补全。这样,它就可以在行尾起作用。如果你不想要这些映射,请使用以下命令禁用它们
au CmdwinEnter [:>] iunmap <buffer> <Tab>
au CmdwinEnter [:>] nunmap <buffer> <Tab>
你可以将这些行放在你的 vimrc 文件中。
在命令行窗口中,你不能使用鼠标将光标放在另一个窗口中,或者拖动其他窗口的状态栏。你可以拖动命令行窗口本身的状态栏和它上面的状态栏。因此,你可以调整命令行窗口的大小,但不能调整其他窗口的大小。
getcmdwintype() 函数返回正在编辑的命令行的类型,如 cmdwin-char 中所述。
Nvim 在 "nvim_cmdwin" 组中定义了这个默认的 CmdWinEnter autocmd
autocmd CmdWinEnter [:>] syntax sync minlines=1 maxlines=1
你可以在你的配置中使用 "autocmd! nvim_cmdwin" 禁用它。 default-autocmds

自动命令

使用两个自动命令事件: CmdwinEnterCmdwinLeave。你可以使用 Cmdwin 事件对命令行窗口进行专门的设置。请小心不要造成副作用!例子
:au CmdwinEnter :  let b:cpt_save = &cpt | set cpt=.
:au CmdwinLeave :  let &cpt = b:cpt_save
这将设置 'complete' 以便为 i_CTRL-N 使用当前窗口中的补全。另一个例子
:au CmdwinEnter [/?]  startinsert
这将使 Vim 在命令行窗口中以插入模式启动。
cmdline-char cmdwin-char 用于模式的字符表示命令行的类型:: 正常 Ex 命令 > 调试模式命令 调试模式 / 向前搜索字符串 ? 向后搜索字符串 = 表达式,用于 "= 表达式寄存器 @ 字符串,用于 input() - 文本,用于 :insert:append
命令索引
快速参考