Usr_26

Nvim 的 :help 頁面,使用 tree-sitter-vimdoc 解析器,從 來源 產生 而來。


VIM 使用者手冊 - 作者:Bram Moolenaar
重複
編輯工作很少是無結構的。一個變更通常需要執行多次。本章將說明一些有用的重複變更方式。
26.1 使用可視模式重複 26.2 加法與減法 26.3 在多個檔案中進行變更 26.4 從 Shell 腳本中使用 Vim
下一章:usr_27.txt 搜尋指令與模式 前一章:usr_25.txt 編輯格式化文字 目錄:usr_toc.txt

使用可視模式重複

可視模式非常方便在任何連續的行中進行變更。您可以查看高亮顯示的文字,因此您可以檢查是否變更了正確的行。但是選取需要一些輸入。 "gv" 命令會再次選取相同的區域。這允許您對相同的文字執行另一個操作。假設您有一些行要將 "2001" 變更為 "2002",並將 "2000" 變更為 "2001"
2001 年的財務結果較佳
比 2000 年好。收入增加了 50%,
儘管 2001 年的降雨量比 2000 年多。
2000 2001
收入 45,403 66,234
首先將 "2001" 變更為 "2002"。在可視模式中選取這些行,並使用
:s/2001/2002/g
現在使用 "gv" 重新選取相同的文字。游標在哪裡並不重要。然後使用 ":s/2000/2001/g" 進行第二次變更。顯然,您可以重複這些變更多次。

26.2 加法與減法

在重複將一個數字變更為另一個數字時,您通常會有一個固定的偏移量。在上面的範例中,每個年份都加了一。可以使用 CTRL-A 命令,而不用為每個出現的年份輸入替代命令。使用與上面相同的文字,搜尋一個年份
/19[0-9][0-9]\|20[0-9][0-9]
現在按下 CTRL-A。年份將會增加一
2002 年的財務結果較佳
比 2000 年好。收入增加了 50%,
儘管 2001 年的降雨量比 2000 年多。
2000 2001
收入 45,403 66,234
使用 "n" 尋找下一個年份,然後按下 "." 來重複 CTRL-A ("." 輸入速度會快一點)。為所有出現的年份重複 "n" 和 "."。
將數字增加超過一時,可以在 CTRL-A 前面加上數字。假設您有這個清單
1. 項目四
2. 項目五
3. 項目六
將游標移到 "1." 並輸入
3 CTRL-A
"1." 將會變更為 "4."。同樣地,您可以使用 "." 在其他數字上重複此操作。
CTRL-X 命令以類似的方式執行減法。
CTRL-ACTRL-X 的行為取決於 'nrformats' 的值。例如,如果您使用
:set nrformats+=octal
在 "007" 上按下 CTRL-A 會增加到 "010",因為 "007" 將被識別為八進制數字。

26.3 在多個檔案中進行變更

假設您有一個名為 "x_cnt" 的變數,並且想要將其變更為 "x_counter"。此變數在您的多個 C 檔案中使用。您需要在所有檔案中變更它。以下是您的做法。將所有相關檔案放入引數清單中
:args *.c
這會尋找所有 C 檔案並編輯第一個檔案。現在您可以在所有這些檔案上執行替代命令
:argdo %s/\<x_cnt\>/x_counter/ge | update
":argdo" 命令會採用一個引數,該引數是另一個命令。該命令將在引數清單中的所有檔案上執行。接下來的 "%s" 替代命令適用於所有行。它會使用 "\<x_cnt\>" 尋找單字 "x_cnt"。"\"<" 和 "\>" 用於僅比對整個單字,而不是 "px_cnt" 或 "x_cnt2"。替代命令的旗標包括 "g" 以取代同一行中 "x_cnt" 的所有出現位置。"e" 旗標用於避免當檔案中未出現 "x_cnt" 時出現錯誤訊息。否則,如果沒有找到 "x_cnt",":argdo" 將在第一個檔案上中止。"|" 分隔兩個命令。以下的 "update" 命令僅在檔案變更時寫入檔案。如果沒有將 "x_cnt" 變更為 "x_counter",則不會發生任何事情。
還有 ":windo" 命令,它會在所有視窗中執行其引數。而且 ":bufdo" 會在其所有緩衝區上執行其引數。請小心使用此命令,因為您可能在緩衝區清單中擁有的檔案比您想像的還要多。使用 ":buffers" 命令 (或 ":ls") 檢查此項。

26.4 從 Shell 腳本中使用 Vim

假設您有很多檔案需要將字串 "-person-" 變更為 "Jones",然後列印它。您要怎麼做?一種方法是輸入大量文字。另一種方法是編寫 shell 腳本來完成這項工作。當使用一般模式命令時,Vim 編輯器作為螢幕導向編輯器表現出色。但是,對於批次處理,一般模式命令不會產生清晰、附註的命令檔案;因此在這裡您將改用 Ex 模式。此模式為您提供了一個很好的命令列介面,可以輕鬆地放入批次檔案中。(「Ex 命令」只是命令列 (:) 命令的另一個名稱。)您需要的 Ex 模式命令如下
%s/-person-/Jones/g
write tempfile
quit
將這些命令放入 "change.vim" 檔案中。現在要以批次模式執行編輯器,請使用此 shell 腳本
for file in *.txt; do
  vim -e -s $file < change.vim
  lpr -r tempfile
done
for-done 迴圈是一個 shell 結構,用於重複兩行之間的操作,而 $file 變數會每次設定為不同的檔案名稱。第二行在檔案 $file 上以 Ex 模式 (-e 引數) 執行 Vim 編輯器,並從 "change.vim" 檔案讀取命令。-s 引數會告知 Vim 在靜音模式下運作。換句話說,不要持續輸出 :prompt 或任何其他提示。 "lpr -r tempfile" 命令會列印產生的 "tempfile" 並刪除它 (這就是 -r 引數的作用)。

從標準輸入讀取

Vim 可以讀取標準輸入上的文字。由於通常的做法是讀取那裡的命令,您必須告知 Vim 改為讀取文字。這是透過傳遞 "-" 引數來取代檔案來完成的。範例
ls | vim -
這允許您編輯 "ls" 命令的輸出,而無需先將文字儲存到檔案中。如果您使用標準輸入來讀取文字,則可以使用 "-S" 引數來讀取腳本
producer | vim -S change.vim -

一般模式腳本

如果您真的想在腳本中使用一般模式命令,您可以這樣使用
vim -s script file.txt ...
注意:"-s" 在不使用 "-e" 時有不同的含義。這裡的意思是以一般模式命令為來源的 "script"。當與 "-e" 一起使用時,表示要保持靜音,並且不使用下一個引數作為檔案名稱。
"script" 中的命令會像您輸入的一樣執行。別忘了換行符號會被解讀為按下 <Enter>。在一般模式中,這會將游標移到下一行。若要建立腳本,您可以編輯腳本檔案並輸入命令。您需要想像結果會是什麼,這可能有點困難。另一種方法是在您手動執行命令時錄製命令。以下是您的做法
vim -w script file.txt ...
所有輸入的按鍵都會寫入 "script"。如果您犯了一個小錯誤,您可以繼續,並記得稍後編輯腳本。"-w" 引數會附加到現有的腳本。當您想要一點一點地錄製腳本時,這很有用。如果您想要從頭開始並重新開始,請使用 "-W" 引數。它會覆寫任何現有檔案。
下一章:usr_27.txt 搜尋指令與模式
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
命令索引
快速參考