視覺

Nvim :help 頁面,使用 tree-sitter-vimdoc 解析器,從 原始碼 產生


視覺模式是一種彈性且容易的方式,可以選取一段文字進行操作。它是選取文字區塊的唯一方法。
這在使用者手冊的 04.4 節中介紹。

1. 使用視覺模式 visual-use

使用視覺模式包含三個部分:1. 使用 "v"、"V" 或 CTRL-V 標記文字的開始位置。游標下的字元將被用作開始位置。2. 移動到文字的結尾位置。從視覺模式開始位置到游標下字元的文字會被高亮顯示。3. 輸入一個操作命令。高亮顯示的字元將會被操作。
hl-Visual 群組決定視覺選取範圍的高亮顯示方式。'virtualedit' 選項可以用來允許將游標定位到沒有實際字元的位置。
高亮顯示的文字通常包含游標下的字元。但是,當 'selection' 選項設定為 "exclusive" 且游標位於視覺區域之後時,游標下的字元將不包含在內。
使用 "v" 時,起始位置之前和結束位置之後的文字不會被高亮顯示。然而,除了 "~" 和 "U" 之外,所有大寫字母和非字母操作符都會對整行進行操作。請參閱下面的操作符列表。
visual-block
使用 CTRL-V(區塊視覺模式)時,高亮顯示的文字將是起始位置和游標之間的矩形。然而,某些操作符會對整行進行操作(請參閱下面的列表)。change 和 substitute 操作符將刪除高亮顯示的文字,然後在左上方位置開始插入。

2. 開始和停止視覺模式 visual-start

v charwise-visual [count]v 依字元開始視覺模式。使用 [count] 選取與上次視覺操作相同數量的字元或行數,但從目前游標位置開始,並乘以 [count]。當先前的視覺操作是在區塊上時,區塊的寬度和高度都會乘以 [count]。當沒有先前的視覺操作時,會選取 [count] 個字元。這就像將游標向右移動 N * [count] 個字元一樣。當 'selection' 不是 "exclusive" 時,會少一個字元。
V linewise-visual [count]V 依行開始視覺模式。使用 [count] 選取與上次視覺操作相同數量的行數,但從目前游標位置開始,並乘以 [count]。當沒有先前的視覺操作時,會選取 [count] 行。
CTRL-V blockwise-visual [count]CTRL-V 依區塊開始視覺模式。
如果在視覺模式中使用 <Esc>、按一下滑鼠左鍵或使用任何會跳轉到另一個緩衝區的命令,高亮顯示會停止,且不會影響任何文字。當您在字元視覺模式中按下 "v"、在區塊視覺模式中按下 "CTRL-V" 或在行視覺模式中按下 "V" 時也是如此。如果您按下 CTRL-Z,高亮顯示會停止,且編輯器會被暫停或啟動一個新的 shell CTRL-Z
輸入後的新的模式:v_v v_CTRL-V v_V
舊的模式 "v" "CTRL-V" "V"
正常 視覺 區塊視覺 行視覺 視覺 正常 區塊視覺 行視覺 視覺 區塊視覺 視覺 正常 行視覺 行視覺 視覺 區塊視覺 正常
gv v_gv reselect-Visual gv 以與先前區域相同的區域和相同模式開始視覺模式。在視覺模式中,目前的視覺區域和先前的視覺區域會交換。在視覺模式中使用 "p" 或 "P" 之後,放置的文字將會被選取。
gn v_gn gn 向前搜尋上次使用的搜尋模式,如同使用 n 一樣,並開始視覺模式來選取符合的項目。如果游標位於符合的項目上,則視覺化地選取它。如果有操作符等待執行,則會對符合的項目執行操作。例如,"dgn" 會刪除下一個符合項目的文字。如果視覺模式處於活動狀態,則會延伸選取範圍到下一個符合項目的結尾。'wrapscan' 適用。注意:n 不同,搜尋方向不取決於先前的搜尋命令。
gN v_gN gN 類似於 gn,但向後搜尋,如同使用 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

3. 變更視覺區域 visual-change

