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 移除 map 命令適用的模式中 {lhs}
的對應。該對應可能在其他適用的模式中仍然定義。當 {lhs}
符合對應的 {rhs}
時也有效。這用於縮寫應用時。注意:尾隨空格會包含在 {lhs}
中。請參閱 map-trailing-white。<buffer>
參數來移除緩衝區區域對應 :map-<buffer>。警告:這也會移除 預設對應。{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。
<nowait>
引數。然後會在符合對應時使用該對應,Vim 不會等待輸入更多字元。但是,如果已輸入字元,則會使用這些字元。請注意,當 <nowait>
對應完全符合,且在任何部分符合之前找到時,此方式會運作。這會在以下情況下運作:map <silent> ,h /Header<CR>使用此對應時不會回顯搜尋字串。不過,仍會顯示執行命令的訊息。若要也關閉這些訊息,請在執行命令中加入 ":silent"
:map <silent> ,h :exe ":silent normal /Header\r"<CR>請注意,命令的效果也可能會被靜音,例如,當對應為命令列完成選擇另一個項目時,不會顯示它。仍會顯示提示,例如,用於 inputdialog()。可以為縮寫使用 "<silent>",但會導致命令列的重繪失敗。
{rhs}
中的字元。這可用於避免腳本外部的對應干擾(例如,當在 mswin.vim 中重新對應 CTRL-V
時),但會使用腳本中定義的其他對應。注意:":map <script>
" 和 ":noremap <script>
" 會執行相同的動作。 "<script>" 會覆寫命令名稱。最好使用 ":noremap <script>
",因為這樣更清楚表示已(大部分)停用重新對應。:map <unique> ,w /[#&!]<CR>定義本機對應時,也會檢查是否存在相等的全域對應。以下是將失敗的範例
:map ,w /[#&!]<CR> :map <buffer> <unique> ,w /[.,;]<CR>如果您想要對應一個按鍵,然後讓它執行原本對應的動作,請查看 maparg()。
{rhs}
。範例:inoremap <expr> . <SID>InsertDot()會插入 s:InsertDot() 函數的結果。它可以檢查游標之前的文字,並在符合某些條件時啟動 omni 完成。最好使用腳本本機函數,以避免污染全域命名空間。在 RHS 中使用
<SID>
,以便可以找到定義對應的腳本。{lhs}
。您不應該插入或變更 v:char。func StoreColumn() let g:column = col('.') return 'x' endfunc nnoremap <expr> x StoreColumn() nmap ! f!x您會注意到 g:column 的值是執行 "f!" 之前的值,因為會在執行 "f!" 之前評估 "x"。這可以透過在運算式對應的字元之前插入
<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
會傳回空字串,因此不會插入任何內容。<Cmd>
偽按鍵會開始一個「命令對應」,它會直接執行命令而不改變模式。當你在對應的 {rhs}
中可能會使用 ":...<CR>" 時,你可以改用 "<Cmd>...<CR>"。範例:noremap x <Cmd>echo mode(1)<CR>
:<C-U>
,或在 Insert 模式中使用 <C-O>:
更靈活,因為命令會直接在目前模式中執行,而不是總是跳到 Normal 模式。Visual 模式會被保留,因此不需要使用 gv 的技巧。命令可以直接在 Command-line 模式中調用(否則需要使用計時器 hacks)。在 Insert 模式中途使用 <Cmd>
的範例:nnoremap <F3> aText <Cmd>echo mode(1)<CR> Added<Esc>與
<expr>
對應不同,<Cmd>
命令沒有特殊限制:它的執行方式如同調用了(無限制的)自動命令或處理了非同步事件。<silent>
。{rhs}
不受縮寫或其他對應影響,即使對應是遞迴的。line('v')
和 col('v')
來取得 Visual 區域的一端,游標在另一端。<Cmd>
命令必須終止,也就是說,它們在對應定義的 {rhs}
中必須跟著 <CR>
。命令列模式永遠不會進入。要在 {rhs}
中使用字面意義的 <CR>
,請使用 <lt>。:omap { w使得 "y{" 的運作方式如同 "yw",而 "d{" 的運作方式如同 "dw"。
onoremap <silent> F :<C-U>normal! 0f(hviw<CR>
CTRL-U
(<C-U>
)用於移除 Vim 可能插入的範圍。Normal 模式命令會找到第一個 '(' 字元並選取它之前的第一個單字。這通常是函數名稱。:map xx something-difficult :ounmap xx同樣地,適用於 Visual 和 Operator-pending 模式,或 Normal 和 Operator-pending 模式的對應。
CTRL-^
命令停用對應 i_CTRL-^ c_CTRL-^。這些命令會更改 'iminsert' 選項的值。當開始輸入一般命令列(不是搜尋模式)時,對應會被停用,直到輸入 CTRL-^
為止。上次使用的狀態會分別針對 Insert 模式和搜尋模式記住。當輸入字元作為 "f" 或 "t" 等命令的參數時,也會使用 Insert 模式的狀態。語言對應永遠不會應用於已對應的字元。它們僅用於輸入的字元。這假設在輸入對應時已經完成了語言對應。相對地,語言對應會在錄製巨集時應用,而不是在應用它們時應用。<Space>
Normal、Visual、Select 和 Operator-pending n Normal v Visual 和 Select s Select x Visual o Operator-pending ! Insert 和 Command-line i Insert l ":lmap" 對於 Insert、Command-line 和 Lang-Arg 的對應 c Command-line t Terminal-Job{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
後不輸入任何內容 (你必須輸入兩次 CTRL-V
) 來建立空的 {rhs}
。不幸的是,你無法在 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') shift 後 ('R') 這在 'keymap' 檔案中指定 (多位元組) 字元很有用。忽略大小寫差異。{rhs}
中包含 '|'。有三種方法<Bar>
always :map _l :!ls <Bar>
more^M \| 'b' is not in '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>
等。以及 shift 後的功能鍵 <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>
。{lhs}
包含在 {rhs}
中,則會產生遞迴映射。當輸入 {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 會將 x 替換為 y,然後將 y 替換為 x,依此類推。當這種情況發生 'maxmapdepth' 次(預設為 1000)時,Vim 會給出錯誤訊息「recursive mapping」(遞迴映射)。
<A-k>
形式。請注意,<A-k>
和 <A-K>
是不同的,後者會使用大寫字母。實際上,<A-K>
和 <A-S-K>
是相同的。您可以使用 "M" 來代替 "A"。如果您有實際的 Meta 修飾鍵,請參閱 :map-meta-keys。{key}
,則 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}
可能包含空格。關於可選的 <expr>
引數,請參閱 :map-<expr>。關於可選的 <buffer>
引數,請參閱 :map-<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>
,後跟一個對於腳本而言是唯一的數字和一個底線。例如: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>
(「函式參數」)。這會在空格和 Tab 字元處分割命令參數,個別為每個參數加上引號,並且 <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 命令作為參數,並在參數列表中的所有檔案上執行它。使用範例(請注意使用 "e" 旗標來忽略錯誤,以及使用 "update" 命令來寫入修改後的緩衝區)
:Allargs %s/foo/bar/ge|update這將會調用
:call Allargs("%s/foo/bar/ge|update")