Nvim :help
页面,生成 于 源代码 使用 tree-sitter-vimdoc 解析器。
<F1>
外)在 Vim 中没有预定义的含义,因此它们是映射的不错选择。示例:map <F2> GoDate: <Esc>:read !date<CR>kJ这展示了三种模式的用法。在使用“G”转到最后一行后,“o”命令打开新行并进入插入模式。插入文本“Date: ”,
<Esc>
将您带出插入模式。注意在 <> 中使用特殊键。这称为尖括号表示法。您将它们作为单独的字符输入,而不是通过按下键本身。这使映射更具可读性,并且您可以复制和粘贴文本而不会出现问题。":" 字符将 Vim 带到命令行。":read !date" 命令读取来自“date”命令的输出并在当前行的下方追加它。<CR>
用于执行 ":read" 命令。在执行到此阶段时,文本看起来像这样:imap <F2> <CR>Date: <Esc>:read !date<CR>kJ它看起来非常像正常模式下
<F2>
的映射,只是开头不同。正常模式下 <F2>
的映射仍然存在。因此,您可以为每种模式以不同的方式映射同一个键。注意,虽然此映射从插入模式开始,但它在正常模式下结束。如果您希望它继续在插入模式下,请在映射后附加一个“a”。<F7>
,以便命令 d<F7> 删除 C 程序块(用花括号 {} 包围的文本)。类似地,y<F7> 会将程序块剪切到无名寄存器中。因此,您需要做的是定义 <F7>
来选择当前程序块。您可以使用以下命令执行此操作:omap <F7> a{这会导致
<F7>
在操作挂起模式下执行选择块“a{”,就像您键入它一样。如果在键盘上键入 { 有些困难,此映射非常有用。<F2>
:s/^/> /<CR>:noh<CR>``<F2>
:.,$s/^/> /<CR>:noh<CR>``<xHome>
<Home>
<xEnd>
<End>
<Esc>
以颜色显示时,它代表转义字符。当它与其他文本具有相同的颜色时,它就是五个字符。<F2>
的映射可以缩短为:map <F2> G<F3> :imap <F2> <Esc><F3> :map <F3> oDate: <Esc>:read !date<CR>kJ对于正常模式,
<F2>
映射到转到最后一行,然后像按下 <F3>
一样执行。在插入模式下,<F2>
使用 <Esc>
停止插入模式,然后也使用 <F3>
。然后 <F3>
被映射到执行实际工作。:map Q gq但是,在极少数情况下,您仍然需要使用 Ex 模式。让我们将“gQ”映射到 Q,以便您仍然可以进入 Ex 模式
:map gQ Q现在发生的情况是,当您键入“gQ”时,它被映射到“Q”。到目前为止一切顺利。但是,然后“Q”被映射到“gq”,因此键入“gQ”会导致“gq”,而您根本无法进入 Ex 模式。为了避免再次映射键,请使用 ":noremap" 命令
:noremap gQ Q现在 Vim 知道“Q”不应该被检查是否有适用于它的映射。每个模式都有类似的命令
vim *.txt
编辑这些文件。您现在正在编辑第一个文件。定义此映射:map ,, :s/5.1/5.2/<CR>:wnext<CR>,,现在您键入",,"。这将触发映射。它将第一行中的“5.1”替换为“5.2”。然后它执行 ":wnext" 以写入文件并编辑下一个文件。映射以",," 结束。这将再次触发相同的映射,从而执行替换,等等。这将一直持续,直到出现错误。在这种情况下,这可能是文件中的替换命令找不到“5.1”的匹配项。然后您可以进行更改以插入“5.1”并通过再次键入",," 来继续。或者 ":wnext" 失败,因为您位于列表中的最后一个文件。当映射在中途遇到错误时,映射的其余部分将被丢弃。
CTRL-C
中断映射(在 MS-Windows 上为 CTRL-Break
)。:map <C-A> /---><CR> :vunmap <C-A>注意,五个字符“<C-A>”代表单个键
CTRL-A
。<Bar>
(五个字符)。示例:map <F8> :write <Bar> !checkin %:S<CR>":unmap" 命令也存在同样的问题,此外您还需要注意尾随的空格。这两个命令不同
:unmap a | unmap b :unmap a| unmap b第一个命令尝试取消映射“a ”,带有一个尾随空格。
<Space>
(七个字符):map <Space> W这将使空格键向前移动一个空格分隔的单词。
|"
,这将启动一个带有注释的新空命令。示例:map <Space> W| " Use spacebar to move forward a word
:imap aa foo :imap aaa bar现在,当您键入“aa”时,Vim 不知道应该应用第一个映射还是第二个映射。它等待另一个字符被键入。如果它是“a”,则应用第二个映射,结果为“bar”。如果它是一个空格,例如,则应用第一个映射,结果为“foo”,然后插入空格。
<script>
关键字可用于使映射对脚本本地有效。参见 :map-<script>。<buffer>
关键字可用于使映射对特定缓冲区本地有效。参见 :map-<buffer><unique>
关键字可用于在映射已存在时使定义新映射失败。否则,新映射将简单地覆盖旧映射。参见 :map-<unique>。<Nop>
(五个字符)。这将使 <F7>
键完全不执行任何操作:map <F7> <Nop>| map! <F7> <Nop>
<Nop>
后面不能有空格。:command DeleteFirst 1delete现在,当您执行命令 ":DeleteFirst" 时,Vim 将执行 ":1delete",这将删除第一行。
:command就像内置命令一样,用户定义的命令可以缩写。您只需要键入足以区分命令与其他命令的字符。可以使用命令行补全来获得完整的名称。
:command -nargs=0 DeleteFirst 1delete但是,由于零个参数是默认值,因此您不需要添加 "-nargs=0"。-nargs 的其他值如下所示:
<args>
关键字表示。例如:command -nargs=+ Say :echo "<args>"现在,当您键入
:Say Hello WorldVim 会回显 "Hello World"。但是,如果您添加双引号,它将无法正常工作。例如
:Say he said "hello"要将特殊字符转换为字符串,并进行适当转义以用作表达式,请使用 "<q-args>"
:command -nargs=+ Say :echo <q-args>现在,上面的 ":Say" 命令将导致执行以下操作:
:echo "he said \"hello\""
<f-args>
关键字包含与 <args>
关键字相同的信息,但格式适合用作函数调用参数。例如:command -nargs=* DoIt :call AFunction(<f-args>) :DoIt a b c执行以下命令:
:call AFunction("a", "b", "c")
{count}
。<line1>
和 <line2>
将获取范围中第一行和最后行的值。例如,以下命令定义了 SaveIt 命令,该命令将指定的范围写入文件 "save_file":command -range=% SaveIt :<line1>,<line2>write! save_file
{number}
。可以使用 <count>
关键字获取生成的计数。 -bang 可以使用 !。如果存在,使用 <bang>
将导致出现 !。 -register 可以指定寄存器。(默认值为无名寄存器。)寄存器规范可用作 <reg>
(也称为 <register>
)。 -complete={type} 使用的命令行补全类型。有关可能值的列表,请参阅 :command-completion。 -bar 命令后面可以接 | 和另一个命令,或者 " 和注释。 -buffer 命令仅适用于当前缓冲区。<lt>
关键字。它代表字符 <。使用它来转义上述提到的 <> 项目的特殊含义。:command -nargs=+ Say :echo "<args>" :command! -nargs=+ Say :echo <q-args>要删除用户命令,请使用 ":delcommand"。它接受单个参数,即命令的名称。示例
:delcommand SaveIt要删除所有用户命令
:comclear小心,这无法撤消!
:function DateInsert() : $delete : read !date :endfunction您希望每次在将缓冲区写入文件之前调用此函数。这将使其发生
:autocmd BufWritePre * call DateInsert()"BufWritePre" 是触发此自动命令的事件:在(pre)将缓冲区写入文件之前。"*" 是与文件名匹配的模式。在这种情况下,它与所有文件匹配。启用此命令后,当您执行 ":write" 时,Vim 会检查任何匹配的 BufWritePre 自动命令并执行它们,然后执行 ":write"。:autocmd 命令的通用形式如下:
:autocmd [group] {events} {file-pattern} [++nested] {command}[group] 名称是可选的。它用于管理和调用命令(稍后将详细介绍)。
{events}
参数是触发命令的事件列表(以逗号分隔)。{file-pattern}
是一个文件名,通常包含通配符。例如,使用 "*.txt" 使自动命令用于所有以 ".txt" 结尾的文件。可选的 [++nested] 标志允许自动命令嵌套(见下文),最后,{command}
是要执行的命令。:augroup updateDate : autocmd! : autocmd BufWritePre * call DateInsert() :augroup END这将在定义新的自动命令之前,删除任何以前定义的具有
:autocmd!
的自动命令。组将在后面解释。:autocmd BufReadPost *.gsm set filetype=asm如果 Vim 能够检测文件类型,它将为您设置 'filetype' 选项。这将触发 Filetype 事件。使用它在编辑特定类型的文件时执行某些操作。例如,要加载文本文件的缩写列表
:autocmd Filetype text source ~/.config/nvim/abbrevs.vim开始编辑新文件时,您可以让 Vim 插入骨架
:autocmd BufNewFile *.[ch] 0read ~/skeletons/skel.c有关事件的完整列表,请参阅 autocmd-events。
{file-pattern}
参数实际上可以是逗号分隔的文件模式列表。例如:*.c,*.h
与以 ".c" 和 ".h" 结尾的文件匹配。可以使用通常的文件通配符。以下是最常用通配符的摘要{command}
并使用 !。示例:autocmd! FileWritePre *这将删除使用 "*" 模式的 "FileWritePre" 事件的所有自动命令。
:autocmd列表可能很长,尤其是在使用文件类型检测时。要仅列出部分命令,请指定组、事件和/或模式。例如,要列出所有 BufNewFile 自动命令
:autocmd BufNewFile要列出 "*.c" 模式的所有自动命令
:autocmd * *.c对事件使用 "*" 将列出所有事件。要列出 cprograms 组的所有自动命令
:autocmd cprograms
{group}
项目将相关的自动命令分组在一起。这可以用于删除某个组中的所有自动命令,例如。在为某个组定义多个自动命令时,请使用 ":augroup" 命令。例如,让我们定义 C 程序的自动命令:augroup cprograms : autocmd BufReadPost *.c,*.h :set sw=4 sts=4 : autocmd BufReadPost *.cpp :set sw=3 sts=3 :augroup END这将执行与以下操作相同的事情:
:autocmd cprograms BufReadPost *.c,*.h :set sw=4 sts=4 :autocmd cprograms BufReadPost *.cpp :set sw=3 sts=3要删除 "cprograms" 组中的所有自动命令
:autocmd! cprograms
:autocmd FileChangedShell * ++nested edit
:autocmd BufReadPost *.new execute "doautocmd BufReadPost " . expand("<afile>:r")这定义了一个在编辑新文件时触发的自动命令。文件名必须以 ".new" 结尾。":execute" 命令使用表达式求值来形成一个新命令并执行它。在编辑文件 "tryout.c.new" 时,执行的命令将是
:doautocmd BufReadPost tryout.cexpand() 函数接受 "<afile>" 参数,该参数代表执行自动命令的文件名,并使用 ":r" 获取文件名的根目录。
:autocmd BufReadPost *.log normal G这将在您开始编辑
*.log
文件时使光标跳转到文件的最后一行。使用 ":normal" 命令有点棘手。首先,确保其参数是一个完整的命令,包括所有参数。当您使用 "i" 进入插入模式时,也必须使用 <Esc>
退出插入模式。如果您使用 "/" 开始搜索模式,则必须使用 <CR>
执行它。":normal" 命令将使用其后的所有文本作为命令。因此,在后面不能有 | 和另一个命令。要解决此问题,请将 ":normal" 命令放在 ":execute" 命令中。这也使得能够以便捷的方式传递不可打印字符。示例:autocmd BufReadPost *.chg execute "normal ONew entry:\<Esc>" | \ 1read !date这也展示了如何使用反斜杠将长命令分解为多行。这可以在 Vim 脚本中使用(不在命令行中)。
:set eventignore=WinEnter,WinLeave要忽略所有事件,请使用以下命令
:set eventignore=all要将其设置回正常行为,请使 'eventignore' 为空
:set eventignore=