v_o
o 移動到高亮顯示文字的另一端:目前的游標位置會變成高亮顯示文字的開始位置,而游標會移動到高亮顯示文字的另一端。高亮顯示的區域保持不變。
v_O
O 移動到高亮顯示文字的另一端。這類似於 "o",但在區塊視覺模式中,游標會移動到同一行中的另一個角。當角落在螢幕上佔據多個位置(例如 <Tab>)的字元上時,高亮顯示的文字可能會變更。
v_$
當 "$" 命令與區塊視覺模式一起使用時,高亮顯示文字的右端將由最長的高亮顯示行決定。當使用不會直接向上或向下移動的移動命令時,此動作會停止。
可以使用許多命令來移動區塊的結尾位置,但您不能使用 Ex 命令、進行變更的命令或放棄檔案的命令。以 "."、"&"、CTRL-^、"Z"、CTRL-]CTRL-TCTRL-RCTRL-ICTRL-O (開頭)的命令會發出嗶聲,且視覺模式會繼續。
當切換到同一個緩衝區中的另一個視窗時,會調整該視窗中的游標位置,以便仍然選取相同的視覺區域。這對於在一個視窗中檢視視覺區域的開始位置,在另一個視窗中檢視結束位置特別有用。然後,您可以使用 <RightMouse>(或當 'mousemodel' 為 "popup" 時使用 <S-LeftMouse>)來拖曳視覺區域的任一端。

4. 對視覺區域進行操作 visual-operators

