Usr_21

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


VIM 使用者手冊 - 作者:Bram Moolenaar
離開再回來
本章將探討如何在 Vim 中混合使用其他程式。可以從 Vim 內部執行程式,或者離開 Vim 後稍後再回來。此外,本章將介紹如何記住 Vim 的狀態並在之後還原。
21.1 暫停和恢復 21.2 執行 Shell 命令 21.3 記住資訊;ShaDa 21.4 工作階段 21.5 視圖 21.6 Modelines
下一章:usr_22.txt 尋找要編輯的檔案 前一章:usr_20.txt 快速輸入命令列命令 目錄:usr_toc.txt

暫停和恢復

像大多數 Unix 程式一樣,Vim 可以通過按下 CTRL-Z 來暫停。這會停止 Vim 並將您帶回啟動它的 Shell。然後,您可以執行任何其他命令,直到您感到厭倦為止。然後使用 "fg" 命令將 Vim 帶回前台。
CTRL-Z
{any sequence of shell commands}
fg
您會回到您離開 Vim 的地方,沒有任何改變。如果按下 CTRL-Z 無效,您也可以使用 ":suspend"。別忘了將 Vim 帶回前台,否則您所做的任何變更都將遺失!
只有 Unix 支援此功能。在其他系統上,Vim 會為您啟動一個 Shell。這也具有執行 Shell 命令的功能。但它是一個新的 Shell,而不是您啟動 Vim 的那個 Shell。當您執行 GUI 時,您無法返回啟動 Vim 的 Shell。CTRL-Z 會改為最小化 Vim 視窗。

21.2 執行 Shell 命令

要從 Vim 執行單個 Shell 命令,請使用 ":!{command}"。例如,要查看目錄列表
:!ls
:!dir
第一個用於 Unix,第二個用於 MS-Windows。Vim 將執行程式。當它結束時,您會收到一個提示,要求您按下 <Enter>。這允許您在返回您正在編輯的文字之前查看命令的輸出。"!" 也用於執行程式的其他地方。讓我們看看一個概述
:!{program} 執行 {program} :r !{program} 執行 {program} 並讀取其輸出 :w !{program} 執行 {program} 並將文字發送到其輸入 :[range]!{program} 通過 {program} 過濾文字
請注意,在 "!{program}" 之前是否有範圍會產生很大的差異。沒有範圍時,它會正常執行程式,而有範圍時,則會通過程式過濾多行文字。
以這種方式執行一整排程式是可能的。但是,Shell 更擅長執行此操作。您可以使用 :terminal 啟動新的 Shell。
這類似於使用 CTRL-Z 來暫停 Vim。不同之處在於會啟動一個新的 Shell。

21.3 記住資訊;ShaDa

在編輯了一段時間後,您的暫存器中會有文字、各個檔案中會有標記,以及充滿精心製作的命令的命令列歷史記錄。當您退出 Vim 時,所有這些都會遺失。但您可以將其恢復!
ShaDa(SHAred DAta 的縮寫)檔案旨在儲存狀態資訊
命令列和搜尋模式歷史記錄 暫存器中的文字 各個檔案的標記 緩衝區列表 全域變數
每次您退出 Vim 時,它都會將此資訊儲存在一個檔案(ShaDa 檔案)中。當 Vim 再次啟動時,會讀取 ShaDa 檔案並還原資訊。
'shada' 選項預設設定為還原有限數量的項目。您可能想要設定它以記住更多資訊。這可以通過以下命令完成
:set shada=string
字串指定要儲存的內容。此字串的語法是一個選項字元,後跟一個引數。選項/引數對用逗號分隔。看看如何建立自己的 shada 字串。首先,' 選項用於指定您儲存標記(a-z)的檔案數量。為此選項選擇一個好的偶數(例如 1000)。您的命令現在看起來像這樣
:set shada='1000
f 選項控制是否儲存全域標記 (A-Z 和 0-9)。如果此選項為 0,則不會儲存任何標記。如果此選項為 1 或您未指定 f 選項,則會儲存標記。您需要此功能,因此現在您有這個
:set shada='1000,f1
< 選項控制為每個暫存器儲存多少行。預設情況下,會儲存所有行。如果為 0,則不會儲存任何內容。為避免向您的 ShaDa 檔案新增數千行(可能永遠不會使用並使 Vim 啟動速度變慢),您最多使用 500 行
:set shada='1000,f1,<500
您可能想要使用的其他選項:: 要從命令列歷史記錄中儲存的行數 @ 要從輸入行歷史記錄中儲存的行數 / 要從搜尋歷史記錄中儲存的行數 r 可移動媒體,不會儲存任何標記(可以使用多次) ! 以大寫字母開頭且不包含小寫字母的全域變數 h 在啟動時停用 'hlsearch' 反白顯示 % 緩衝區列表(僅在啟動 Vim 而不使用檔案引數時還原) c 使用 'encoding' 轉換文字 n 用於 ShaDa 檔案的名稱(必須是最後一個選項)
有關詳細資訊,請參閱 'shada' 選項和 shada-file
當您多次執行 Vim 時,最後一個退出的程式會儲存其資訊。這可能會導致先前退出的 Vim 所儲存的資訊遺失。每個項目只能記住一次。

