Usr_07

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


VIM 使用者手冊 - Bram Moolenaar 著
編輯多個檔案
無論您有多少檔案,您都可以在不離開 Vim 的情況下編輯它們。定義要處理的檔案列表,並在它們之間跳轉。從一個檔案複製文字並將其放入另一個檔案中。
07.1 編輯另一個檔案 07.2 檔案列表 07.3 在檔案之間跳轉 07.4 備份檔案 07.5 在檔案之間複製文字 07.6 檢視檔案 07.7 更改檔案名稱
下一章:usr_08.txt 分割視窗 上一章:usr_06.txt 使用語法高亮 目录:usr_toc.txt

編輯另一個檔案

到目前為止,您必須為每個要編輯的檔案啟動 Vim。有一個更簡單的方法。要開始編輯另一個檔案,請使用此命令
:edit foo.txt
您可以使用任何檔案名稱代替 "foo.txt"。Vim 將關閉目前檔案並開啟新檔案。但是,如果目前檔案有未儲存的變更,Vim 會顯示錯誤訊息並且不會開啟新檔案
E37: 自上次變更以來沒有寫入 (使用 ! 來覆寫)
注意: Vim 在每個錯誤訊息的開頭都會加上錯誤 ID。如果您不了解訊息或造成訊息的原因,請在說明系統中查找此 ID。在這種情況下
:help E37
此時,您有許多替代方案。您可以使用此命令寫入檔案
:write
或者您可以強制 Vim 捨棄您的變更並編輯新檔案,使用強制 (!) 字元
:edit! foo.txt
如果您想編輯另一個檔案,但還不想寫入目前檔案中的變更,您可以將其隱藏
:hide edit foo.txt
帶有變更的文字仍然存在,但您看不到它。這在 22.4 節:緩衝區列表中有更詳細的說明。

07.2 檔案列表

您可以啟動 Vim 來編輯一系列檔案。例如
vim one.c two.c three.c
此命令會啟動 Vim 並告知您將編輯三個檔案。Vim 只會顯示第一個檔案。當您在這個檔案中完成操作後,要編輯下一個檔案,請使用此命令
:next
如果目前檔案中有未儲存的變更,您將會收到錯誤訊息,並且 ":next" 將無法運作。這與上一節中提到的 ":edit" 的問題相同。要放棄變更
:next!
但大多數時候您都希望儲存變更並繼續處理下一個檔案。有一個特殊的命令可以做到這一點
:wnext
這與使用兩個單獨的命令相同
:write
:next
我在哪裡?
要查看您正在編輯參數列表中的哪個檔案,請查看視窗標題。它應該顯示類似「(2 of 3)」的內容。這表示您正在編輯三個檔案中的第二個檔案。如果您想查看檔案列表,請使用此命令
:args
這是 "arguments" 的縮寫。輸出可能如下所示
one.c [two.c] three.c
這些是您啟動 Vim 時使用的檔案。您目前正在編輯的檔案 "two.c" 位於方括號中。

移動到其他參數

要返回上一個檔案
:previous
這與 ":next" 命令類似,只是它往反方向移動。同樣,當您想要先寫入檔案時,有一個快捷命令
:wprevious
要移動到列表中的最後一個檔案
:last
然後再移動回第一個
:first
但是沒有 ":wlast" 或 ":wfirst" 命令!
您可以對 ":next" 和 ":previous" 使用計數。要向前跳過兩個檔案
:2next

自動寫入

在檔案之間移動並進行變更時,您必須記得使用 ":write"。否則您會收到錯誤訊息。如果您確定您總是想要寫入修改過的檔案,您可以告訴 Vim 自動寫入它們
:set autowrite
當您正在編輯可能不想寫入的檔案時,請再次關閉它
:set noautowrite

編輯另一個檔案列表

您可以重新定義檔案列表,而無需退出 Vim 並重新啟動它。使用此命令編輯其他三個檔案
:args five.c six.c seven.h
或者使用萬用字元,就像在 shell 中使用的一樣
:args *.txt
Vim 會將您帶到列表中的第一個檔案。同樣,如果目前檔案有變更,您可以先寫入檔案,或者使用 ":args!" (加上 !) 來放棄變更。
您是否編輯了最後一個檔案? arglist-quit
當您使用檔案列表時,Vim 會假設您想編輯所有這些檔案。為了防止您太早退出,當您尚未編輯列表中的最後一個檔案時,您會收到此錯誤
E173: 還有 46 個檔案要編輯
如果您真的想退出,請再次執行即可。然後它就會運作 (但如果您在中間執行了其他命令則不會)。

07.3 在檔案之間跳轉

