Usr_11

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


VIM 使用者手冊 - 作者:Bram Moolenaar
從當機中復原
你的電腦當機了嗎?而且你才剛編輯了好幾個小時?別慌!Vim 儲存了足夠的資訊來恢復你大部分的工作。本章將會告訴你如何找回你的工作,並解釋交換檔是如何被使用的。
11.1 基本復原 11.2 交換檔在哪裡? 11.3 當機了嗎? 11.4 進階閱讀
下一章:usr_12.txt 聰明的小技巧 前一章:usr_10.txt 進行大幅度的修改 目錄:usr_toc.txt

基本復原

在大多數情況下,復原檔案相當簡單,假設你知道你正在編輯哪個檔案(而且硬碟仍然正常運作)。使用 "-r" 參數啟動 Vim 來開啟該檔案。
vim -r help.txt
Vim 將會讀取交換檔(用來儲存你正在編輯的文字),並且可能會讀取原始檔案的片段。如果 Vim 恢復了你的變更,你會看到這些訊息(當然,檔案名稱會有所不同):
正在使用交換檔 ".help.txt.swp"
原始檔案 "~/vim/runtime/doc/help.txt"
復原完成。你應該檢查是否一切正常。
(你可能想要將此檔案另存為其他名稱
並使用 diff 工具與原始檔案比較,以檢查變更)
你現在可能想要刪除 .swp 檔案。
為了安全起見,將此檔案另存為其他名稱
:write help.txt.recovered
將檔案與原始檔案比較,以檢查是否與你預期的相同。Diff 模式對於此操作非常有用 08.7。例如:
:write help.txt.recovered
:edit #
:diffsp help.txt
請注意原始檔案可能包含更新的版本(你在電腦當機前才剛儲存檔案)。並檢查是否有遺漏的行(有些錯誤導致 Vim 無法復原)。如果 Vim 在復原時產生警告訊息,請仔細閱讀。不過這種情況很少見。
如果復原結果中的文字與檔案內容完全相同,你會收到這個訊息:
正在使用交換檔 ".help.txt.swp"
原始檔案 "~/vim/runtime/doc/help.txt"
復原完成。緩衝區內容與檔案內容相同。
你現在可能想要刪除 .swp 檔案。
如果先前已經恢復了你的變更,或是你在變更後儲存了檔案,通常會發生這種情況。現在可以安全地刪除交換檔。
最後幾次的變更無法恢復是正常的。當你大約四秒沒有輸入,或輸入約兩百個字元後,Vim 會將變更寫入磁碟。這可以使用 'updatetime''updatecount' 選項進行設定。因此,當系統當機時,如果 Vim 沒有機會儲存,最後一次寫入磁碟後的變更將會遺失。
如果你在編輯時沒有指定檔案名稱,請給予一個空字串作為參數:
vim -r ""
你必須在正確的目錄中,否則 Vim 無法找到交換檔。

11.2 交換檔在哪裡?