回到您停止 Vim 的地方

您正在編輯檔案的一半,是時候去度假了。您退出 Vim 並去享受生活,忘記了所有工作。幾週後,您啟動 Vim,並輸入
'0
您會回到您離開 Vim 的地方。因此,您可以繼續工作。每次您退出 Vim 時,Vim 都會建立一個標記。最後一個是 '0。'0 指向的位置會變成 '1。'1 會變成 '2,依此類推。標記 '9 會遺失。:marks 命令對於找出 '0 到 '9 將帶您前往的位置很有用。

回到某個檔案

如果您想回到您最近編輯過的檔案,但不是在退出 Vim 時,則有一種稍微複雜的方法。您可以通過輸入命令來查看檔案列表
:oldfiles
1: ~/.config/nvim/init.vim
2: ~/text/resume.txt
3: /tmp/draft
現在您想要編輯第二個檔案,該檔案在列表中前面有 "2:"。您輸入
:e #<2
您可以使用的任何具有檔案名稱引數的命令,而不是 ":e","#<2" 項目在與 "%"(目前檔案名稱)和 "#"(備用檔案名稱)相同的位置工作。因此,您也可以分割視窗來編輯第三個檔案
:split #<3
當您只想編輯檔案時,那個 #<123 玩意有點複雜。幸運的是,有一種更簡單的方法
:browse oldfiles
1: ~/.config/nvim/init.vim
2: ~/text/resume.txt
3: /tmp/draft
-- 更多 --
您會獲得與 :oldfiles 相同的檔案列表。如果您想編輯 "resume.txt",請先按下 "q" 以停止列表。您會收到一個提示
輸入數字,然後按下 <Enter>(空白取消)
輸入 "2",然後按下 <Enter> 以編輯第二個檔案。
更多資訊請參閱 :oldfilesv:oldfilesc_#<

將資訊從一個 Vim 移至另一個 Vim

您可以使用 ":wshada" 和 ":rshada" 命令在 Vim 仍在執行時儲存和還原資訊。例如,這對於在兩個 Vim 實例之間交換暫存器內容很有用。在第一個 Vim 中執行
:wshada! ~/tmp/shada
在第二個 Vim 中執行
:rshada! ~/tmp/shada
顯然,"w" 代表 "write"(寫入),"r" 代表 "read"(讀取)。"! " 字元用於 ":wshada" 強制覆寫現有檔案。當省略它且檔案存在時,資訊會合併到檔案中。用於 ":rshada" 的 ! 字元表示 ShaDa 檔案中的所有資訊優先於現有資訊,這可能會覆寫它。如果沒有 !,則只會使用未設定的資訊。這些命令也可以用於儲存資訊並稍後再次使用。您可以建立一個充滿 ShaDa 檔案的目錄,每個檔案都包含用於不同目的的資訊。

21.4 工作階段

