Usr_20

Nvim 的 :help 頁面,由 產生,來源是 原始碼,使用 tree-sitter-vimdoc 解析器。


VIM 使用者手冊 - 作者:Bram Moolenaar
快速輸入命令列指令
Vim 有一些通用功能,可以更容易輸入指令。冒號指令可以縮寫、編輯和重複。幾乎所有項目都提供自動完成功能。
20.1 命令列編輯 20.2 命令列縮寫 20.3 命令列自動完成 20.4 命令列歷史記錄 20.5 命令列視窗
下一章:usr_21.txt 離開再回來 上一章:usr_12.txt 聰明的小技巧 目錄:usr_toc.txt

命令列編輯

當您使用冒號 (:) 指令或使用 / 或 ? 搜尋字串時,Vim 會將游標放在螢幕底部。您可以在那裡輸入指令或搜尋模式。這稱為命令列。即使它用於輸入搜尋指令也是如此。
編輯您輸入的指令最明顯的方法是按下 <BS> 鍵。這會刪除游標前的字元。要刪除更早輸入的其他字元,請先使用游標鍵移動游標。例如,您輸入了以下內容
:s/col/pig/
在您按下 <Enter> 之前,您注意到 "col" 應該是 "cow"。要更正此錯誤,請輸入 <Left> 五次。現在游標位於 "col" 之後。輸入 <BS> 和 "w" 進行更正
:s/cow/pig/
現在您可以直接按下 <Enter>。您不必在執行指令之前將游標移動到行尾。
在命令列中移動最常用的按鍵
<Left> 向左移動一個字元 <Right> 向右移動一個字元 <S-Left><C-Left> 向左移動一個單字 <S-Right><C-Right> 向右移動一個單字 CTRL-B<Home> 移動到命令列的開頭 CTRL-E<End> 移動到命令列的結尾
注意: <S-Left> (按下 Shift 鍵的游標向左鍵)和 <C-Left> (按下 Control 鍵的游標向左鍵)並非在所有鍵盤上都能運作。其他 Shift 和 Control 組合也是如此。
您也可以使用滑鼠移動游標。

刪除

如前所述,<BS> 會刪除游標前的字元。要刪除整個單字,請使用 CTRL-W
/the fine pig
CTRL-W
/the fine
CTRL-U 會移除所有文字,因此您可以重新開始。

覆寫

<Insert> 鍵會在插入字元和取代現有字元之間切換。從這段文字開始
/the fine pig
使用 <S-Left> 兩次(或 <Left> 八次,如果 <S-Left> 無法運作)將游標移動到 "fine" 的開頭。現在按下 <Insert> 切換到覆寫模式,然後輸入 "great"
/the greatpig
糟糕,我們遺失了空格。現在,不要使用 <BS>,因為它會刪除 "t"(這與取代模式不同)。相反,按下 <Insert> 從覆寫模式切換到插入模式,然後輸入空格
/the great pig

取消

您想執行 : 或 / 指令,但改變了主意。要擺脫您已經輸入的內容,而不執行它,請按下 CTRL-C<Esc>
注意: <Esc> 是通用的「退出」鍵。不幸的是,在古老的 Vi 中,在命令列中按下 <Esc> 會執行指令!由於這可能被視為一個錯誤,Vim 使用 <Esc> 來取消指令。但是透過 'cpoptions' 選項,可以使其與 Vi 相容。而且當使用映射(可能是為 Vi 編寫的)時,<Esc> 也會以 Vi 相容的方式運作。因此,使用 CTRL-C 是一種始終有效的方法。
如果您位於命令列的開頭,按下 <BS> 將會取消指令。就像刪除行首的 ":" 或 "/" 一樣。

20.2 命令列縮寫

有些 ":" 指令真的很長。我們已經提到 ":substitute" 可以縮寫為 ":s"。這是一種通用機制,所有 ":" 指令都可以縮寫。
指令可以縮短到多短?有 26 個字母,還有更多指令。例如,":set" 也以 ":s" 開頭,但 ":s" 並不會啟動 ":set" 指令。相反,":set" 可以縮寫為 ":se"。當較短形式的指令可以用於兩個指令時,它只代表其中一個。哪個指令沒有邏輯,您必須學習它們。在說明文件中,會提到可行的最短形式。例如
:s[ubstitute]
這表示 ":substitute" 的最短形式是 ":s"。後面的字元是可選的。因此,":su" 和 ":sub" 也有效。
在使用者手冊中,我們將使用指令的全名,或仍然可讀的簡短版本。例如,":function" 可以縮寫為 ":fu"。但是,由於大多數人不了解它代表什麼,我們將使用 ":fun"。(Vim 沒有 ":funny" 指令,否則 ":fun" 也會令人困惑。)
建議您在 Vim 指令碼中寫入完整的指令名稱。這使得在您稍後進行變更時更容易讀回。除了某些常用的指令,例如 ":w"(":write")和 ":r"(":read")。一個特別令人困惑的是 ":end",它可以代表 ":endif"、":endwhile" 或 ":endfunction"。因此,請務必使用全名。