Vim 可以將交換檔儲存在幾個地方。要找到它,請切換到檔案所在的目錄,並使用:
vim -r
Vim 將會列出它可以找到的交換檔。它也會在其他目錄中尋找,這些目錄中可能存在當前目錄中檔案的交換檔。但是,它不會在任何其他目錄中找到交換檔,它不會搜尋目錄樹。輸出可能如下所示:
找到的交換檔
在目前目錄中
1. .main.c.swp
擁有者:mool 日期:2001 年 5 月 29 日 21:00:25
檔案名稱:~mool/vim/vim6/src/main.c
已修改:是
使用者名稱:mool 主機名稱:masaka.moolenaar.net
程序 ID:12525
在目錄 ~/tmp 中
-- 無 --
在目錄 /var/tmp 中
-- 無 --
在目錄 /tmp 中
-- 無 --
如果有多個交換檔看起來可能是你想要使用的,則會列出這些交換檔,並且會要求你輸入要使用的交換檔編號。仔細查看日期,以決定要使用哪個交換檔。如果你不知道要使用哪個,請逐一嘗試並檢查結果檔案是否符合你的預期。
使用特定的交換檔
如果你知道需要使用哪個交換檔,可以透過提供交換檔名稱來復原。Vim 將會從交換檔中找出原始檔案的名稱。
範例
vim -r .help.txt.swo
當交換檔在與預期不同的目錄中時,這也很方便。Vim 會將模式為 .s[uvw][a-z] 的檔案識別為交換檔。
如果這樣仍然無法運作,請查看 Vim 報告的檔案名稱,並相應地重新命名檔案。檢查 'directory' 選項,以查看 Vim 可能將交換檔放在哪裡。
注意:Vim 會嘗試透過搜尋 'dir' 選項中的目錄,來尋找與 "filename.sw?" 相符的檔案,藉此找到交換檔。如果萬用字元展開無法運作(例如,當 'shell' 選項無效時),Vim 會盡力尋找檔案 "filename.swp"。如果這樣也失敗了,你必須提供交換檔本身的名稱才能復原檔案。

11.3 當機了嗎? 注意 E325