要在兩個檔案之間快速跳轉,請按下 CTRL-^ (在英文-美國鍵盤上,^ 位於 6 鍵上方)。範例
:args one.c two.c three.c
您現在位於 one.c 中。
:next
現在您位於 two.c 中。現在使用 CTRL-^ 返回 one.c。另一個 CTRL-^,您又回到 two.c。再一個 CTRL-^,您又回到 one.c。如果您現在執行
:next
您位於 three.c 中。請注意,CTRL-^ 命令不會改變您在檔案列表中位置的想法。只有像 ":next" 和 ":previous" 這樣的命令才會這樣做。
您先前編輯的檔案稱為「替代」檔案。當您剛啟動 Vim 時,CTRL-^ 將無法運作,因為沒有先前的檔案。

預先定義的標記

跳到另一個檔案後,您可以使用兩個非常有用的預先定義的標記
`"
這會將您帶到離開檔案時游標所在的位置。另一個被記住的標記是您進行上次變更的位置
`.
假設您正在編輯檔案「one.txt」。在檔案的中途,您使用 "x" 刪除一個字元。然後您使用 "G" 到最後一行,並使用 ":w" 寫入檔案。您編輯了其他幾個檔案,然後使用 ":edit one.txt" 返回 "one.txt"。如果您現在使用 " Vim 跳到檔案的最後一行。使用 . 會將您帶到刪除該字元的位置。即使您在檔案中移動,". 也會將您帶到記住的位置。至少在您進行另一次變更或離開檔案之前。

檔案標記

03.10 節中說明了如何使用 "mx" 在檔案中放置標記,並使用 "`x" 跳到該位置。這在一個檔案內運作。如果您編輯另一個檔案並在那裡放置標記,則這些標記是該檔案特有的。因此,每個檔案都有自己的一組標記,它們是檔案本機的。到目前為止,我們使用的是帶有小寫字母的標記。也有帶有大寫字母的標記。這些是全域的,可以從任何檔案中使用。例如,假設我們正在編輯檔案 "foo.txt"。轉到檔案的一半 (「50%」) 並在那裡放置 F 標記 (F 代表 foo)
50%mF
現在編輯檔案 "bar.txt" 並在其最後一行放置 B 標記 (B 代表 bar)
GmB
現在您可以使用 "'F" 命令跳回 foo.txt 的一半。或者編輯另一個檔案,輸入 "'B",您會跳到 bar.txt 的末尾。
檔案標記會被記住,直到它們被放置在其他地方。因此,您可以放置標記,進行數小時的編輯,仍然能夠跳回到該標記。通常,在標記字母和它放置的位置之間建立簡單的連結是很有用的。例如,在標頭檔案中使用 H 標記,在 Makefile 中使用 M 標記,在 C 程式碼檔案中使用 C 標記。
要查看特定標記的位置,請向 ":marks" 命令提供引數
:marks M
您也可以提供多個引數
:marks MCP
別忘了您可以使用 CTRL-OCTRL-I 跳到較舊和較新的位置,而無需在那裡放置標記。

07.4 備份檔案

通常 Vim 不會產生備份檔案。如果您想要一個,您只需執行以下命令
:set backup
備份檔案的名稱是原始檔案的名稱,並在結尾加上 ~。例如,如果您的檔案名為 data.txt,則備份檔案名為 data.txt~。如果您不喜歡備份檔案以 ~ 結尾的事實,您可以變更副檔名
:set backupext=.bak
這將使用 data.txt.bak 而不是 data.txt~。這裡另一個重要的選項是 'backupdir'。它指定備份檔案的寫入位置。預設值是在與原始檔案相同的目錄中寫入備份檔案,這通常是正確的選擇。
注意:當未設定 'backup' 選項,但設定了 'writebackup' 選項時,Vim 仍然會建立備份檔案。但是,它會在成功完成寫入檔案後立即刪除。當寫入失敗時 (磁碟已滿是最常見的原因;被閃電擊中可能是另一個原因,儘管較不常見) ,這可以作為防止遺失原始檔案的安全措施。

保留原始檔案

如果您正在編輯原始碼檔案,您可能想要在進行任何變更之前保留該檔案。但是備份檔案每次寫入檔案時都會被覆寫。因此,它只包含先前的版本,而不是第一個版本。要使 Vim 保留原始檔案,請設定 'patchmode' 選項。這指定變更檔案的第一個備份所使用的副檔名。通常您會這樣做
:set patchmode=.orig
當您現在第一次編輯檔案 data.txt,進行變更並寫入檔案時,Vim 會將未變更的檔案副本保留在名稱 "data.txt.orig" 下。如果您對檔案進行進一步的變更,Vim 會注意到 "data.txt.orig" 已經存在並且不理會它。然後,進一步的備份檔案將被稱為 "data.txt~" (或您使用 'backupext' 指定的任何名稱)。如果您將 'patchmode' 留空 (那是預設值),則不會保留原始檔案。

07.5 在檔案之間複製文字