選項名稱縮寫

在使用者手冊中,會使用選項名稱的長版本。許多選項也有短名稱。與 ":" 指令不同,只有一個可行的短名稱。例如,'autoindent' 的短名稱是 'ai'。因此,這兩個指令會執行相同的操作
:set autoindent
:set ai
您可以在此處找到長短名稱的完整列表:option-list

20.3 命令列自動完成

這是 Vim 的其中一個功能,它本身就是從 Vi 切換到 Vim 的原因。一旦您使用過此功能,您就無法沒有它。
假設您有一個目錄包含這些檔案
info.txt intro.txt bodyofthepaper.txt
要編輯最後一個檔案,您可以使用指令
:edit bodyofthepaper.txt
很容易輸入錯誤。一種更快速的方法是
:edit b<Tab>
這將產生相同的指令。發生了什麼事?<Tab> 鍵會自動完成游標前的單字。在此情況下為 "b"。Vim 會在目錄中尋找,而且只會找到一個以 "b" 開頭的檔案。這一定是您要尋找的檔案,因此 Vim 會為您完成檔案名稱。
現在輸入
:edit i<Tab>
Vim 會發出嗶聲,並提供您
:edit info.txt
嗶聲表示 Vim 找到了多個相符項目。然後它會使用它找到的第一個相符項目(依字母順序排列)。如果您再次按下 <Tab>,您將會看到
:edit intro.txt
因此,如果第一個 <Tab> 沒有給您您要尋找的檔案,請再次按下。如果有更多相符項目,您將會一次看到它們全部,一次一個。如果您在最後一個相符項目上按下 <Tab>,您將會回到您第一次輸入的內容
:edit i
然後它會重新開始。因此,Vim 會循環瀏覽相符項目的清單。使用 CTRL-P 以相反的方向瀏覽清單
<------------------- <Tab> -------------------------+ | <Tab> --> <Tab> --> :edit i :edit info.txt :edit intro.txt <-- CTRL-P <-- CTRL-P | +---------------------- CTRL-P ------------------------>

內容

當您輸入 ":set i" 而不是 ":edit i" 並按下 <Tab> 時,您會得到
:set icon
嘿,為什麼您沒有得到 ":set info.txt"?這是因為 Vim 具有內容敏感的自動完成功能。Vim 將尋找的單字種類取決於它之前的指令。Vim 知道您不能在 ":set" 指令之後使用檔案名稱,但可以使用選項名稱。同樣,如果您重複輸入 <Tab>,Vim 將會循環瀏覽所有相符項目。相符項目相當多,最好先輸入更多字元
:set isk<Tab>
會給出
:set iskeyword
現在輸入 "=" 並按下 <Tab>
:set iskeyword=@,48-57,_,192-255
這裡發生的情況是,Vim 會插入選項的舊值。現在您可以編輯它。使用 <Tab> 自動完成的內容是 Vim 在該位置預期的內容。只要嘗試一下,看看它是如何運作的。在某些情況下,您不會得到您想要的結果。這可能是因為 Vim 不知道您想要什麼,或者因為該情況未實作自動完成功能。在這種情況下,您會插入一個 <Tab>(顯示為 ^I)。

列出相符項目

當有很多相符項目時,您會想看到概觀。按一下 CTRL-D 來完成此操作。例如,在
:set is
之後按下 CTRL-D 會產生
:set is
incsearch  isfname    isident    iskeyword  isprint
:set is
Vim 會列出相符項目,然後會返回您輸入的文字。您現在可以檢查清單中您要尋找的項目。如果它不在那裡,您可以使用 <BS> 來更正單字。如果有很多相符項目,請在按下 <Tab> 完成剩餘部分之前輸入更多字元。如果您仔細觀察,您會注意到 "incsearch" 不是以 "is" 開頭。在這種情況下,"is" 代表 "incsearch" 的短名稱。(許多選項都有短名稱和長名稱。)Vim 很聰明,知道您可能想將選項的短名稱展開為長名稱。

