Usr_03
Nvim 的 :help
頁面,是使用 tree-sitter-vimdoc 解析器,從 原始碼 產生 而來。
VIM 使用者手冊 - 作者:Bram Moolenaar
移動
在您可以插入或刪除文字之前,游標必須移動到正確的位置。Vim 有大量的命令來定位游標。本章將向您展示如何使用最重要的命令。您可以在
Q_lr 下方找到這些命令的清單。
單字移動
要將游標向前移動一個單字,請使用 "w" 命令。與大多數 Vim 命令一樣,您可以使用數字前綴來移動多個單字。例如,"3w" 移動三個單字。下圖顯示了它是如何運作的(從標記為 "x" 的位置開始)
這是一行示例文字
x-->-->->-----------------> w w w 3w
請注意,如果 "w" 已經在單字的開頭,則會移動到下一個單字的開頭。"b" 命令向後移動到前一個單字的開頭
這是一行示例文字
<----<--<-<---------<--x b b b 2b b
還有 "e" 命令移動到下一個單字的結尾,而 "ge" 則移動到前一個單字的結尾
這是一行示例文字
<----<----x---->------------> 2ge ge e 2e
如果您在一行的最後一個單字上,"w" 命令會將您帶到下一行的第一個單字。因此,您可以使用它來在段落中移動,比使用 "l" 快得多。"b" 在另一個方向執行相同的操作。
單字在非單字字元處結束,例如 "."、"-" 或 ")"。要更改 Vim 認為是單字的內容,請參閱
'iskeyword' 選項。如果您直接在說明中嘗試此操作,則需要重設
'iskeyword' 才能使範例生效
:set iskeyword&
也可以按空白分隔的 WORD 移動。這不是正常意義上的單字,這就是為什麼使用大寫的原因。按 WORD 移動的命令也是大寫,如下圖所示
ge b w e <- <- ---> --->
這是-一行,帶有特殊/分隔的/單字(以及更多)。
<----- <----- --------------------> -----> gE B W E
透過這種小寫和大寫命令的組合,您可以快速地在段落中向前和向後移動。
"$" 命令將游標移動到行的結尾。如果您的鍵盤有 <End>
鍵,它將執行相同的操作。
"^" 命令移動到該行的第一個非空白字元。"0" 命令(零)移動到該行的第一個字元,而 <Home>
鍵執行相同的操作。在圖片中("." 表示空格)
^ <-----------x
.....這是一行示例文字
<----------------x x--------------> 0 $
("....." 在此表示空格)
像大多數移動命令一樣,"$" 命令採用計數。但是多次移動到行的結尾沒有意義。因此,它會導致編輯器移動到另一行的結尾。例如,"1$" 將您移動到第一行的結尾(您所在的行),"2$" 移動到下一行的結尾,依此類推。"0" 命令不接受計數參數,因為 "0" 會是計數的一部分。出乎意料的是,使用帶有 "^" 的計數沒有任何效果。
最有用的移動命令之一是單字元搜尋命令。"fx" 命令在行中向前搜尋單個字元 x。提示:"f" 代表 "Find"。例如,您位於以下行的開頭。假設您想前往 human 的 h。只需執行命令 "fh",游標將定位在 h 上
人非聖賢,孰能無過。但要真正搞砸,您需要一台電腦。
---------->---------------> fh fy
這也表明 "fy" 命令移動到單字 really 的結尾。您可以指定計數;因此,您可以使用 "3fl" 前往 "foul" 的 "l"
人非聖賢,孰能無過。但要真正搞砸,您需要一台電腦。
---------------------> 3fl
"F" 命令向左搜尋
人非聖賢,孰能無過。但要真正搞砸,您需要一台電腦。
<--------------------- Fh
"tx" 命令的工作方式與 "fx" 命令類似,只是它會在搜尋的字元之前停止一個字元。提示:"t" 代表 "To"。此命令的反向版本是 "Tx"。
人非聖賢,孰能無過。但要真正搞砸,您需要一台電腦。
<------------ -------------> Th tn
可以使用 ";" 重複這四個命令。"," 在另一個方向重複。游標永遠不會移動到另一行。即使句子繼續。
有時您會開始搜尋,卻意識到您輸入了錯誤的命令。例如,您輸入 "f" 向後搜尋,卻意識到您真正想輸入的是 "F"。要中止搜尋,請按 <Esc>
。因此,"f<Esc>" 是一個中止的向前搜尋,不會執行任何操作。注意: <Esc>
取消大多數操作,而不僅僅是搜尋。
在編寫程式時,您經常會遇到巢狀 () 結構。然後 "%" 命令非常方便:它移動到比對的括號。如果游標位於 "(" 上,它將移動到比對的 ")"。如果它位於 ")" 上,它將移動到比對的 "("。
%
<----->
if (a == (b * c) / d)
<---------------->
%
當游標不在有用的字元上時,"%" 將向前搜尋以尋找一個。因此,如果游標位於前一個範例的行首,"%" 將向前搜尋並找到第一個 "("。然後它會移動到它的比對
if (a == (b * c) / d)
---+---------------->
%
如果您是 C 或 C++ 程式設計師,您會熟悉以下錯誤訊息
prog.c:33: j 未宣告(在此函式中第一次使用)
這告訴您您可能想要修正第 33 行的內容。那麼您如何找到第 33 行呢?一種方法是執行 "9999k" 移動到檔案的頂部,然後執行 "32j" 向下移動三十二行。這不是一個好方法,但它有效。一個更好的方法是使用 "G" 命令。使用計數,此命令會將您定位在給定的行號上。例如,"33G" 會將您放在第 33 行上。(若要更好地瀏覽編譯器的錯誤清單,請參閱
usr_30.txt,以取得有關 :make 命令的資訊。)如果沒有參數,"G" 會將您定位在檔案的結尾。若要快速前往檔案的開頭,請使用 "gg"。"1G" 會執行相同的操作,但多一點輸入。
| 檔案的第一行 ^ | 文字 文字 文字 文字 | | 文字 文字 文字 文字 | gg 7G | 文字 文字 文字 文字 | | 文字 文字 文字 文字 | 文字 文字 文字 文字 V 文字 文字 文字 文字 | 文字 文字 文字 文字 | G 文字 文字 文字 文字 | 檔案的最後一行 V
移動到行的另一種方法是使用帶有計數的 "%" 命令。例如,"50%" 會將您移動到檔案的中間,而 "90%" 會移動到接近結尾的位置。
前面的內容假設您想要移動到檔案中的某一行,無論目前是否可見。如果您想要移動到您可以看到的其中一行呢?下圖顯示了您可以使用的三個命令
+---------------------------+ H --> | 文字 示例文本 | | 示例文本 | | 文字 示例文本 | | 示例文本 | M --> | 文字 示例文本 | | 示例文本 | | 文字 示例文本 | | 示例文本 | L --> | 文字 示例文本 | +---------------------------+
提示:"H" 代表 Home(首頁),"M" 代表 Middle(中間),"L" 代表 Last(最後)。或者,"H" 代表 High(高),"M" 代表 Middle(中間),"L" 代表 Low(低)。
要查看您在檔案中的位置,有三種方法
1. 使用
CTRL-G
命令。您會收到類似這樣的訊息(假設
'ruler' 選項已關閉)
"usr_03.txt" 第 233 行,共 650 行 --35%-- 第 45-52 欄
這會顯示您正在編輯的檔案名稱、游標所在的行號、總行數、檔案進度的百分比以及游標的欄。有時您會看到一個分割的欄號。例如,"第 2-9 欄"。這表示游標位於第二個字元上,但由於第一個字元是 Tab,佔用了八個空格的欄位,因此螢幕欄位為 9。
2. 設定
'number' 選項。這將在每一行的前面顯示行號
:set number
由於
'number' 是一個布林選項,因此在其名稱前加上 "no" 具有將其關閉的效果。布林選項只有這兩個值,它不是開啟就是關閉。Vim 有許多選項。除了布林選項之外,還有具有數值和字串選項的選項。您將在它們被使用的地方看到範例。
3. 設定
「ruler」 選項。這會在 Vim 視窗的右下角顯示游標位置。
:set ruler
使用
「ruler」 選項的好處是它不佔用太多空間,因此有更多空間可以顯示您的文字。
CTRL-U
命令會向下捲動半個螢幕的文字。您可以想像透過一個觀景窗看著文字,然後將這個觀景窗向上移動半個視窗高度。因此,視窗會在文字上向上移動,也就是在檔案中往回移動。如果您有點難以記住哪個方向是向上,請別擔心。大多數使用者都有相同的問題。CTRL-D
命令會在檔案中將觀景窗向下移動半個螢幕,因此會將文字向上捲動半個螢幕。
+----------------+ | some text | | some text | | some text | +---------------+ | some text | | some text | CTRL-U
--> | | | | | 123456 | | 123456 | +----------------+ | 7890 | | | +----------------+ | example | CTRL-D
--> | 7890 | +---------------+ | | | example | | example | | example | | example | +----------------+
若要一次捲動一行,請使用 CTRL-E
(向上捲動) 和 CTRL-Y
(向下捲動)。可以把 CTRL-E
想成給您額外的一行。(如果您使用與 MS-Windows 相容的按鍵對應,CTRL-Y
將會重做變更,而不是捲動。)
若要向前捲動一個完整的螢幕(除了兩行),請使用 CTRL-F
。若要向後捲動,請使用 CTRL-B
。這些應該很容易記住:F 代表 Forwards (向前),B 代表 Backwards (向後)。
常見的問題是,在使用 "j" 向下移動許多行之後,您的游標會位於螢幕底部。您會希望看到游標所在行的上下文。這可以使用 "zz" 命令完成。
+------------------+ +------------------+ | earlier text | | earlier text | | earlier text | | earlier text | | earlier text | | earlier text | | earlier text | zz --> | line with cursor | | earlier text | | later text | | earlier text | | later text | | line with cursor | | later text | +------------------+ +------------------+
"zt" 命令會將游標行放在頂部,"zb" 則放在底部。還有一些其他的捲動命令,請參閱
Q_sc。若要始終在游標周圍保留幾行的上下文,請使用
「scrolloff」 選項。
若要搜尋字串,請使用 "/字串" 命令。例如,若要尋找 "include" 這個字,請使用以下命令
/include
您會注意到,當您輸入 "/" 時,游標會跳到 Vim 視窗的最後一行,就像輸入冒號命令一樣。這就是您輸入文字的地方。您可以按下退格鍵 (backarrow 或
<BS>
) 進行更正。必要時,請使用
<Left>
和
<Right>
游標鍵。按下
<Enter>
會執行命令。
注意: 字元 .*[]^%/\?~$ 具有特殊含義。如果您想在搜尋中使用它們,您必須在它們前面加上 \ 。請參閱下文。
若要尋找相同字串的下一個出現位置,請使用 "n" 命令。使用此命令尋找游標後的第一个 #include
/#include
然後輸入 "n" 幾次。您將會移動到文字中的每個 #include。如果您知道您要尋找哪個比對項,您也可以使用計數。因此,"3n" 會尋找第三個比對項。您也可以將計數與 "/" 搭配使用: "4/the" 會移動到 "the" 的第四個比對項。
"?" 命令的作用類似於 "/",但會向後搜尋。
?word
"N" 命令會以相反方向重複上次的搜尋。因此,在 "/" 命令之後使用 "N" 會向後搜尋,在 "?" 之後使用 "N" 會向前搜尋。
忽略大小寫
通常,您必須完全按照您要尋找的內容輸入。如果您不在意單字中的大寫或小寫,請設定
「ignorecase」 選項
:set ignorecase
如果您現在搜尋 "word",它也會比對 "Word" 和 "WORD"。若要再次比對大小寫
:set noignorecase
歷程紀錄
假設您執行了三次搜尋
/one
/two
/three
現在讓我們透過輸入一個簡單的 "/" 而不按下
<Enter>
來開始搜尋。如果您按下
<Up>
(游標鍵),Vim 會將 "/three" 放在命令列上。此時按下
<Enter>
會搜尋 three。如果您沒有按下
<Enter>
,而是按下
<Up>
,Vim 會將提示符號變更為 "/two"。再次按下
<Up>
會將您移動到 "/one"。您也可以使用
<Down>
游標鍵以另一個方向移動搜尋命令的歷程紀錄。
如果您知道先前使用過的模式以什麼開頭,而且您想再次使用它,請在按下 <Up>
之前輸入該字元。使用先前的範例,您可以輸入 "/o<Up>",Vim 會將 "/one" 放在命令列上。
以 ":" 開頭的命令也有歷程紀錄。這可讓您回想先前的命令並再次執行它。這兩個歷程紀錄是分開的。
搜尋文字中的單字
假設您在文字中看到 "TheLongFunctionName" 這個字,而且您想要尋找它的下一個出現位置。您可以輸入 "/TheLongFunctionName",但這樣要輸入很多字。而且當您犯錯時,Vim 就不會找到它。還有一個更簡單的方法:將游標放在該字上,然後使用 "*" 命令。Vim 會抓取游標下的字,並將其用作搜尋字串。"#" 命令的作用相同,但方向相反。您可以添加一個計數:"3*" 會搜尋游標下的字第三次出現的位置。
搜尋完整單字
如果您輸入 "/the",它也會比對 "there"。若要只尋找以 "the" 結尾的字詞,請使用
/the\>
"\>" 項目是一個特殊標記,只會在單字的結尾比對。同樣地,"\<" 只會在單字的開頭比對。因此,若要只搜尋 "the" 這個字
/\<the\>
這不會比對 "there" 或 "soothe"。請注意,"*" 和 "#" 命令會使用這些單字開頭和單字結尾標記來只尋找完整單字 (您可以使用 "g*" 和 "g#" 來比對部分單字)。
醒目提示比對項
在編輯程式時,您會看到一個名為 "nr" 的變數。您想要檢查它在哪裡使用。您可以將游標移動到 "nr",然後使用 "*" 命令,並按下 "n" 來瀏覽所有比對項。
Vim 會醒目提示所有比對項。這是一種很好的方法來查看變數在哪裡使用,而不需要輸入命令。若要關閉此功能
:set nohlsearch
如果要在下次搜尋命令中使用它,您需要再次開啟它
:set hlsearch
如果您只想移除醒目提示,請使用此命令
:nohlsearch
這不會重設選項。相反地,它會停用醒目提示。一旦您執行搜尋命令,就會再次使用醒目提示。對於 "n" 和 "N" 命令也是如此。
調整搜尋
有一些選項會變更搜尋的方式。這些是基本的選項
:set nowrapscan
這會在檔案結尾停止搜尋。或者,當您向後搜尋時,它會在檔案開頭停止搜尋。
「wrapscan」 選項預設為開啟,因此搜尋會在檔案結尾繞回開頭。
:set noincsearch
這會停用在您仍在輸入搜尋內容時顯示比對項。
插曲
如果您喜歡前面提到的其中一個選項,而且每次使用 Vim 時都要設定它,您可以將該命令放在您的 Vim 啟動檔案中。例如,使用以下命令編輯檔案
:edit ~/.config/nvim/init.vim
然後在其中加入一行,其中包含設定該選項的命令,就像您在 Vim 中輸入的一樣。範例
Go:set hlsearch<Esc>
"G" 會移動到檔案結尾。"o" 會開始一個新行,您可以在其中輸入 ":set" 命令。您可以使用
<Esc>
結束插入模式。然後寫入並關閉檔案
ZZ
如果您現在再次啟動 Vim,
「hlsearch」 選項將會已設定。
Vim 編輯器使用正規表示式來指定要搜尋的內容。正規表示式是一種非常強大且精簡的方式來指定搜尋模式。不幸的是,這種強大功能是有代價的,因為正規表示式的指定有點棘手。在本節中,我們只會提到一些基本選項。有關搜尋模式和命令的更多資訊,請參閱第 27 章
usr_27.txt。您可以在這裡找到完整的說明:
pattern。
行的開頭和結尾
^ 字元會比對行的開頭。在英文-美國鍵盤上,您可以在 6 的上方找到它。模式 "include" 會比對行中任何位置的字詞 include。但是模式 "^include" 只會在 include 字詞位於行首時比對。$ 字元會比對行的結尾。因此,"was$" 只會在 was 字詞位於行尾時比對。
讓我們在以下範例行中,以 "x" 標示 "/the" 比對的位置
the solder holding one of the chips melted and the
xxx xxx xxx
使用 "/the$" 我們會找到此比對項
the solder holding one of the chips melted and the
xxx
使用 "/^the" 我們會找到這一個
the solder holding one of the chips melted and the
xxx
您可以嘗試使用 "/^the$" 進行搜尋;它只會比對完全由 "the" 組成的單行。這裡的空白字元很重要,因此如果一行在該字詞後包含空格 (例如 "the "),該模式就不會比對。
比對任何單一字元
. (點) 字元會比對任何現有的字元。例如,模式 "c.m" 會比對一個字串,其第一個字元為 c,第二個字元為任何字元,第三個字元為 m。範例
We use a computer that became the cummin winter.
xxx xxx xxx
比對特殊字元
如果您真的想比對點,您必須在它前面加上反斜線來避免其特殊含義。如果您搜尋 "ter.",您會找到這些比對項
We use a computer that became the cummin winter.
xxxx xxxx
搜尋 "ter\." 只會找到第二個比對項。
當您使用 "G" 命令跳到某個位置時,Vim 會記住此跳躍之前的原始位置。這個位置稱為標記。若要回到您之前的位置,請使用以下命令
``
這是一個反引號或單引號字元。如果您第二次使用相同的命令,您會再次跳回去。這是因為 "`" 命令本身就是一個跳躍,而且會記住此跳躍之前的原始位置。
一般來說,每次您執行一個可以將游標移動到超出同一行範圍的命令時,這稱為跳躍。這包括搜尋命令 "/" 和 "n" (比對項有多遠都沒關係)。但不包括使用 "fx" 和 "tx" 的字元搜尋,或是 "w" 和 "e" 的字詞移動。此外,"j" 和 "k" 不會被視為跳躍,即使您使用計數讓它們將游標移動很遠也是如此。
"``" 命令會在兩個點之間來回跳躍。
CTRL-O
命令會跳到較舊的位置 (提示:O 代表 Older (較舊))。
CTRL-I
則會跳回較新的位置 (提示:對於許多常見的鍵盤配置,I 就在 O 的旁邊)。考慮以下命令序列
33G
/^The
CTRL-O
您首先跳到第 33 行,然後搜尋以 "The" 開頭的行。然後使用
CTRL-O
,您會跳回第 33 行。再一個
CTRL-O
會將您帶回到您開始的位置。如果您現在使用
CTRL-I
,您會再次跳到第 33 行。再使用一個
CTRL-I
,則會跳到 "The" 的比對項。
| example text ^ | 33G | example text | CTRL-O
| CTRL-I
| example text | | V line 33 text ^ V | example text | | /^The | example text | CTRL-O
| CTRL-I
V There you are | V example text
注意: CTRL-I
與 <Tab>
相同。
":jumps" 命令會列出您跳轉過的位置。您最後使用過的跳轉位置會以 ">" 標記。
Vim 允許您在文字中放置自己的標記。 "ma" 命令會將游標所在的位置標記為標記 a。您可以在文字中放置 26 個標記(a 到 z)。您無法看到它們,它們只是 Vim 記住的位置。要前往某個標記,請使用 {標記} 命令,其中 {標記} 是標記字母。因此,要移動到 a 標記,請使用
`a
命令 "'標記" (單引號,或稱撇號)會將您移動到包含該標記的行的開頭。這與 "`標記" 命令不同,後者也會將您移動到標記的欄位。
當處理檔案中兩個相關部分時,標記非常有用。假設您在檔案開頭附近有一些需要查看的文字,同時在檔案結尾附近的一些文字上工作。移動到開頭的文字並將 s (start) 標記放在那裡
ms
然後移動到您要處理的文字,並將 e (end) 標記放在那裡
me
現在您可以四處移動,當您想查看檔案開頭時,您可以使用此命令跳到那裡
's
然後您可以使用 '' 跳回您之前的位置,或使用 'e 跳到您在結尾處處理的文字。使用 s 作為開始和 e 作為結束並沒有什麼特別之處,它們只是容易記住而已。
您可以使用此命令來取得標記列表
:marks
您會注意到一些特殊的標記。這些包括
' 跳轉前游標的位置 " 最後編輯檔案時游標的位置 [ 最後一次變更的開始 ] 最後一次變更的結束