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 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>
游標向左一個 WORD c_<S-Right>
<S-Right><C-Right> c_<C-Right>
游標向右一個 WORD 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 刪除游標前的 word。這取決於 '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
輸入二合字母(請參閱 digraphs)。當 {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_=
'=' 表達式暫存器:系統會提示您輸入表達式(請參閱 expression)(在表達式提示下不起作用;不允許某些操作,例如變更緩衝區或目前視窗,以避免副作用)當結果是 List 時,項目會用作行。它們內部也可以有換行符號。當結果是 Float 時,它會自動轉換為 String。請注意,當您只想移動游標而不插入任何內容時,您必須確保表達式計算結果為空字串。例如
<C-R><C-R>=setcmdpos(2)[-1]<CR>
請參閱關於暫存器的 registers。實作細節:當使用 expression 暫存器並叫用 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' 展開,如同 gf 中一樣 CTRL-W 游標下的 Word CTRL-A 游標下的 WORD;請參閱 WORD CTRL-L 游標下的行
當設定 'incsearch' 時,會使用目前顯示比對結尾的游標位置。使用 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> 以完成。它在映射中最有用。請參閱 expression。請參閱 c_CTRL-R_= 以插入表達式的結果。有用的函式包括 getcmdtype()getcmdline()getcmdpos()。游標位置不會改變,除非游標在行尾,那麼它會保持在行尾。setcmdpos() 可以用來設定游標位置。 sandbox 用於評估表達式,以避免不良的副作用。範例
: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
其中第四行和第五行是一個已摺疊的區塊,最終會列印出第 3 到 7 行。「7」來自範圍中的「4」,它會調整為已摺疊區塊的結尾,也就是 5,然後再加上偏移量 2。
一個減法的例子(不是很常用):
:2,4-1print
在以下文字中:
1 one
2 two
3 three FOLDED
4 four FOLDED
5 five FOLDED
6 six FOLDED
7 seven
8 eight
其中第三到第六行是一個已摺疊的區塊,最終會列印出第 2 到 6 行。「6」來自範圍中的「4」,它會調整為已摺疊區塊的結尾,也就是 6,然後減去 1,之後仍在已摺疊區塊中,因此會使用該區塊的最後一行,也就是 6。
:range-pattern
{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
摺疊與範圍
當啟用摺疊時,行號會四捨五入以包含整個已摺疊的區塊。請參閱 fold-behavior
反向範圍 E493
範圍應該先使用較小的行號。如果不是這種情況,Vim 會詢問您是否應交換行號。
給定反向範圍,是否確定要交換?
這不會在 global 指令 ":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 是一個數字)會被替換為緩衝區 n 的檔案名稱:_#0 :_#n。"#0" 與 "#" 相同。c_#n ## 會被替換為引數列表中的所有名稱 :_## c_## 連接在一起,以空格分隔。名稱中的每個空格前面都有一個反斜線。#<n(其中 n 是一個大於 0 的數字)會被替換為舊的檔案名稱 n。:_#< c_#< 請參閱 :oldfilesv:oldfiles 以取得數字。E809
請注意,這些(除了 "#<n")會提供輸入時的檔案名稱。如果需要絕對路徑(當從不同目錄使用檔案名稱時),您需要加入 ":p"。請參閱 filename-modifiers
"#<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 file" 和 ":so file",它是目前的緩衝區,讀取/來源的檔案不在緩衝區中。 E496 :<amatch> <amatch> <amatch> 當執行自動指令時,會被觸發此自動指令的匹配項取代。 E497 當檔案名稱不用於匹配時,它與 <afile> 不同 (用於 FileType、Syntax 和 SpellFileMissing 事件)。當匹配是使用檔案名稱時,它會展開為完整路徑。 :<sfile> <sfile> <sfile> 當執行 :source 指令時,會被來源檔案的檔案名稱取代。 E498 當執行函數時,會被呼叫堆疊取代,如同 <stack> (這是為了向後相容,建議使用 <stack><script>)。請注意,當 <sfile> 未在腳本內使用時,檔案名稱修飾符無效。 :<stack> <stack> <stack> 會被呼叫堆疊取代,使用 "function {function-name}[{lnum}]" 表示函數行,並使用 "script {file-name}[{lnum}]" 表示腳本行,且項目之間以 ".." 分隔。例如:"function {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/") 變更為 home 目錄的路徑。如果名稱是目錄,則會在結尾新增路徑分隔符。對於不存在且沒有絕對路徑的檔案名稱,結果是無法預測的。在 MS-Windows 上,8.3 檔案名稱會展開為長名稱。:8 將路徑轉換為 8.3 短格式 (目前僅限 MS-Windows)。將作用於現有路徑的盡可能多的路徑。:~ 盡可能將檔案名稱縮減為相對於 home 目錄的路徑。如果檔案名稱不在 home 目錄之下,則不會修改。:. 盡可能將檔案名稱縮減為相對於目前目錄的路徑。如果檔案名稱不在目前目錄之下,則不會修改。為了達到最大程度的簡短,請使用 ":~:."。: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
副檔名移除 :_%< 如果將 "<" 附加到 "%"、"#"、"#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 嘗試展開 "!"。
檔案名稱反斜線
對於使用反斜線作為目錄分隔符 (Windows 檔案系統) 的檔案系統,很難辨識用來跳脫下一個字元的特殊含義的反斜線。一般規則是:如果反斜線後面接著一個正常的檔案名稱字元,則它沒有特殊含義。因此,"\file\foo" 是一個有效的檔案名稱,您不需要輸入兩次反斜線。
例外情況是 '$' 符號。它是檔案名稱中的有效字元。但是,為了避免像 "$home" 這樣的檔案名稱被解譯為環境變數,需要在前面加上反斜線。因此,您需要使用 "/\$home" 表示根目錄中的檔案 "$home"。以下是一些範例
檔案名稱解譯為
$home 展開為環境變數 $home 的值 \$home 目前目錄中的檔案 "$home" /\$home 根目錄中的檔案 "$home" \\$home 檔案 "\\",後面接著展開的 $home
另請參閱 `=

7. 指令行視窗 指令行視窗 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 命令列時;如果啟用了 Vim 語法高亮,這會啟動它 'rightleft' 關閉 'modifiable' 開啟 'buftype' "nofile" 'swapfile' 關閉
允許將緩衝區內容寫入檔案。這是儲存命令列歷史記錄並稍後讀回的簡單方法。
如果 '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 CmdWinEnter [:>] syntax sync minlines=1 maxlines=1
你可以在設定中用 "autocmd! nvim_cmdwin" 停用此設定。預設自動指令

自動指令

使用兩個自動指令事件: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 命令 > 除錯模式命令 除錯模式 / 向前搜尋字串 ? 向後搜尋字串 = "= 的運算式 expr-register @ input() 的字串 - :insert:append 的文字
主要
命令索引
快速參考