假設您正在編輯,並且一天結束了。您想要結束工作並在第二天從您離開的地方繼續。您可以通過儲存您的編輯工作階段並在第二天還原它來執行此操作。Vim 工作階段包含有關您正在編輯的所有資訊。這包括檔案列表、視窗佈局、全域變數、選項和其他資訊。(具體記住哪些內容由以下描述的 'sessionoptions' 選項控制。)以下命令會建立工作階段檔案
:mksession vimbook.vim
稍後,如果您想還原此工作階段,可以使用此命令
:source vimbook.vim
如果您想啟動 Vim 並還原特定的工作階段,可以使用以下命令
vim -S vimbook.vim
這會告訴 Vim 在啟動時讀取特定的檔案。'S' 代表工作階段(實際上,您可以使用 -S 來源任何 Vim 指令碼,因此它也可能代表「來源」)。
開啟的視窗會以與之前相同的位置和大小還原。對應和選項值與之前相同。具體還原哪些內容取決於 'sessionoptions' 選項。預設值為:"blank,buffers,curdir,folds,help,options,tabpages,winsize,terminal"。
blank 保留空白視窗 buffers 所有緩衝區,而不僅僅是視窗中的緩衝區 curdir 目前目錄 folds 折疊,也包括手動建立的折疊 help 說明視窗 options 所有選項和對應 tabpages 所有索引標籤頁 winsize 視窗大小 terminal 包括終端視窗
根據您的喜好更改此設定。例如,也要還原 Vim 視窗的大小,請使用
:set sessionoptions+=resize
此處的工作階段、彼處的工作階段
使用會話功能最明顯的時機是在處理不同的專案時。假設您將會話檔案儲存在「~/.config/nvim」目錄中。您目前正在處理「秘密」專案,並且必須切換到「無聊」專案。
:wall
:mksession! ~/.config/nvim/secret.vim
:source ~/.config/nvim/boring.vim
首先使用「:wall」寫入所有已修改的檔案。然後,使用「:mksession!」儲存目前的會話。這會覆寫先前的會話。下次您載入秘密會話時,可以從這個時間點繼續。最後,您載入新的「無聊」會話。
如果您開啟說明視窗、分割並關閉各種視窗,以及大致上弄亂視窗佈局,您可以回到最後儲存的會話。
:source ~/.config/nvim/boring.vim
因此,您可以完全控制是否要透過將目前的設定儲存在會話中,來在下次從現在的位置繼續,或者將會話檔案保留為起點。使用會話的另一種方式是建立您喜歡使用的視窗佈局,並將其儲存在會話中。然後,您可以隨時回到此佈局。例如,這是一個不錯的佈局可以使用:
+----------------------------------------+
|                  VIM - main help file  |
|                                        |
|Move around:  Use the cursor keys, or "h|
|help.txt================================|
|explorer   |                            |
|dir        |~                           |
|dir        |~                           |
|file       |~                           |
|file       |~                           |
|file       |~                           |
|file       |~                           |
|~/=========|[No File]===================|
|                                        |
+----------------------------------------+
這在頂部有一個說明視窗,以便您可以閱讀此文字。左側狹窄的垂直視窗包含一個檔案總管。這是一個 Vim 外掛程式,會列出目錄的內容。您可以在那裡選擇要編輯的檔案。下一章將詳細介紹。從剛剛啟動的 Vim 建立此佈局:
:help
CTRL-W w
:vertical split ~/
您可以稍微調整視窗大小以符合您的喜好。然後使用以下命令儲存會話:
:mksession ~/.config/nvim/mine.vim
現在,您可以使用此佈局啟動 Vim:
vim -S ~/.config/nvim/mine.vim
提示:若要開啟您在檔案總管視窗中看到的檔案,請將游標移至檔案名稱並按下「O」。使用滑鼠雙擊也會執行此操作。

會話與 SHADA

會話會儲存許多內容,但不包括標記的位置、暫存器的內容和命令列歷史記錄。您需要使用 shada 功能來儲存這些項目。在大多數情況下,您會希望將會話與 shada 分開使用。這可以用於切換到另一個會話,但保留命令列歷史記錄。並將文字複製到一個會話中的暫存器中,然後貼回到另一個會話中。您可能偏好將資訊保留在會話中。您必須自行完成此操作。範例:
:mksession! ~/.config/nvim/secret.vim
:wshada! ~/.local/state/nvim/shada/secret.shada
再次還原:
:source ~/.config/nvim/secret.vim
:rshada! ~/.local/state/nvim/shada/secret.shada