還有更多

CTRL-L 指令會將單字自動完成為最長的不模糊字串。如果您輸入 ":edit i",而且有檔案 "info.txt" 和 "info_backup.txt",您將會得到 ":edit info"。
可以使用 'wildmode' 選項來變更自動完成的運作方式。可以使用 'wildmenu' 選項來取得類似功能表的相符項目清單。使用 'suffixes' 選項來指定較不重要的檔案,並使其顯示在檔案清單的結尾。 'wildignore' 選項會指定完全不列出的檔案。
有關此項目的更多資訊:cmdline-completion

20.4 命令列歷史記錄

在第 3 章中,我們簡要提及了歷史記錄。基本知識是,您可以使用 <Up> 鍵來回溯較舊的命令列。然後 <Down> 會帶您回到較新的指令。
實際上,有五個歷史記錄。我們將在此處提及的是 ":" 指令和 "/" 和 "?" 搜尋指令的歷史記錄。 "/" 和 "?" 指令共用相同的歷史記錄,因為它們都是搜尋指令。其他三個歷史記錄用於表達式、偵錯模式指令和 input() 函式的輸入行。cmdline-history
假設您已執行 ":set" 指令,輸入了十個以上的冒號指令,然後想再次重複該 ":set" 指令。您可以按下 ":",然後按十次 <Up>。有一種更快速的方法
:se<Up>
Vim 現在會回到上一個以 "se" 開頭的指令。您很有機會這就是您要尋找的 ":set" 指令。至少您應該不必經常按下 <Up> (除非您所做的都是 ":set" 指令)。
<Up> 鍵會使用目前輸入的文字,並與歷史紀錄中的行進行比較。只會使用符合的行。如果您找不到您要尋找的行,請使用 <Down> 回到您輸入的內容並進行更正。或使用 CTRL-U 從頭開始。
要查看歷史紀錄中的所有行
:history
那是「:」指令的歷史紀錄。搜尋歷史紀錄會透過這個指令顯示
:history /
CTRL-P 的作用類似於 <Up>,但它不考慮您已經輸入的內容。CTRL-N 的作用也類似於 <Down>CTRL-P 代表「上一個」(previous),CTRL-N 代表「下一個」(next)。

20.5 命令列視窗

在命令列中輸入文字與在插入模式中輸入文字的方式不同。它不允許使用許多指令來更改文字。對於大多數指令來說,這沒問題,但有時您必須輸入複雜的指令。這就是命令列視窗的用處。
使用這個指令開啟命令列視窗
q:
Vim 現在會在底部開啟一個(小的)視窗。它包含命令列歷史紀錄,以及最後一個空白行
+-------------------------------------+
|other window                              |
|~                                      |
|file.txt=============================|
|:e c                                      |
|:e config.h.in                              |
|:set path=.,/usr/include,,              |
|:set iskeyword=@,48-57,_,192-255     |
|:set is                              |
|:q                                      |
|:                                      |
|command-line=========================|
|                                      |
+-------------------------------------+
您現在處於普通模式。您可以使用「hjkl」鍵來移動。例如,使用「5k」向上移動到「:e config.h.in」這一行。輸入「$h」移動到「in」中的「i」,然後輸入「cwout」。現在您已將該行變更為
:e config.h.out
現在按下 <Enter>,這個指令將會執行。命令列視窗將會關閉。<Enter> 指令將會執行游標下的那一行。無論 Vim 處於插入模式還是普通模式,這都無關緊要。在命令列視窗中所做的變更會遺失。它們不會導致歷史紀錄被變更。除了您執行的指令會像所有執行過的指令一樣,被添加到歷史紀錄的末尾。
當您想要概覽歷史紀錄、尋找類似的指令、稍微變更它並執行它時,命令列視窗非常有用。搜尋指令可以用來尋找內容。在先前的範例中,可以使用「?config」搜尋指令來尋找包含「config」的先前指令。這有點奇怪,因為您正在使用命令列來搜尋命令列視窗中的內容。在輸入該搜尋指令時,您無法開啟另一個命令列視窗,因為只能有一個。
下一章:usr_21.txt 離開再回來
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
指令索引
快速參考