這說明如何將文字從一個檔案複製到另一個檔案。讓我們從一個簡單的範例開始。編輯包含您要複製的文字的檔案。將游標移動到文字的開頭並按下 "v"。這會啟動視覺模式。現在將游標移動到文字的結尾並按下 "y"。這會提取 (複製) 所選取的文字。要複製上面的段落,您會執行
:edit thisfile
/This
vjjjj$y
現在編輯您要放入文字的檔案。將游標移動到您希望文字出現在後面的字元。使用 "p" 將文字放在那裡。
:edit otherfile
/There
p
當然,您可以使用許多其他命令來提取文字。例如,要選取整行,請使用 "V" 啟動視覺模式。或者使用 CTRL-V 選取矩形區塊。或者使用 "yy" 提取單行,使用 "yaw" 提取一個單字等等。"p" 命令會將文字放在游標之後。使用 "P" 將文字放在游標之前。請注意,Vim 會記住您是否提取了整行或區塊,並以該方式放回去。

使用暫存器

當您想要將數段文字從一個檔案複製到另一個檔案時,必須在檔案之間切換並寫入目標檔案,這會花費很多時間。為了避免這種情況,請將每段文字複製到各自的暫存器中。暫存器是 Vim 儲存文字的地方。在這裡我們將使用名為 a 到 z 的暫存器(稍後您會發現還有其他的)。讓我們將一句話複製到 f 暫存器(f 代表 First)。
"fyas
「yas」指令像之前一樣複製一句話。是「"f」告訴 Vim 文字應該被放置在 f 暫存器中。這必須在複製指令之前。現在將三整行複製到 l 暫存器(l 代表 line)。
"l3yy
計數也可以放在「"l」之前。要將一段文字複製到 b 暫存器(b 代表 block)。
CTRL-Vjjww"by
請注意,暫存器指定「"b」就在「y」指令之前。這是必要的。如果您將它放在「w」指令之前,它將不會起作用。現在您在 f、l 和 b 暫存器中有三段文字。編輯另一個檔案,移動並將文字放置在您想要的位置。
"fp
同樣地,暫存器指定「"f」在「p」指令之前。您可以按任何順序放置暫存器。而且文字會留在暫存器中,直到您將其他東西複製到其中。因此,您可以多次放置它。
當您刪除文字時,您也可以指定暫存器。使用此功能來移動數段文字。例如,要刪除一個單字並將其寫入 w 暫存器。
"wdaw
同樣地,暫存器指定在刪除指令「d」之前。
附加到檔案
當將多行文字收集到一個檔案中時,您可以使用此指令。
:write >> logfile
這會將目前檔案的文字寫入「logfile」的末尾。因此它是附加的。這避免了您必須複製行、編輯記錄檔並將它們放在那裡。因此,您可以節省兩個步驟。但是您只能附加到檔案的末尾。要僅附加幾行,請在輸入「:write」之前在視覺模式中選擇它們。在第 10 章中,您將學習選擇一系列行的其他方法。

07.6 檢視檔案

有時您只想查看檔案的內容,而無意將其寫回。存在不經意輸入「:w」而覆蓋原始檔案的風險。為了避免這種情況,請以唯讀方式編輯檔案。要以唯讀模式啟動 Vim,請使用此指令。
vim -R file
在 Unix 上,此指令應該執行相同的操作。
view file
您現在以唯讀模式編輯「file」。當您嘗試使用「:w」時,您會收到錯誤訊息,並且檔案不會被寫入。當您嘗試對檔案進行變更時,Vim 會發出警告。
W10: 警告:正在變更唯讀檔案
但是變更會被執行。這允許您格式化檔案,例如,以便能夠輕鬆閱讀它。如果您對檔案進行了變更,並且忘記它是唯讀的,您仍然可以寫入它。將「!」新增至寫入指令以強制寫入。
如果您真的想禁止在檔案中進行變更,請執行此操作。
vim -M file
現在每次嘗試變更文字都會失敗。例如,說明檔案就是這樣。如果您嘗試進行變更,您會收到此錯誤訊息。
E21: 無法進行變更,'modifiable' 已關閉
您可以使用 -M 參數設定 Vim 以在檢視器模式下工作。但是,這只是自願的,因為這些指令會移除保護。
:set modifiable
:set write

07.7 變更檔案名稱

開始編輯新檔案的一個聰明方法是使用一個包含您大部分需要內容的現有檔案。例如,您開始編寫一個新程式來移動檔案。您知道您已經有一個複製檔案的程式,因此您從以下開始:
:edit copy.c
您可以刪除您不需要的內容。現在您需要以新名稱儲存檔案。可以使用「:saveas」指令來執行此操作。
:saveas move.c
Vim 會以給定的名稱寫入檔案,並編輯該檔案。因此,下次您執行「:write」時,它會寫入「move.c」。「copy.c」保持未修改。當您想要變更正在編輯的檔案名稱,但不想寫入檔案時,可以使用此指令。
:file move.c
Vim 會將檔案標記為「未編輯」。這表示 Vim 知道這不是您開始編輯的檔案。當您嘗試寫入檔案時,您可能會收到此訊息。
E13: 檔案已存在(使用 ! 來覆寫)
這可以保護您免於意外覆寫另一個檔案。
下一章:usr_08.txt 分割視窗
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
指令索引
快速參考