可以使用的操作符為:~ 切換大小寫 v_~ d 刪除 v_d c 變更 (4) v_c y 複製 v_y > 右移 (4) v_> < 左移 (4) v_< ! 透過外部命令篩選 (1) v_! = 透過 'equalprg' 選項命令篩選 (1) v_= gq 將行格式化為 'textwidth' 長度 (1) v_gq
可使用的物件有:aw 一個單字(含空格)v_aw、iw 單字內部 v_iw、aW 一個單詞(含空格)v_aW、iW 單詞內部 v_iW、as 一個句子(含空格)v_as、is 句子內部 v_is、ap 一個段落(含空格)v_ap、ip 段落內部 v_ip、ab 一個 () 區塊(含括號)v_ab、ib () 區塊內部 v_ib、aB 一個 {} 區塊(含大括號)v_aB、iB {} 區塊內部 v_iB、at 一個 <tag> </tag> 區塊(含標籤)v_at、it <tag> </tag> 區塊內部 v_it、a< 一個 <> 區塊(含 <>)v_a<、i< <> 區塊內部 v_i<、a[ 一個 [] 區塊(含 [])v_a[、i[ [] 區塊內部 v_i[、a" 一個雙引號字串(含引號)v_aquote、i" 雙引號字串內部 v_iquote、a' 一個單引號字串(含引號)v_a'、i' 單引號字串內部 v_i'、a` 一個反引號字串(含反引號)v_a`、i` 反引號字串內部 v_i`
此外,可以使用以下指令:: 為高亮顯示的行啟動 Ex 指令 (1) v_:、r 變更 (4) v_r、s 變更 v_s、C 變更 (2)(4) v_C、S 變更 (2) v_S、R 變更 (2) v_R、x 刪除 v_x、D 刪除 (3) v_D、X 刪除 (2) v_X、Y 複製 (2) v_Y、p 貼上 v_p、P 貼上,但不覆蓋暫存器 v_P、J 合併 (1) v_J、U 轉換為大寫 v_U、u 轉換為小寫 v_u、^] 尋找標籤 v_CTRL-]、I 區塊插入 v_b_I、A 區塊附加 v_b_A
(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
請注意,當您在視覺模式中按下 ":" 時,"'<,'>" 將自動出現。

5. 區塊式運算符 區塊式運算符

提醒:使用 'virtualedit' 以便能夠選取在行尾之後或標籤中間開始或結束的區塊。
視覺區塊插入 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」,但選取範圍會延伸到所有行的行尾。
v_b_<
視覺區塊移位 v_b_>
區塊會依 'shiftwidth' 移位。區塊的右側無關緊要。區塊的左側決定了從哪一點開始套用右移位,並且填補會根據 'ts''et' 以最佳方式包含 TAB。區塊的左側決定了向左移位到哪一點。請參閱 v_b_>_example。請參閱 v_b_<_example
視覺區塊取代 v_b_r
高亮顯示區域中的每個螢幕字元都會被相同的字元取代,即 TAB 會被分割,並且虛擬空白會被取代,從而保持螢幕佈局。請參閱 v_b_r_example

6. 重複 視覺重複

當重複視覺模式運算符時,該運算符將應用於與上次相同的文字量
行式視覺模式:相同數量的行。
區塊式視覺模式:相同數量的行和欄。
單行內的正常視覺模式:相同數量的字元。
多行的正常視覺模式:相同數量的行,最後一行中的字元數量與上次最後一行中的字元數量相同。文字的開始是游標位置。如果 "$" 指令用作擴展高亮顯示文字的最後一個指令之一,則重複將應用到最長行的最右欄。傳遞給 . 指令的任何計數都不會被使用。
視覺模式 預設映射 "@" 和 "Q" 會在選取範圍為行式時,為所有選取的行重複暫存器。有關詳細資訊,請參閱 v_@-defaultv_Q-default。例如,給定文字
123(hello)321 456(world)654 456(NOT THIS)654
暫存器 "x" 包含指令 yi(VP,視覺選取前兩行並輸入 @x 會產生
hello world 456(NOT THIS)654

7. 範例 視覺範例

: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
1. fo<C-v>3jISTRING<ESC> v_b_I_example
abcdefghijklmnSTRINGopqrstuvwxyz abc STRING defghijklmnopqrstuvwxyz abcdef ghi STRING jklmnopqrstuvwxyz abcdefghijklmnSTRINGopqrstuvwxyz
2. fo<C-v>3j$ASTRING<ESC> v_b_A_example
abcdefghijklmnopqrstuvwxyzSTRING abc defghijklmnopqrstuvwxyzSTRING abcdef ghi jklmnopqrstuvwxyzSTRING abcdefghijklmnopqrstuvwxyzSTRING
3. fo<C-v>3j3l<.. v_b_<_example
abcdefghijklmnopqrstuvwxyz abc defghijklmnopqrstuvwxyz abcdef ghi jklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
4. fo<C-v>3j>.. v_b_>_example
abcdefghijklmn opqrstuvwxyz abc defghijklmnopqrstuvwxyz abcdef ghi jklmnopqrstuvwxyz abcdefghijklmn opqrstuvwxyz
5. fo<C-v>5l3jrX v_b_r_example
abcdefghijklmnXXXXXXuvwxyz abc XXXXXXhijklmnopqrstuvwxyz abcdef ghi XXXXXX jklmnopqrstuvwxyz abcdefghijklmnXXXXXXuvwxyz

8. 選取模式 選取 選取模式

選取模式看起來像視覺模式,但接受的指令卻大不相同。這類似於 Microsoft Windows 中的選取模式。當設定 'showmode' 選項時,最後一行會顯示「-- SELECT --」。
進入選取模式
使用滑鼠選取區域,並且 'selectmode' 包含「mouse」。'mouse' 也必須包含目前模式的標誌。
使用不可列印的移動指令,並按下 Shift 鍵,且'selectmode' 包含 "key"。例如:<S-Left><S-End>'keymodel' 也必須包含 "startsel"。
使用 "v"、"V" 或 CTRL-V 指令,且 'selectmode' 包含 "cmd"。
在一般模式下使用 "gh"、"gH" 或 "g_CTRL-H" 指令。
從視覺模式,按下 CTRL-Gv_CTRL-G
選取模式中的指令
可列印字元、<NL><CR> 會導致選取範圍被刪除,並且 Vim 會進入插入模式。輸入的字元會被插入。
使用 Shift 鍵按下,不可列印的移動指令會擴展選取範圍。'keymodel' 必須包含 "startsel"。
不按下 Shift 鍵,不可列印的移動指令會停止選取模式。'keymodel' 必須包含 "stopsel"。
ESC 會停止選取模式。
CTRL-O 會切換到視覺模式,持續執行一個指令。v_CTRL-O
CTRL-G 會切換到視覺模式。
CTRL-R {register} 會選取要用於輸入文字時被刪除的文字的暫存器。v_CTRL-R
除非您指定 "_" (黑洞) 暫存器,否則未命名的暫存器也會被覆寫。
否則,輸入的字元會如同在視覺模式中處理。
當在選取模式中使用運算符,且選取範圍為行模式時,會對選取的行執行操作,但如同字元模式選取。例如,當刪除整行時,稍後可以將其貼到行中間。
選取模式中的映射和選單。Select-mode-mapping
當使用 :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,但開始選取模式而不是視覺模式。助記詞:「取得高亮」。
主頁
指令索引
快速參考