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=