視覺
Nvim :help
頁面,使用 tree-sitter-vimdoc 解析器,從 原始碼 產生。
視覺模式是一種彈性且容易的方式,可以選取一段文字進行操作。它是選取文字區塊的唯一方法。
使用視覺模式包含三個部分:1. 使用 "v"、"V" 或 CTRL-V
標記文字的開始位置。游標下的字元將被用作開始位置。2. 移動到文字的結尾位置。從視覺模式開始位置到游標下字元的文字會被高亮顯示。3. 輸入一個操作命令。高亮顯示的字元將會被操作。
高亮顯示的文字通常包含游標下的字元。但是,當
'selection' 選項設定為 "exclusive" 且游標位於視覺區域之後時,游標下的字元將不包含在內。
使用 "v" 時,起始位置之前和結束位置之後的文字不會被高亮顯示。然而,除了 "~" 和 "U" 之外,所有大寫字母和非字母操作符都會對整行進行操作。請參閱下面的操作符列表。
visual-block 使用
CTRL-V
(區塊視覺模式)時,高亮顯示的文字將是起始位置和游標之間的矩形。然而,某些操作符會對整行進行操作(請參閱下面的列表)。change 和 substitute 操作符將刪除高亮顯示的文字,然後在左上方位置開始插入。
v charwise-visual [count]v 依字元開始視覺模式。使用 [count] 選取與上次視覺操作相同數量的字元或行數,但從目前游標位置開始,並乘以 [count]。當先前的視覺操作是在區塊上時,區塊的寬度和高度都會乘以 [count]。當沒有先前的視覺操作時,會選取 [count] 個字元。這就像將游標向右移動 N * [count] 個字元一樣。當
'selection' 不是 "exclusive" 時,會少一個字元。
V linewise-visual [count]V 依行開始視覺模式。使用 [count] 選取與上次視覺操作相同數量的行數,但從目前游標位置開始,並乘以 [count]。當沒有先前的視覺操作時,會選取 [count] 行。
如果在視覺模式中使用
<Esc>
、按一下滑鼠左鍵或使用任何會跳轉到另一個緩衝區的命令,高亮顯示會停止,且不會影響任何文字。當您在字元視覺模式中按下 "v"、在區塊視覺模式中按下 "CTRL-V" 或在行視覺模式中按下 "V" 時也是如此。如果您按下 CTRL-Z,高亮顯示會停止,且編輯器會被暫停或啟動一個新的 shell
CTRL-Z。
正常 視覺 區塊視覺 行視覺 視覺 正常 區塊視覺 行視覺 視覺 區塊視覺 視覺 正常 行視覺 行視覺 視覺 區塊視覺 正常
gv v_gv reselect-Visual gv 以與先前區域相同的區域和相同模式開始視覺模式。在視覺模式中,目前的視覺區域和先前的視覺區域會交換。在視覺模式中使用 "p" 或 "P" 之後,放置的文字將會被選取。
gn v_gn gn 向前搜尋上次使用的搜尋模式,如同使用
n
一樣,並開始視覺模式來選取符合的項目。如果游標位於符合的項目上,則視覺化地選取它。如果有操作符等待執行,則會對符合的項目執行操作。例如,"dgn" 會刪除下一個符合項目的文字。如果視覺模式處於活動狀態,則會延伸選取範圍到下一個符合項目的結尾。
'wrapscan' 適用。
注意:與
n
不同,搜尋方向不取決於先前的搜尋命令。
<LeftMouse>
<LeftMouse>
設定目前游標位置。如果視覺模式處於活動狀態,則會停止。僅當
'mouse' 選項包含 'n' 或 'a' 時才有效。如果位置位於螢幕最後一行向上
'so' 行之內,則文字會向上捲動。如果位置位於螢幕第一行向下
'so' 行之內,則文字會向下捲動。
<RightMouse>
<RightMouse>
如果視覺模式未啟用,則啟動視覺模式。從游標位置到按一下位置的文字會被高亮顯示。如果視覺模式已啟用,則將高亮顯示文字的開始或結束位置(以最接近者為準)移動到按一下位置。僅當
'mouse' 選項包含 'n' 或 'a' 時才有效。
注意:當
'mousemodel' 設定為 "popup" 時,必須使用
<S-LeftMouse>
而不是
<RightMouse>
。
<LeftRelease>
<LeftRelease>
如果與
<LeftMouse>
的位置不同,則其作用類似於
<LeftMouse>
。在舊版本的 xterm 中,除非可以存取執行 xterm 的顯示畫面(透過 DISPLAY 環境變數或 -display 引數),否則您不會看到選取的區域,直到釋放按鈕為止。僅當
'mouse' 選項包含 'n' 或 'a' 時才有效。
如果視覺模式未啟用,且 "v"、"V" 或
CTRL-V
之前有計數,則先前高亮顯示的區域大小會用作開始位置。然後,您可以移動高亮顯示區域的結尾位置並給出一個操作符。會使用舊區域的類型(字元、行或區塊)。
行視覺模式:行數會乘以計數。
區塊視覺模式:行數和列數都會乘以計數。
單行內的正常視覺模式:字元數會乘以計數。
多行的正常視覺模式:行數會乘以計數,在最後一行中,會使用與先前高亮顯示區域最後一行相同的字元數。文字的開始位置是游標位置。如果 "$" 命令被用作延伸高亮顯示文字的最後一個命令之一,則該區域將延伸到最長行的最右邊欄位。
如果您想要高亮顯示與上次完全相同的區域,可以使用 "gv"
gv v_gv。
v_<Esc>
<Esc>
在視覺模式中:停止視覺模式。
v_META v_ALT ALT (
META) 如果該組合鍵沒有對應的映射,則其作用可能如同
<Esc>
。例如,如果
<A-x>
沒有視覺模式的映射,則
<A-x>
的作用如同
<Esc>
x。
v_CTRL-C CTRL-C 在視覺模式中:停止視覺模式。當插入模式暫停時(模式訊息顯示 "-- (insert) VISUAL --"),也會停止。在 MS-Windows 上,您可能需要按下
CTRL-Break
。
v_o o 移動到高亮顯示文字的另一端:目前的游標位置會變成高亮顯示文字的開始位置,而游標會移動到高亮顯示文字的另一端。高亮顯示的區域保持不變。
v_O O 移動到高亮顯示文字的另一端。這類似於 "o",但在區塊視覺模式中,游標會移動到同一行中的另一個角。當角落在螢幕上佔據多個位置(例如
<Tab>
)的字元上時,高亮顯示的文字可能會變更。
v_$ 當 "$" 命令與區塊視覺模式一起使用時,高亮顯示文字的右端將由最長的高亮顯示行決定。當使用不會直接向上或向下移動的移動命令時,此動作會停止。
可以使用許多命令來移動區塊的結尾位置,但您不能使用 Ex 命令、進行變更的命令或放棄檔案的命令。以 "."、"&"、CTRL-^
、"Z"、CTRL-]
、CTRL-T
、CTRL-R
、CTRL-I
和 CTRL-O
(開頭)的命令會發出嗶聲,且視覺模式會繼續。
當切換到同一個緩衝區中的另一個視窗時,會調整該視窗中的游標位置,以便仍然選取相同的視覺區域。這對於在一個視窗中檢視視覺區域的開始位置,在另一個視窗中檢視結束位置特別有用。然後,您可以使用
<RightMouse>
(或當
'mousemodel' 為 "popup" 時使用
<S-LeftMouse>
)來拖曳視覺區域的任一端。
(1):總是整行,請參閱
:visual_example。(2):當不使用
CTRL-V
時為整行。(3):當不使用
CTRL-V
時為整行,使用
CTRL-V
時刪除至行尾。(4):當使用
CTRL-V
時,僅對區塊操作。
請注意,":vmap" 指令可用於專門映射視覺模式中的按鍵。例如,如果您希望 "/" 指令不要擴展視覺區域,而是取得高亮顯示的文字並搜尋該文字
:vmap / y/<C-R>"<CR>
(在 <> 符號
<> 中,輸入時應逐字輸入;您需要從
'cpoptions' 中移除 'B' 標誌。)
如果您想使用 """ 指令給予暫存器名稱,請在輸入運算符號之前執行此操作:"v{移動}xd"。
如果您想給指令一個計數,請在輸入運算符號之前執行此操作:"v{移動}3>"(將行向右移動 3 個縮排)。
{移動} {移動}
是任何移動指令序列。請注意與
{動作}
的差異,後者僅為一個移動指令。
對視覺區域操作的另一種方式是在模式中使用
/\%V 項目。例如,要將視覺區域中的所有 '(' 替換為 '#'
:'<,'>s/\%V(/#/g
請注意,當您在視覺模式中按下 ":" 時,"'<,'>" 將自動出現。
視覺區塊插入
v_b_I使用區塊式選取時,I{字串}<ESC> 會在區塊中每一行的開頭插入
{字串}
,前提是該行延伸到區塊中。因此,短行將保持不變。TAB 會被分割以保留視覺欄位。僅適用於向行添加文字,不適用於刪除。請參閱
v_b_I_example。
視覺區塊附加
v_b_A使用區塊式選取時,A{字串}<ESC> 會在區塊中每一行的結尾附加
{字串}
。當區塊的右側不筆直時,由於行長度不同,會有不同的行為
1. 區塊是使用
<C-v>
$ 建立的。在這種情況下,字串會附加到每一行的結尾。2. 區塊是使用
<C-v>
{移動}
建立的。在這種情況下,字串會附加到每一行區塊的結尾,並插入空白以填滿到區塊的結尾欄位。請參閱
v_b_A_example。
注意:「I」和「A」對於未延伸到所選區塊中的行有不同的行為。這是故意為之,因此您可以按照您想要的方式執行。僅適用於向行添加文字,不適用於刪除。
視覺區塊變更
v_b_c區塊中所有選取的文字都將被相同的文字字串取代。當使用「c」時,選取的文字會被刪除並開始插入模式。然後您可以輸入文字(沒有換行符)。當您按下
<Esc>
時,相同的字串會插入到所有先前選取的行中。
視覺區塊變更
v_b_C類似於使用「c」,但選取範圍會延伸到所有行的行尾。
當重複視覺模式運算符時,該運算符將應用於與上次相同的文字量
行式視覺模式:相同數量的行。
區塊式視覺模式:相同數量的行和欄。
單行內的正常視覺模式:相同數量的字元。
多行的正常視覺模式:相同數量的行,最後一行中的字元數量與上次最後一行中的字元數量相同。文字的開始是游標位置。如果 "$" 指令用作擴展高亮顯示文字的最後一個指令之一,則重複將應用到最長行的最右欄。傳遞給 .
指令的任何計數都不會被使用。
123(hello)321 456(world)654 456(NOT THIS)654
暫存器 "x" 包含指令 yi(VP
,視覺選取前兩行並輸入 @x
會產生
hello world 456(NOT THIS)654
:visual_example 目前,":" 指令僅適用於整行。當您選取行的一部分時,執行類似 ":!date" 的操作將會取代整行。如果您希望僅取代行的一部分,您必須為其建立映射。在未來的版本中,":" 可能會適用於部分行。
以下範例將選取的文字替換為 "date" 的輸出
:vmap _a <Esc>`>a<CR><Esc>`<i<CR><Esc>!!date<CR>kJJ
(在 <> 符號
<> 中,輸入時應逐字輸入;您需要從
'cpoptions' 中移除 'B' 標誌。)
這會執行以下操作:<Esc>
停止視覺模式 > 前往視覺區域的結尾 a<CR><Esc> 在視覺區域之後斷行 < 跳到視覺區域的開頭 i<CR><Esc> 在視覺區域之前斷行 !!date<CR> 通過 date 過濾視覺文字 kJJ 將行合併回去
視覺搜尋 以下是一個映射的範例,使其可以搜尋選取的文字
:vmap X y/<C-R>"<CR>
(在 <> 符號
<> 中,輸入時應逐字輸入;您需要從
'cpoptions' 中移除 'B' 標誌。)
請注意,特殊字元(如 '.' 和 '*')會造成問題。
視覺區塊範例
區塊式範例對於以下文字,我將指示產生區塊的指令和下方的結果。在所有情況下,游標都從測試文字第一行的 'a' 開始。假設以下 modeline 設定:「:ts=8:sw=4:」。
將 :set hls /<TAB> 設定為 <TAB>
是真實的 TAB 會很有幫助。這有助於視覺化操作。
測試文字為
abcdefghijklmnopqrstuvwxyz abc defghijklmnopqrstuvwxyz abcdef ghi jklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
abcdefghijklmnSTRINGopqrstuvwxyz abc STRING defghijklmnopqrstuvwxyz abcdef ghi STRING jklmnopqrstuvwxyz abcdefghijklmnSTRINGopqrstuvwxyz
abcdefghijklmnopqrstuvwxyzSTRING abc defghijklmnopqrstuvwxyzSTRING abcdef ghi jklmnopqrstuvwxyzSTRING abcdefghijklmnopqrstuvwxyzSTRING
abcdefghijklmnopqrstuvwxyz abc defghijklmnopqrstuvwxyz abcdef ghi jklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
abcdefghijklmn opqrstuvwxyz abc defghijklmnopqrstuvwxyz abcdef ghi jklmnopqrstuvwxyz abcdefghijklmn opqrstuvwxyz
abcdefghijklmnXXXXXXuvwxyz abc XXXXXXhijklmnopqrstuvwxyz abcdef ghi XXXXXX jklmnopqrstuvwxyz abcdefghijklmnXXXXXXuvwxyz
選取模式看起來像視覺模式,但接受的指令卻大不相同。這類似於 Microsoft Windows 中的選取模式。當設定
'showmode' 選項時,最後一行會顯示「-- SELECT --」。
進入選取模式
在一般模式下使用 "gh"、"gH" 或 "g_CTRL-H" 指令。
選取模式中的指令
可列印字元、<NL>
和 <CR>
會導致選取範圍被刪除,並且 Vim 會進入插入模式。輸入的字元會被插入。
使用 Shift 鍵按下,不可列印的移動指令會擴展選取範圍。
'keymodel' 必須包含 "startsel"。
不按下 Shift 鍵,不可列印的移動指令會停止選取模式。
'keymodel' 必須包含 "stopsel"。
ESC 會停止選取模式。
CTRL-G
會切換到視覺模式。
CTRL-R
{register}
會選取要用於輸入文字時被刪除的文字的暫存器。
v_CTRL-R除非您指定 "_" (黑洞) 暫存器,否則未命名的暫存器也會被覆寫。
否則,輸入的字元會如同在視覺模式中處理。
當在選取模式中使用運算符,且選取範圍為行模式時,會對選取的行執行操作,但如同字元模式選取。例如,當刪除整行時,稍後可以將其貼到行中間。
當使用
:vmap 或
:vmenu 指令定義映射和選單時,它們在視覺模式和選取模式中都有效。當這些在選取模式中使用時,Vim 會自動切換到視覺模式,以便與視覺模式相同的行為生效。如果您不想要這樣,請使用
:xmap 或
:smap。
一個特殊的邊緣情況
:vnoremap <C-K> <Esc>
這會在視覺模式中結束視覺模式,但在選取模式中則無法運作,因為選取模式會在執行映射的按鍵後還原。您需要使用
:snoremap <C-K> <Esc>
使用者會期望可列印字元替換選取的區域。因此,請避免在選取模式中映射可列印字元。或者在
:map 和
:vmap 之後使用
:sunmap 來移除選取模式中的映射。
在映射或選單完成後,除非選取的區域被刪除、另一個緩衝區成為目前的緩衝區或視窗佈局被更改,否則選取範圍會再次啟用並進入選取模式。
當輸入一個會導致選取範圍被刪除並開始插入模式的字元時,插入模式的映射會應用於此字元。這可能會造成一些混淆,因為這表示插入模式的映射會應用於在選取模式中輸入的字元。語言映射也會應用。
gV v_gV gV 避免在選取模式映射或選單完成後自動重新選取視覺區域。將此放在映射或選單結束之前。至少應該在對選取範圍執行任何操作之後。
gh gh 開始選取模式,字元模式。這類似於 "v",但開始選取模式而不是視覺模式。助記詞:「取得高亮」。
gH gH 開始選取模式,行模式。這類似於 "V",但開始選取模式而不是視覺模式。助記詞:「取得高亮」。
g_CTRL-H g
CTRL-H
開始選取模式,區塊模式。這類似於
CTRL-V
,但開始選取模式而不是視覺模式。助記詞:「取得高亮」。