Vim 會嘗試保護你,避免你做出愚蠢的事情。假設你天真地開始編輯一個檔案,期望檔案內容會顯示出來。但是,Vim 卻產生了一個很長的訊息:
E325: 注意
找到一個名稱為 ".main.c.swp" 的交換檔
擁有者:mool 日期:2001 年 5 月 29 日 21:09:28
檔案名稱:~mool/vim/vim6/src/main.c
已修改:否
使用者名稱:mool 主機名稱:masaka.moolenaar.net
程序 ID:12559 (仍在執行中)
在開啟檔案 "main.c" 時
日期:2001 年 5 月 29 日 19:46:12
~
(1) 可能有另一個程式正在編輯同一個檔案。
如果是這樣,請小心不要在進行變更時,
產生同一檔案的兩個不同執行個體。
請結束,或小心繼續。
~
(2) 此檔案的編輯工作階段當機了。
如果是這樣,請使用 ":recover" 或 "vim -r main.c"
來恢復變更(請參閱 ":help recovery")。
如果你已經這麼做了,請刪除交換檔 ".main.c.swp"
以避免此訊息。
你會收到此訊息,是因為當你開始編輯檔案時,Vim 會檢查該檔案是否已存在交換檔。如果有的話,那一定有問題。可能屬於以下兩種情況之一:
1. 另一個編輯工作階段正在此檔案上作用。請在訊息中尋找包含「程序 ID」的行。它可能看起來像這樣:
程序 ID:12559 (仍在執行中)
文字「(仍在執行中)」表示編輯此檔案的程序在同一台電腦上執行。在非 Unix 系統上工作時,你不會收到這個額外的提示。透過網路編輯檔案時,你可能看不到提示,因為程序可能在另一台電腦上執行。在後兩種情況下,你必須自己找出情況。如果還有另一個 Vim 正在編輯同一個檔案,繼續編輯將會導致同一個檔案有兩個版本。最後寫入的版本將會覆蓋另一個版本,導致變更遺失。你最好結束這個 Vim。
2. 交換檔可能是先前 Vim 或電腦當機的結果。請檢查訊息中提到的日期。如果交換檔的日期比你正在編輯的檔案新,並且出現這一行:
已修改:是
那麼你很可能有一個當機的編輯工作階段,值得復原。如果檔案的日期比交換檔的日期新,則表示它是在當機後被變更(或許你先前已復原它,但沒有刪除交換檔?),或者該檔案是在當機前,但在最後一次寫入交換檔後被儲存(那麼你很幸運:你甚至不需要那個舊的交換檔)。Vim 會使用這一額外的行來警告你:
比交換檔新!
請注意,在以下情況下,Vim 知道交換檔沒有用,會自動刪除它:
檔案是有效的交換檔(魔術數字正確)。
檔案已修改的旗標未設定。
程序未執行。
你可以使用 FileChangedShell 自動指令事件,以程式設計方式處理這種情況。
無法讀取的交換檔
有時,在交換檔名稱下會出現以下這一行:
[無法讀取]
這可能是好或壞,取決於情況。
如果先前的編輯工作階段在沒有對檔案進行任何變更的情況下當機,那是好的。那麼,交換檔的目錄清單將會顯示它是零位元組。你可以刪除它並繼續。
如果你沒有讀取交換檔的權限,那情況稍微不好。你可能會想要以唯讀方式檢視檔案,或結束。在多使用者系統上,如果你自己是在不同的登入名稱下進行最後變更,則登出,然後以該另一個名稱登入可能會解決「讀取錯誤」問題。或者,你可能會想要找出最後編輯(或正在編輯)檔案的人,並與他們談談。
如果這表示包含交換檔的磁碟上有實體讀取錯誤,情況會非常糟。幸運的是,這種情況幾乎不會發生。你可能會想要先以唯讀方式檢視檔案(如果可以),以查看「遺忘」的變更範圍。如果你是負責該檔案的人,請準備好重做你最後的變更。
該怎麼辦?swap-exists-choices
如果支援對話框,你會被要求選擇六個選項之一:
交換檔 ".main.c.swp" 已存在!
[O] 以唯讀方式開啟、(E) 仍然編輯、(R) 復原、(Q) 結束、(A) 中止、(D) 刪除它
O 以唯讀方式開啟檔案。當你只想檢視檔案,而不需要復原它時,請使用此選項。當你知道有其他人在編輯檔案時,你可能會想使用此選項,但你只想查看它而不進行變更。
E 仍然編輯檔案。請謹慎使用此選項!如果檔案正在另一個 Vim 中編輯,你可能會產生兩個版本的檔案。Vim 會嘗試在你發生這種情況時警告你,但小心駛得萬年船。
R 從交換檔復原檔案。如果你知道交換檔包含你想要復原的變更,請使用此選項。
Q 離開。這會避免開始編輯檔案。當有另一個 Vim 正在編輯同一個檔案時,請使用此選項。當您剛啟動 Vim 時,這將會直接退出 Vim。當啟動 Vim 時同時開啟多個檔案於多個視窗時,只有在第一個檔案存在暫存檔的情況下,Vim 才會退出。當使用編輯命令時,檔案將不會被載入,並且您會回到先前編輯的檔案。
A 中止。類似於離開,但也會中止後續的命令。當載入編輯多個檔案的腳本時(例如具有多個視窗的工作階段),這很有用。
D 刪除暫存檔。當您確定不再需要它時使用。例如,當它不包含任何變更,或者當檔案本身比暫存檔更新時。在 Unix 系統上,只有在建立暫存檔的程序似乎沒有執行時才會提供此選項。
如果您沒有看到對話框(您正在運行的 Vim 版本不支援它),您將必須手動執行。要復原檔案,請使用此命令
:recover
Vim 並非總能偵測到檔案已存在暫存檔。當其他編輯工作階段將暫存檔放置在其他目錄中,或者當在不同機器上編輯檔案時的路徑名稱不同時,就會發生這種情況。因此,不要依賴 Vim 總是警告您。
如果您真的不想看到此訊息,您可以將 'A' 標記添加到 'shortmess' 選項。但您通常不需要這樣做。
如需程式化存取暫存檔,請參閱 swapinfo()

11.4 進一步閱讀

swap-file 關於將在哪裡建立暫存檔以及其名稱的說明。 :preserve 手動將暫存檔刷新到磁碟。 :swapname 查看目前檔案的暫存檔名稱。 'updatecount' 刷新暫存檔到磁碟的按鍵次數。 'updatetime' 刷新暫存檔到磁碟的逾時時間。 'directory' 儲存暫存檔的目錄名稱列表。
下一章:usr_12.txt 聰明的小技巧
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主要
命令索引
快速參考