21.5 檢視

會話會儲存整個 Vim 的外觀。當您只想儲存單一視窗的屬性時,請使用檢視。檢視的用途是在您想要以特定方式編輯檔案時。例如,您已啟用行號,並使用 'number' 選項,並定義了一些折疊。就像會話一樣,您可以記住此檔案的檢視,並稍後還原它。實際上,當您儲存會話時,它會儲存每個視窗的檢視。有兩種使用檢視的基本方法。第一種是讓 Vim 為檢視檔案選擇名稱。當您稍後編輯同一個檔案時,可以還原檢視。若要儲存目前視窗的檢視:
:mkview
Vim 會決定將檢視儲存在哪裡。當您稍後編輯同一個檔案時,您可以使用此命令取回檢視:
:loadview
這很簡單,不是嗎?現在,您想在不啟用 'number' 選項或開啟所有折疊的情況下檢視檔案,您可以設定選項使視窗看起來像那樣。然後使用以下命令儲存此檢視:
:mkview 1
顯然,您可以使用以下命令取回檢視:
:loadview 1
現在,您可以使用帶有或不帶有「1」引數的「:loadview」在檔案的兩個檢視之間切換。您可以使用這種方式為同一個檔案儲存最多十個檢視,一個未編號,九個編號為 1 到 9。
具有名稱的檢視
第二種使用檢視的基本方法是將檢視儲存在您選擇的名稱的檔案中。可以在編輯另一個檔案時載入此檢視。然後,Vim 會切換為編輯檢視中指定的檔案。因此,您可以使用它來快速切換到編輯另一個檔案,並將所有選項設定為您儲存它們時的狀態。例如,若要儲存目前檔案的檢視:
:mkview ~/.config/nvim/main.vim
您可以使用以下命令還原它:
:source ~/.config/nvim/main.vim

21.6 模式行

當編輯特定檔案時,您可能會特別為該檔案設定選項。每次都輸入這些命令很煩人。當多個人共享檔案時,使用會話或檢視編輯檔案是行不通的。此情況的解決方案是將模式行新增至檔案。這是一行文字,會告訴 Vim 選項的值,僅適用於此檔案。一個典型的範例是 C 程式,您以 4 個空格的倍數縮排。這需要將 'shiftwidth' 選項設定為 4。此模式行將執行該操作:
/* vim:set shiftwidth=4: */ ~
將此行放在檔案開頭或結尾的頭五行之一。編輯檔案時,您會注意到 'shiftwidth' 會被設定為 4。編輯另一個檔案時,它會被設定回預設值 8。對於某些檔案,模式行非常適合放在標頭中,因此可以放在檔案頂部。對於文字檔和其他模式行會妨礙正常內容的檔案,請將其放在檔案結尾。
'modelines' 選項指定要檢查檔案開頭和結尾多少行是否包含模式行。若要檢查十行:
:set modelines=10
可以使用 'modeline' 選項關閉此功能。當您以 Unix 上的 root 或 MS-Windows 上的管理員身分工作時,或當您不信任您正在編輯的檔案時,請執行此操作:
:set nomodeline
使用此格式設定模式行:
any-text vim:set {option}={value} ... : any-text
「any-text」表示您可以在 Vim 將使用的部分之前和之後放置任何文字。這允許使其看起來像註解,就像上面的「/*」和「*/」一樣。「 vim:」部分是讓 Vim 識別此行的部分。「vim」之前必須有空白,或者「vim」必須位於行的開頭。因此,使用「gvim:」之類的內容將不起作用。冒號之間的部分是「:set」命令。它的運作方式與輸入「:set」命令相同,但您需要在冒號之前插入反斜線(否則它會被視為模式行的結尾)。
另一個範例:
// vim:set textwidth=72 dir=c\:\tmp:  use c:\tmp here
第一個冒號之前有一個額外的反斜線,以便它包含在「:set」命令中。第二個冒號之後的文字會被忽略,因此可以在那裡放置註解。
如需更多詳細資料,請參閱 modeline
下一章:usr_22.txt 尋找要編輯的檔案
版權:請參閱 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主頁
命令索引
快速參考