Nvim :help
页面,生成 自 来源 使用 tree-sitter-vimdoc 解析器。
:map <F2> a<C-R>=strftime("%c")<CR><Esc>这会在光标后追加当前日期和时间(以 <> 表示法 <>)。
{lhs}
{rhs}
mapmode-nvo :map{lhs}
{rhs}
mapmode-n :nm :nmap :vm[ap] {lhs}
{rhs}
mapmode-v :vm :vmap :xm[ap] {lhs}
{rhs}
mapmode-x :xm :xmap :smap {lhs}
{rhs}
mapmode-s :smap{lhs}
{rhs}
mapmode-o :om :omap :map! {lhs}
{rhs}
mapmode-ic :map!{lhs}
{rhs}
mapmode-i :im :imap :lm[ap] {lhs}
{rhs}
mapmode-l :lm :lma :lmap :cm[ap] {lhs}
{rhs}
mapmode-c :cm :cmap :tma[p] {lhs}
{rhs}
mapmode-t :tma :tmap 将键序列 {lhs}
映射到 {rhs}
,适用于 map 命令适用的模式。然后,包括 {rhs}
在内的结果将进一步扫描映射。这允许嵌套和递归使用映射。 注意: {rhs}
中包含尾随空格,因为空格是有效的 Normal 模式命令。参见 map-trailing-white。{lhs}
{rhs}
mapmode-nvo :no :noremap :nor :nn[oremap] {lhs}
{rhs}
mapmode-n :nn :nnoremap :vn[oremap] {lhs}
{rhs}
mapmode-v :vn :vnoremap :xn[oremap] {lhs}
{rhs}
mapmode-x :xn :xnoremap :snor[emap] {lhs}
{rhs}
mapmode-s :snor :snore :snoremap :ono[remap] {lhs}
{rhs}
mapmode-o :ono :onoremap :no[remap]! {lhs}
{rhs}
mapmode-ic :no! :noremap! :ino[remap] {lhs}
{rhs}
mapmode-i :ino :inor :inoremap :ln[oremap] {lhs}
{rhs}
mapmode-l :ln :lnoremap :cno[remap] {lhs}
{rhs}
mapmode-c :cno :cnor :cnoremap :tno[remap] {lhs}
{rhs}
mapmode-t :tno :tnoremap 将键序列 {lhs}
映射到 {rhs}
,适用于 map 命令适用的模式。禁止映射 {rhs}
,以避免嵌套和递归映射。通常用于重新定义命令。 注意: {rhs}
中的键也不会触发缩写,但 i_CTRL-] 和 c_CTRL-] 除外。 注意: 当 <Plug>
出现在 {rhs}
中时,即使禁止重新映射,此部分也始终应用。{lhs}
mapmode-nvo :unm :unmap :nun[map] {lhs}
mapmode-n :nun :nunmap :vu[nmap] {lhs}
mapmode-v :vu :vunmap :xu[nmap] {lhs}
mapmode-x :xu :xunmap :sunm[ap] {lhs}
mapmode-s :sunm :sunmap :ou[nmap] {lhs}
mapmode-o :ou :ounmap :unm[ap]! {lhs}
mapmode-ic :unm! :unmap! :iu[nmap] {lhs}
mapmode-i :iu :iunmap :lu[nmap] {lhs}
mapmode-l :lu :lunmap :cu[nmap] {lhs}
mapmode-c :cu :cun :cunmap :tunma[p] {lhs}
mapmode-t :tunma :tunmap 删除 {lhs}
的映射,适用于 map 命令适用的模式。映射可能仍为其他适用模式定义。它在 {lhs}
与映射的 {rhs}
匹配时也有效。这是因为应用了缩写。 注意: {lhs}
中包含尾随空格。参见 map-trailing-white。<buffer>
参数删除缓冲区本地映射 :map-<buffer> 警告: 这还会删除 default-mappings。{lhs}
mapmode-nvo :map_l{lhs}
mapmode-n :nmap_l{lhs}
mapmode-v :vmap_l{lhs}
mapmode-x :xmap_l{lhs}
mapmode-s :smap_l{lhs}
mapmode-o :omap_l{lhs}
mapmode-ic :map_l!{lhs}
mapmode-i :imap_l{lhs}
mapmode-l :lmap_l{lhs}
mapmode-c :cmap_l{lhs}
mapmode-t :tmap_l{lhs}
开头的键序列的按键映射。:imap aa foo :imap aaa bar当 Vim 读取到 "aa" 时,它需要读取另一个字符才能决定是映射 "aa" 还是 "aaa"。这意味着在输入 "aa" 后,映射不会立即展开,Vim 会等待另一个字符。如果你输入空格,那么 "foo" 将被插入,加上空格。如果你输入 "a",那么 "bar" 将被插入。
:map @@ foo :unmap @@ | print因为它尝试解除 "@@ " 的映射,包括命令分隔符 "|" 之前的空格。其他包含尾随空格的示例
unmap @@ unmap @@ " comment将会出现一个错误,很难识别,因为 `unmap @@` 中的尾随空格字符不可见。
unmap @@| " comment
:map <buffer> ,w /[.,;]<CR>然后你可以在另一个缓冲区中将 ",w" 映射到其他内容
:map <buffer> ,w /[#&!]<CR>局部缓冲区映射在全局映射之前使用。请参阅下面的 `<nowait>`,以使较短的局部映射在存在较长的全局映射时不生效。"<buffer>" 参数也可以用于清除映射
:unmap <buffer> ,w :mapclear <buffer>当缓冲区被删除时,局部映射也会被清除,但当缓冲区被卸载时不会被清除。就像局部选项值一样。另请参阅 map-precedence。
:map <silent> ,h /Header<CR>使用此映射时,搜索字符串不会被回显。但是,执行的命令发出的消息仍然会给出。要同时关闭它们,请在执行的命令中添加 ":silent"
:map <silent> ,h :exe ":silent normal /Header\r"<CR>请注意,命令的效果也可能被静默,例如,当映射选择命令行自动完成的另一个条目时,它不会被显示。提示仍然会给出,例如,对于 inputdialog()。在缩写中使用 "<silent>" 是可能的,但会导致命令行的重绘失败。
:map <unique> ,w /[#&!]<CR>当定义一个局部映射时,还会检查是否已经存在一个等于它的全局映射。示例:什么会失败
:map ,w /[#&!]<CR> :map <buffer> <unique> ,w /[.,;]<CR>如果你想映射一个键,然后让它执行它最初被映射到的操作,请查看 maparg()。
:inoremap <expr> . <SID>InsertDot()s:InsertDot() 函数的结果将被插入。它可以检查光标之前的文本,并在满足某些条件时启动 omni 自动完成。使用脚本局部函数更好,以避免污染全局命名空间。在 RHS 中使用 `<SID>`,这样就可以找到定义映射的脚本。
func StoreColumn() let g:column = col('.') return 'x' endfunc nnoremap <expr> x StoreColumn() nmap ! f!x你会注意到 g:column 的值来自执行 "f!" 之前,因为 "x" 在执行 "f!" 之前被求值。这可以通过在表达式映射的字符之前插入 `<Ignore>` 来解决
nmap ! f!<Ignore>x对副作用要非常小心!表达式在获取字符时被求值,你很可能使命令无法正常工作。因此,以下内容被禁止用于 `<expr>` 映射
inoremap <expr> <C-L> nr2char(getchar()) inoremap <expr> <C-L>x "foo"如果你现在输入 `CTRL-L`,什么也不会发生,Vim 需要下一个字符来决定使用哪个映射。如果你输入 'x',则使用第二个映射并插入 "foo"。如果你输入任何其他键,则使用第一个映射,getchar() 获取输入的键并将其返回。
let counter = 0 inoremap <expr> <C-L> ListItem() inoremap <expr> <C-R> ListReset() func ListItem() let g:counter += 1 return g:counter .. '. ' endfunc func ListReset() let g:counter = 0 return '' endfuncCTRL-L 插入下一个数字,`CTRL-R` 重置计数。`CTRL-R` 返回一个空字符串,因此不会插入任何内容。
noremap x <Cmd>echo mode(1)<CR>
nnoremap <F3> aText <Cmd>echo mode(1)<CR> Added<Esc>与 `<expr>` 映射不同,`<Cmd>` 命令没有特殊限制:它就像一个(不受限制的)autocommand 被调用或者一个异步事件被处理一样被执行。
onoremap <silent> F :<C-U>normal! 0f(hviw<CR>
CTRL-U
(<C-U>
) 用于删除 Vim 可能插入的范围。普通模式命令找到第一个 '(' 字符并选择它之前的第一个单词。这通常是函数名。:map xx something-difficult :ounmap xx类似地,用于可视和操作符等待模式或普通和操作符等待模式的映射。
CTRL-^
命令 i_CTRL-^ c_CTRL-^ 禁用映射。这些命令会更改 'iminsert' 选项的值。当开始输入普通命令行(而不是搜索模式)时,映射将被禁用,直到键入 CTRL-^
为止。最后使用的状态将分别记住插入模式和搜索模式。插入模式的状态在将字符作为命令(如 "f" 或 "t")的参数键入时也会使用。语言映射永远不会应用于已映射的字符。它们仅用于键入的字符。这假定在键入映射时已完成语言映射。相应地,语言映射在录制宏时应用,而不是在应用宏时应用。<Space>
普通、可视、选择和操作符等待 n 普通 v 可视和选择 s 选择 x 可视 o 操作符等待 ! 插入和命令行 i 插入 l ":lmap" 映射,用于插入、命令行和语言-参数 c 命令行 t 终端作业{rhs}
之前,可能会出现特殊字符: * 表示不可重新映射 & 表示只有脚本本地映射可重新映射 @ 表示缓冲区本地映射{lhs}
之后的第一个非空格字符到行尾(或 '|')的所有内容都被视为 {rhs}
的一部分。这允许 {rhs}
以空格结尾。{lhs}
和 {rhs}
在原始形式中匹配。如果使用 nvim_set_keymap() 或 nvim_buf_set_keymap() 添加了描述,则模式也会与它匹配。:verbose map <C-W>* n <C-W>* * <C-W><C-S>* Last set from ~/.config/nvim/init.vim有关更多信息,请参见 :verbose-cmd。
CTRL-K
,然后按功能键,或使用形式 "<F2>"、"<F10>"、"<Up>"、"<S-Down>"、"<S-F7>" 等(请参见键表 key-notation,所有从 <Up>
开始的键都可以使用)。CTRL-V
作为映射和缩写的特殊字符。当 'cpoptions' 不包含 'B' 时,反斜杠也可以像 CTRL-V
一样使用。然后可以使用 <> 符号 <>。但是您不能像 CTRL-V
一样使用 "<C-V>" 来转义后续内容的特殊含义。{rhs}
中按字面意思使用反斜杠,可以使用特殊序列 "<Bslash>"。这样可以避免在使用嵌套映射时需要双反斜杠。{lhs}
中使用 CTRL-C
是可能的,但它只会在 Vim 等待键时有效,而不会在 Vim 忙于其他操作时有效。当 Vim 忙时,CTRL-C 会中断/终止命令。在 MS-Windows 上使用 GUI 版本时,可以将 CTRL-C
映射到允许将复制命令复制到剪贴板。使用 CTRL-Break
中断 Vim。{lhs}
中包含空格,请在其前面加上 CTRL-V
(对于每个空格,请键入两次 CTRL-V
)。 map_space_in_rhs map-space_in_rhs 如果您想要一个以空格开头的 {rhs}
,请使用 "<Space>"。为了完全兼容 Vi(但不可读),请不要使用 <> 符号,请在 {rhs}
前面加上一个 CTRL-V
(您必须键入两次 CTRL-V
)。 map_empty_rhs map-empty_rhs 您可以通过在单个 CTRL-V
后什么都不键入来创建一个空的 {rhs}
(您必须键入两次 CTRL-V
)。不幸的是,您无法在 vimrc 文件中执行此操作。 <Nop> 获取不产生任何内容的映射的更简单方法是使用 "<Nop>" 作为 {rhs}
。例如,要禁用功能键 8:map <F8> <Nop> :map! <F8> <Nop>
:set encoding=latin1 :imap <M-C> foo :set encoding=utf-8
<M-C>
的映射使用 latin1 编码定义,结果为 0xc3 字节。如果您在 UTF-8 编码中键入字符 á (0xe1 <M-a>
),则它将是两个字节 0xc3 0xa1。您不希望 0xc3 字节被映射,否则将无法键入 á 字符。map <Leader>A oanother line<Esc>就像
map \A oanother line<Esc>但是之后
let mapleader = ","它就像
map ,A oanother line<Esc>请注意,"g:mapleader" 的值在定义映射时使用。在之后更改 "g:mapleader" 对已定义的映射没有影响。
<LocalLeader>
与 <Leader>
相同,只是它使用 "maplocalleader" 而不是 "mapleader"。<LocalLeader>
用于对缓冲区本地的映射。示例:map <buffer> <LocalLeader>A oanother line<Esc>
<Leader>
,在文件类型插件中,应使用 <LocalLeader>
。"mapleader" 和 "maplocalleader" 可以相等。尽管如此,如果将它们设为不同,则全局插件的映射与文件类型插件的映射冲突的可能性较小。例如,您可以将 "mapleader" 保持为默认的反斜杠,并将 "maplocalleader" 设置为下划线。<Char>
结构:<Char-123>
字符 123 <Char-033>
字符 27 <Char-0x7f>
字符 127 <S-Char-114>
字符 114 ('r') <S-Char-114>
字符 114 ('r') 这是在 'keymap' 文件中指定(多字节)字符的有效方法。忽略大小写差异。{rhs}
中包含 '|'。有三种方法<Bar>
always :map _l :!ls <Bar>
more^M \| 'b' 不在 'cpoptions' 中:map _l :!ls \| more^M ^V| always :map _l :!ls ^V| more^MCTRL-V
;要获取一个 CTRL-V
,您必须键入两次;您不能在此处使用 <> 符号“<C-V>”)。<CR>
(参见 <>)。示例:map _ls :!ls -l %:S<CR>:echo "the end"<CR>要避免映射在插入或命令行模式下输入的字符,请先键入
CTRL-V
。 map-errorCTRL-X
的第二个字符(参数)不会被映射。这样做是为了能够使用所有命名的寄存器和标记,即使具有相同名称的命令已被映射。{lhs}
的键。您必须避免用于 Vim 命令的键,否则您将无法再使用这些命令。以下是一些建议<F2>
、<F3>
等。以及移位的功能键 <S-F1>
、<S-F2>
等。请注意,<F1>
已用于帮助命令。CTRL-P
和 CTRL-N
。使用额外的字符以允许更多映射。<Leader>
定义的键和一个或多个其他键。这在脚本中尤其有用。 mapleader{key}
^D”来确定一个键是否用于某个命令。({key}
是您要了解的特定键,^D 是 CTRL-D
)。:map <F3> o#include :map <M-g> /foo<CR>cwbar<Esc> :map _x d/END/e<CR> :map! qq quadrillion questions乘以计数
{lhs}
之前键入了计数一样。例如,使用此映射:map <F4> 3w键入 2<F4> 将导致“23w”。因此,不会移动 2 * 3 个单词,而是 23 个单词。如果您想乘以计数,请使用表达式寄存器
:map <F4> @='3w'<CR>引号之间的部分是正在执行的表达式。 @=
<nowait>
定义了一个完整的映射,即使更长的映射具有相同的词缀,Vim 也会立即使用它。例如,给定以下两个映射:map <buffer> <nowait> \a :echo "Local \a"<CR> :map \abc :echo "Global \abc"<CR>键入 \a 时,将立即使用缓冲区局部映射。Vim 不会等待更多字符来查看用户是否可能正在键入 \abc。
<F1>
到 <F4>
时,生成的实际键代码可能对应于 <xF1>
到 <xF4>
。从 <xF1>
到 <F1>
、<xF2>
到 <F2>
等等都有映射,但这些映射在另一个半映射之后不会被识别。确保 <F1>
到 <F4>
的键代码正确:set <F1>=<type CTRL-V><type F1>
<F1>
作为四个字符。'=' 之后的必须使用实际键来完成,而不是文字文本。另一个解决方案是在第二个特殊键的映射中使用实际键代码:map <F1><Esc>OP :echo "yes"<CR>不要键入真正的
<Esc>
,Vim 将识别键代码并将其替换为 <F1>
。{rhs}
中包含 {lhs}
,则您有一个递归映射。当键入 {lhs}
时,它将被替换为 {rhs}
。当遇到包含在 {rhs}
中的 {lhs}
时,它将被替换为 {rhs}
,依此类推。这使得可以无限次重复一个命令。唯一的问题是,停止它的唯一方法是导致错误。用于解决迷宫的宏使用此方法,请查看那里以获取示例。有一个例外:如果 {rhs}
以 {lhs}
开头,则第一个字符不会再次映射(这与 Vi 兼容)。例如:map ab abcd将执行“a”命令并在文本中插入“bcd”。
{rhs}
中的“ab”不会再次映射。:noremap k j :noremap j k这将交换光标向上和向下命令。
{lhs}
的一部分为止。例如,如果您使用:map x y :map y xVim 将用 y 替换 x,然后用 x 替换 y,依此类推。当这种情况发生 'maxmapdepth' 次(默认值 1000)时,Vim 将给出错误消息“递归映射”。
<A-k>
形式。请注意,<A-k>
和 <A-K>
不同,后者将使用大写字母。实际上,<A-K>
和 <A-S-K>
是相同的。您也可以使用“M”代替“A”。如果您有实际的 Meta 修饰键,请参见 :map-meta-keys。{key}
在 'ttimeoutlen' 毫秒内,ESC 将被解释为:<ALT-{key}> 否则它将被解释为两次按键:<ESC>
{key}
<M-a>
实际上是使用 Alt 键。这可能会让人困惑!它无法更改,它不向后兼容。:imap <T-b> terrible1.12 映射 SUPER 键或 COMMAND 键 :map-super-keys :map-cmd-key
:imap <D-b> barritone
{motion}
命令之前。要定义您自己的运算符,您必须创建一个映射,该映射首先设置 'operatorfunc' 选项,然后调用 g@ 运算符。在用户键入 {motion}
命令之后,将调用指定的函数。{motion}
移动的文本的开头,']' 标记位于文本的最后一个字符上。该函数使用一个字符串参数调用:"line" {motion}
是 行级别的 "char" {motion}
是 字符级别的 "block" {motion}
是 块级别的视觉模式 可以强制类型,参见 强制运动。<F4>
统计空格数量。nnoremap <expr> <F4> CountSpaces() xnoremap <expr> <F4> CountSpaces() " doubling <F4> works on a line nnoremap <expr> <F4><F4> CountSpaces() .. '_' function CountSpaces(context = {}, type = '') abort if a:type == '' let context = #{ \ dot_command: v:false, \ extend_block: '', \ virtualedit: [&l:virtualedit, &g:virtualedit], \ } let &operatorfunc = function('CountSpaces', [context]) set virtualedit=block return 'g@' endif let save = #{ \ clipboard: &clipboard, \ selection: &selection, \ virtualedit: [&l:virtualedit, &g:virtualedit], \ register: getreginfo('"'), \ visual_marks: [getpos("'<"), getpos("'>")], \ } try set clipboard= selection=inclusive virtualedit= let commands = #{ \ line: "'[V']", \ char: "`[v`]", \ block: "`[\<C-V>`]", \ }[a:type] let [_, _, col, off] = getpos("']") if off != 0 let vcol = getline("'[")->strpart(0, col + off)->strdisplaywidth() if vcol >= [line("'["), '$']->virtcol() - 1 let a:context.extend_block = '$' else let a:context.extend_block = vcol .. '|' endif endif if a:context.extend_block != '' let commands ..= 'oO' .. a:context.extend_block endif let commands ..= 'y' execute 'silent noautocmd keepjumps normal! ' .. commands echomsg getreg('"')->count(' ') finally call setreg('"', save.register) call setpos("'<", save.visual_marks[0]) call setpos("'>", save.visual_marks[1]) let &clipboard = save.clipboard let &selection = save.selection let [&l:virtualedit, &g:virtualedit] = get(a:context.dot_command ? save : a:context, 'virtualedit') let a:context.dot_command = v:true endtry endfunction使用
<expr>
映射可以获取任何前缀计数和寄存器。这还避免了使用命令行,因为命令行会触发 CmdlineEnter 和 CmdlineLeave 自动命令。mode()
函数将返回应用操作符后的状态。nnoremap <F4> <Cmd>let &opfunc='{t -> \ getline(".") \ ->split("\\zs") \ ->insert("\"", col("'']")) \ ->insert("\"", col("''[") - 1) \ ->join("") \ ->setline(".")}'<CR>g@
<Esc>
或结束命令的 <CR>
。结束缩写词的非关键字字符将在扩展的缩写词后插入。例外情况是字符 <C-]>
,它用于扩展缩写词而不插入任何额外的字符。:ab hh hello
{CURSOR}
是您键入非关键字字符的位置):ab foo four old otters
:ab #i #include
:ab ;; <endofline>
<endofline>
"CTRL-V
。例如,CTRL-V
<Space>
。或者键入部分缩写词,使用 <Esc>
退出插入模式,使用 "a" 重新进入插入模式,然后键入其余部分。CTRL-V
以避免它被替换。否则,在普通字符前面的 CTRL-V
通常会被忽略。:iab if if ()<Left>您甚至可以执行更复杂的操作。例如,要使用在缩写词后键入的空格
func Eatchar(pat) let c = nr2char(getchar(0)) return (c =~ a:pat) ? '' : c endfunc iabbr <silent> if if ()<Left><C-R>=Eatchar('\s')<CR>没有默认的缩写词。
:abb <buffer> FF for (i = 0; i < ; ++i)
:verbose abbreviate ! teh the Last set from /home/abcd/vim/abbr.vim有关更多信息,请参见 :verbose-cmd。
{lhs}
列出以 {lhs}
开头的缩写词。您可能需要插入 CTRL-V
(键入两次)以避免键入的 {lhs}
被扩展,因为命令行缩写词在这里适用。<expr>
] [<buffer>
] {lhs}
{rhs}
为 {lhs}
添加缩写词到 {rhs}
。如果 {lhs}
已经存在,它将被新的 {rhs}
替换。{rhs}
可能包含空格。请参见 :map-<expr> 以了解可选的 <expr>
参数。请参见 :map-<buffer> 以了解可选的 <buffer>
参数。<buffer>
] {lhs}
从列表中删除 {lhs}
的缩写词。如果找不到,则删除 {lhs}
与 {rhs}
匹配的缩写词。这样做是为了使您甚至可以在扩展后删除缩写词。要避免扩展,请插入 CTRL-V
(键入两次)。<expr>
] [<buffer>
] [lhs] [rhs] 与 ":ab" 相同,但仅适用于命令行模式,并且不会为 {rhs}
重新映射<expr>
] [<buffer>
] [lhs] [rhs] 与 ":ab" 相同,但仅适用于插入模式,并且不会为 {rhs}
重新映射CTRL-V
取决于您如何输入缩写词。这也适用于映射。让我们在这里使用一个示例。<Esc>
字符。当您在 Vim 中键入 ":ab" 命令时,您必须输入以下内容:(这里 ^V 是 CTRL-V
,^[] 是 <Esc>
)<SNR>
替换 "<SID>",后面跟着一个对脚本唯一的数字和一个下划线。示例:map <SID>Add将定义一个映射 "<SNR>23_Add"。
<SID>
的上下文中使用,请使用expand()函数let &includexpr = expand('<SID>') .. 'My_includeexpr()'否则,在脚本上下文之外使用“<SID>”将导致错误。
func s:ScriptNumber() return matchstr(expand('<SID>'), '<SNR>\zs\d\+\ze_') endfunc列出函数和映射时将显示“<SNR>”。这有助于找出它们的定义。
<SNR>
编号是多少。:command Rename ... :command Renumber ... :Rena " Means "Rename" :Renu " Means "Renumber" :Ren " Error - ambiguous :command Paste ...建议在脚本中使用用户定义命令的完整名称。
filter Pyth command:com[mand]
{cmd}
列出以{cmd}
开头的用户定义的命令。<line1>
, <line2>
){attr}
...] {cmd}
{repl}
定义一个用户命令。命令的名称为{cmd}
,其替换文本为{repl}
。命令的属性(见下文)为{attr}
。如果命令已存在,则会报告错误,除非指定了 !,在这种情况下,命令将被重新定义。有一个例外:当再次加载脚本时,之前在该脚本中定义的命令将被静默替换。:let s:error = "None" :command -nargs=1 Error echoerr <args>
:source script1.vim :let s:error = "Wrong!" :Error s:error执行 script2.vim 将导致回显“None”。这不是你想要的结果!调用函数可能是另一种选择。
CTRL-D
时显示文件名 -complete=user 用户名 -complete=var 用户变量 -complete=custom,{func} 自定义完成,通过{func}
定义 -complete=customlist,{func} 自定义完成,通过{func}
定义{func}
”或“customlist,{func}
”完成参数来定义自定义完成方案。{func}
部分应该是一个具有以下签名的函数:function {func}(ArgLead, CmdLine, CursorPos)该函数不必使用所有这些参数。该函数应提供完成候选者作为返回值。
:com -complete=custom,ListUsers -nargs=1 Finger !finger <args> :fun ListUsers(A,L,P) : return system("cut -d: -f1 /etc/passwd") :endfun以下示例完成'path'选项中指定的目录中的文件名
:com -nargs=1 -bang -complete=customlist,EditFileComplete \ EditFile edit<bang> <args> :fun EditFileComplete(A,L,P) : return split(globpath(&path, a:A), "\n") :endfun
{nvim-api}
命令可以通过定义预览处理程序来显示 'inccommand'(即时输入)预览(仅限 Lua,参见 nvim_create_user_command())。function cmdpreview(opts, ns, buf)
-- If invoked as a preview callback, performs 'inccommand' preview by -- highlighting trailing whitespace in the current buffer. local function trim_space_preview(opts, preview_ns, preview_buf) vim.cmd('hi clear Whitespace') local line1 = opts.line1 local line2 = opts.line2 local buf = vim.api.nvim_get_current_buf() local lines = vim.api.nvim_buf_get_lines(buf, line1 - 1, line2, false) local preview_buf_line = 0 for i, line in ipairs(lines) do local start_idx, end_idx = string.find(line, '%s+$') if start_idx then -- Highlight the match vim.api.nvim_buf_add_highlight( buf, preview_ns, 'Substitute', line1 + i - 2, start_idx - 1, end_idx ) -- Add lines and set highlights in the preview buffer -- if inccommand=split if preview_buf then local prefix = string.format('|%d| ', line1 + i - 1) vim.api.nvim_buf_set_lines( preview_buf, preview_buf_line, preview_buf_line, false, { prefix .. line } ) vim.api.nvim_buf_add_highlight( preview_buf, preview_ns, 'Substitute', preview_buf_line, #prefix + start_idx - 1, #prefix + end_idx ) preview_buf_line = preview_buf_line + 1 end end end -- Return the value of the preview type return 2 end -- Trims all trailing whitespace in the current buffer. local function trim_space(opts) local line1 = opts.line1 local line2 = opts.line2 local buf = vim.api.nvim_get_current_buf() local lines = vim.api.nvim_buf_get_lines(buf, line1 - 1, line2, false) local new_lines = {} for i, line in ipairs(lines) do new_lines[i] = string.gsub(line, '%s+$', '') end vim.api.nvim_buf_set_lines(buf, line1 - 1, line2, false, new_lines) end -- Create the user command vim.api.nvim_create_user_command( 'TrimTrailingWhitespace', trim_space, { nargs = '?', range = '%', addr = 'lines', preview = trim_space_preview } )
{repl}
将使用 <...> 符号扫描特殊转义序列。转义序列将替换为从输入的命令行中获取的值,所有其他文本将被原样复制。结果字符串将作为 Ex 命令执行。要避免替换,请在初始 < 的位置使用 <lt>
。因此,要包含“<bang>”,请使用“<lt>bang>”。<line1>
命令范围的起始行。 <line2><line2>
命令范围的结束行。 <range><range>
命令范围中的项目数量:0、1 或 2 <count><count>
提供的任何计数(如 '-range' 和 '-count' 属性中所述)。 <bang><bang>
(参见 '-bang' 属性)如果命令使用 ! 修饰符执行,则展开为 !,否则展开为空。 <mods> <q-mods> :command-modifiers <mods>
命令修饰符(如果已指定)。否则,展开为空。支持的修饰符是 :aboveleft、:belowright、:botright、:browse、:confirm、:hide、:horizontal、:keepalt、:keepjumps、:keepmarks、:keeppatterns、:leftabove、:lockmarks、:noautocmd、:noswapfile、:rightbelow、:sandbox、:silent、:tab、:topleft、:unsilent、:verbose 和 :vertical。请注意,:filter 不受支持。示例command! -nargs=+ -complete=file MyEdit \ for f in expand(<q-args>, 0, 1) | \ exe '<mods> split ' .. f | \ endfor function! SpecialEdit(files, mods) for f in expand(a:files, 0, 1) exe a:mods .. ' split ' .. f endfor endfunction command! -nargs=+ -complete=file Sedit \ call SpecialEdit(<q-args>, <q-mods>)
<reg>
(参见 '-register' 属性)可选的寄存器(如果已指定)。否则,展开为空。<register>
是它的同义词。 <args><args>
命令参数,与提供的完全相同(但如上所述,任何计数或寄存器都可能消耗一些参数,这些参数随后不再是 <args>
的一部分)。 <lt>
单个 '<'(小于)字符。如果您想将这些转义序列中的一个字面副本获取到扩展中,则需要此字符 - 例如,要获取 <bang>
,请使用 <lt>
bang>。<q-args>
),则该值将用引号括起来,使其成为在表达式中使用的有效值。这将参数视为一个值。当没有参数时,<q-args>
是一个空字符串。请参见下面的 q-args-example。 <f-args><f-args>
(“函数参数”)。这将在空格和制表符处拆分命令参数,分别为每个参数加引号,并且 <f-args>
序列将被用引号括起来的逗号分隔的参数列表替换。请参见下面的 Mycmd 示例。如果未给出任何参数,则会删除 <f-args>
。要将空格嵌入 <f-args>
的参数中,请在其前面加上一个反斜杠。<f-args>
会将每一对反斜杠 (\\) 替换为一个反斜杠。反斜杠后跟除空格或反斜杠以外的其他字符将保持不变。另请参见下面的 f-args-example。概述<f-args>
" Delete everything after here to the end :com Ddel +,$d " Rename the current buffer :com -nargs=1 -bang -complete=file Ren f <args>|w<bang> " Replace a range with the contents of a file " (Enter this all as one line) :com -range -nargs=1 -complete=file Replace <line1>-pu_|<line1>,<line2>d|r <args>|<line1>d " Count the number of lines in the range :com! -range -nargs=0 Lines echo <line2> - <line1> + 1 "lines"
<f-args>
的示例):com -nargs=* Mycmd call Myfunc(<f-args>)当执行为
:Mycmd arg1 arg2这将调用
:call Myfunc("arg1","arg2")
:function Allargs(command) : let i = 0 : while i < argc() : if filereadable(argv(i)) : execute "e " .. argv(i) : execute a:command : endif : let i = i + 1 : endwhile :endfunction :command -nargs=+ -complete=command Allargs call Allargs(<q-args>)Allargs 命令将任何 Vim 命令(s)作为参数并将其在参数列表中的所有文件上执行。使用示例(注意使用“e”标志忽略错误和“update”命令写入已修改的缓冲区)
:Allargs %s/foo/bar/ge|update这将调用
:call Allargs("%s/foo/bar/ge|update")