Vim 刪除和修改文本篇


建立時間: 2024年9月16日 08:27
更新時間: 2024年12月10日 08:54

說明

本篇主要分享刪除和修改文字的命令。

刪除文本

["x]x

刪除 [count] 個遊標之下和之後的字元 [到暫存器 x 裡]。和 dl 相同。


["x]X

刪除 [count] 個遊標之前的字元 [到暫存器 x 裡]。和 dh 相同。


["x]d{motion}

刪除 {motion} 動作跨越的文字 [到暫存器 x 裡]。


["x]dd

刪除 [count] 行 [到暫存器 x 裡]。


["x]D

刪除遊標所在的字元到行尾及其後的 [count]-1 行 [到暫存器 x 裡]。

d$ 同義。


:[range]d[elete] [x]

刪除 [range] 範圍的行 (預設: 目前行) [到暫存器 x 裡]。

範例

:1,3d
刪除1到3行。

:/foo/,/bar/-1d
刪除從搜尋到「foo」到搜尋到「bar」的上一行。

:/foo/+d
刪除搜尋到「foo」的下一行。

:.,$d x
從當前行刪除到最後一行到暫存器 x


:[range]d[elete] [x] {count}

[range] 指定的範圍開始,刪除 {count} 行 (預設: 目前行) [到暫存器 x 裡]。


J

連接 [count] 行,但至少包含兩行。

刪除縮進,插入不多於兩個的空格。

在緩衝區末行此操作會失敗。

[count] 如果過多,會自行縮減至餘下可用的行。


{Visual}J

連接高亮行,但至少包含兩行。刪除縮進,插入不多於兩個的空格。


gJ

連接 [count] 行,但至少包含兩行。不插入或刪除任何空格。


{Visual}gJ

連接高亮行,但至少包含兩行。不插入或刪除任何空格。


[range]j[oin][!] [flags]

連接 [range] 範圍的行。和 J 相同,但如有 [!] 時,連接不會插入或刪除任何空格。

如果 [range] 包括相同的開始和結束行,則該指令不做任何事。

預設行為是連接當前行與下一行。


:[range]j[oin][!] {count} [flags]

連接 [range] 開始的 {count} 行 (預設: 目前行)。和 J 相同,但如有 [!] 時,連接不會插入或刪除任何空格。

範例

:1,10j!
合併1至10行,並保留空格。


刪除並插入

R

進入替換模式: 每個輸入的字元替代一個現有的字元,從遊標所在的位置開始。重複替換輸入的文字 [count] - 1 次。


["x]c{motion}

{motion} 跨過的文字刪除 [到暫存器 x 裡] 並開始插入。


["x]cc

刪除 [count] 行 [到暫存器 x 裡] 並開始插入。


["x]C

從目前遊標位置刪除到行尾,再刪除 [count]-1 行 [到暫存器 x 裡],並開始插入。和 c$ 等價。


["x]s

刪除 [count] 個字元 [到暫存器 x 裡],並開始插入。


["x]S

刪除 [count] 行 [到暫存器 x 裡] 並開始插入。和 cc 等價。


備註

  • 你可以用 <Esc> 退出插入和替換模式。
  • {motion} 可以參考 Vim 移動篇

簡單修改

r{char}

把遊標下的字元換成 {char}


~

切換遊標下字元的大小寫,並把遊標向右移。如果給出 [count],應用在那麼多數目的字元上。


g~{motion}

切換 {motion} 跨越的文字的大小寫。


g~g~
g~~

切換目前行的大小寫。


gU{motion}

使 {motion} 跨越的文字成為大寫。


gUgU
gUU

使得當前行成為大寫。


gu{motion}

使 {motion} 跨越的文字成為小寫。


gugu
guu

使得當前行成為小寫。


複雜修改

!{motion}{filter}

用外部程序 {filter} 過濾 {motion} 跨越的多行。


!!{filter}

用外部程序 {filter} 過濾 [count] 行。


{Visual}!{filter}

用外部程序 {filter} 過濾高亮行。


:{range}![!]{filter} [!][arg]

用外部程序 {filter} 過濾 {range} 指定的多行。

Vim 把可選的驚嘆號替換成最後一次使用的命令,並附加上可選的參數 [arg]


={motion}

equalprg 選項指定的外部程序過濾 {motion} 跨越的多行。如果 equalprg 選項為空 (預設),使用內部的排版機制 C-indentinglisp,除非 indentexpr 非空,此時使用 indent-expression 機制來代替。反之,如果 Vim 編譯時沒有包含內部排版機制,最後手段是使用外部的 indent 程序。


==

={motion} 類似,過濾 [count] 行。


{Visual}=

={motion} 類似,過濾高亮行。


遞增與遞減

CTRL-A

把目前遊標之上或之後的數值或字母加上 [count]


CTRL-X

把目前遊標之上或之後的數值或字母減去 [count]


將文本左移或右移

<{motion}

{motion} 跨越的多行左移 shiftwidth 列。

範例

<%
將跨越對應的括號左移 shiftwidth 列。


<<

[count] 行左移 shiftwidth 列。


{Visual}[count]<

將高亮行左移 [count]shiftwidth 列。


>{motion}

{motion} 跨越的多行右移 shiftwidth 列。

範例

>}
將跨越到段落結尾右移 shiftwidth 列。


>>

[count] 行右移 shiftwidth 列。


{Visual}[count]>

將高亮行右移 [count]shiftwidth 列。


:[range]<

[range] 指定的多行左移 shiftwidth 列。多個 < 左移多個 shiftwidth 列。


:[range]< {count}

左移 [range] 開始的 {count}shiftwidth 列 (預設從當前行 cmdline-ranges)。多個 < 左移多個 shiftwidth 列。


:[range]>

[range] 指定的多行右移 shiftwidth 列。多個 > 右移多個 shiftwidth 列。


:[range]> {count}

右移 [range] 開始的 {count}shiftwidth 列 (預設從當前行 cmdline-ranges)。多個 > 右移多個 shiftwidth 列。


複製並移動文本

["x]y{motion}

抽出 {motion} 跨越的文本 [到暫存器 x]。


["x]yy

抽出 [count] 行 [到暫存器 x]。


["x]Y

抽出 [count] 行 [到暫存器 x] (同 yy)。


:[range]y[ank] [x]

抽出 [range] 所指定的行 [到暫存器 x]。

範例

:1,5 y a
抽出1-5行到暫存器 a。


:[range]y[ank] [x] {count}

[range] 的最後一行開始 (預設: 當前行) 抽出 {count} 行 [到暫存器 x]。

範例

:1,5 y a 3
抽出5-7行到暫存器 a。


["x]p

[從暫存器 x] 放置文字在遊標之後 [count] 次。


["x]P

[從暫存器 x] 放置文字在遊標之前 [count] 次。


["x]gp

如同 p,但遊標停留在新文字之後,類似 pl


["x]gP

如同 P,但遊標停留在新文字之後,類似 Pl


:[line]pu[t] [x]

查看幫助文件: :help :put

[從暫存器 x] 放置文本在行號 [line] (預設為目前行) 之後。

如果未指定暫存器,則取決於 clipboard 選項,大概意思是會指向剪貼簿的暫存器,只是剪貼簿儲存在哪個暫存器則要取決於 clipboard 選項,詳細說明可參考幫助文件。


:[line]pu[t]! [x]

[從暫存器 x] 放置文本在行號 [line] (預設為目前行) 之前。


["x]]p
["x]]<MiddleMouse>

類似 p,但調整目前行的縮排。


["x][P
["x]]P
["x][p
["x][<MiddleMouse>

類似 P,但調整目前行的縮排。


:[range]co[py] {address}

[range] 指定的行複製到 {address} 給出的行之下。

範例

:1,10 co 20
把1至10行複製到第20行之下。

:1,3co4
複製1到3行到第4行之下。


:t

:copy 等價。

範例

%t$
複製整份文件到文件末端。


:[range]m[ove] {address}

[range] 指定的行移到 {address} 給出的行之下。

範例

:1,3m4
將1到3行移動到第4行之下。


備註

  1. 抽出類似於複製,放置類似於貼上。

文本排版

:[range]ce[nter] [width]

[range] 指定範圍的行和 [width] 限定的列 (預設為 textwidth,如其為 0,則取 80) 範圍內的文本居中對齊。


:[range]ri[ght] [width]

[range] 指定範圍的行和 [width] 限定的列 (預設為 textwidth,如其為 0,則取 80) 範圍內的文本靠右對齊。


:[range]le[ft] [indent]

[range] 指定範圍的行的文本靠左對齊。其縮排的距離可由 [indent] 設定 (預設為 0)。


gq{motion}

{motion} 動作跨越的行進行排版。


gqgq
gqq

排版目前行。如帶計數排版對應多行。


觀看次數: 311
changedeletevim刪除修改
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!