編輯

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


編輯檔案

1. 簡介 edit-intro

在 Vim 中編輯檔案意味著
1. 將檔案讀入緩衝區 2. 使用編輯器命令修改緩衝區 3. 將緩衝區寫入檔案
current-file
只要你不寫入緩衝區,原始檔案將保持不變。如果你開始編輯一個檔案(將檔案讀入緩衝區),該檔案名稱會被記住為「目前檔案名稱」。這也稱為目前緩衝區的名稱。它可以在命令列中使用 "%" 來表示 :_%
alternate-file
如果已經存在目前檔案名稱,則該名稱會變成備用檔案名稱。它可以在命令列中使用 "#" 來表示 :_#,你也可以使用 CTRL-^ 命令在目前檔案和備用檔案之間切換。但是,當使用 :keepalt 時,備用檔案名稱不會被更改。每個視窗都會記住一個備用檔案名稱。
:keepalt :keepa :keepalt {cmd} 執行 {cmd},同時保留目前的備用檔案名稱。請注意,間接調用的命令(例如,透過函式)仍可能會設定備用檔案名稱。
所有檔案名稱都會被記錄在緩衝區列表中。當你輸入檔案名稱來進行編輯(例如,使用 ":e filename")或寫入(例如,使用 ":w filename")時,該檔案名稱會被添加到列表中。你可以使用緩衝區列表來記住你編輯過的檔案,並使用 CTRL-^ 命令快速地從一個檔案切換到另一個檔案(例如,複製文字)。首先輸入檔案的編號,然後按下 CTRL-^
CTRL-G 或 CTRL-G :f :fi :file :f[ile] 印出目前的檔案名稱(如同輸入的名稱,除非使用了 ":cd" 命令),游標位置(除非設定了 'ruler' 選項),以及檔案狀態(唯讀、已修改、讀取錯誤、新檔案)。請參閱 'shortmess' 選項,以了解如何縮短此訊息。
:f[ile]! 類似於 :file,但即使 'shortmess' 指示要縮短名稱,也不會截斷名稱。
{count}CTRL-G 類似於 CTRL-G,但會印出包含完整路徑的目前檔案名稱。如果計數大於 1,則也會顯示目前的緩衝區編號。
g_CTRL-G word-count byte-count g CTRL-G 以五種方式印出游標的目前位置:欄位、行、單字、字元和位元組。如果字元數和位元組數相同,則會省略字元位置。
如果該行中有字元在螢幕上佔用多個位置(<Tab> 或特殊字元),或者字元每個欄位使用多個位元組(當 'encoding' 為 utf-8 時,0x7F 以上的字元),則會顯示位元組欄位和螢幕欄位,並以破折號分隔。
另請參閱 'ruler' 選項和 wordcount() 函式。
v_g_CTRL-G
{Visual}g CTRL-G 類似於 "g CTRL-G",但會顯示視覺選取區域的單字、字元、行和位元組計數。在區塊模式中,也會顯示欄位計數。(關於 {Visual} 請參閱 Visual-mode。)
:file_f
:f[ile][!] {name} 將目前的檔案名稱設定為 {name}。可選的 ! 避免截斷訊息,就像 :file 一樣。如果緩衝區原本有名稱,則該名稱會變成備用檔案名稱。建立未列出的緩衝區來保存舊的名稱。:0file
:0f[ile][!] 移除目前緩衝區的名稱。可選的 ! 避免截斷訊息,就像 :file 一樣。
:buffers :files :ls 列出所有目前已知的檔案名稱。請參閱 windows.txt :files :buffers :ls
Vim 會記住你輸入的檔案名稱的完整路徑名稱。在大多數情況下,當顯示檔案名稱時,只會顯示你輸入的名稱,但是如果你使用了 ":cd" 命令 :cd,則會使用完整路徑名稱。
home-replace
如果設定了環境變數 $HOME,並且檔案名稱以該字串開頭,則通常會將 HOME 替換為 "~" 來顯示。這樣做的目的是為了讓檔案名稱保持簡短。在讀取或寫入檔案時,仍然會使用完整名稱,"~" 僅在顯示檔案名稱時使用。當替換檔案名稱的結果僅為 "~" 時,將改用 "~/"(以避免混淆設定為 $HOME 的選項,並且 'backupext' 設定為 "~")。
寫入緩衝區時,預設會使用目前的檔案名稱。因此,當你執行 "ZZ" 或 ":wq" 命令時,原始檔案將被覆寫。如果你不想要這樣,可以透過在 ":write" 命令中提供檔案名稱引數,將緩衝區寫入另一個檔案。例如
vim testfile
[change the buffer with editor commands]
:w newfile
:q
這將建立一個名為 "newfile" 的檔案,它是 "testfile" 的修改副本。"testfile" 檔案將保持不變。無論如何,如果設定了 'backup' 選項,Vim 會在覆寫原始檔案之前重新命名或複製它。如果你發現需要原始檔案,可以使用此檔案。另請參閱 'patchmode' 選項。備份檔案的名稱通常與原始檔案相同,並附加 'backupext'。預設的 "~" 有點奇怪,以避免意外覆寫現有檔案。如果你偏好 ".bak",請變更 'backupext' 選項。備份檔案可以透過設定 'backupdir' 放置在另一個目錄中。
當你開始編輯時沒有提供檔案名稱,訊息中會顯示 "No File"。如果使用 ":write" 命令並帶有檔案名稱引數,則目前檔案的檔案名稱會設定為該檔案名稱。只有當 'cpoptions' 中包含 'F' 旗標時才會發生這種情況(預設情況下包含)cpo-F。當在空白緩衝區中輸入文字,然後將其寫入檔案時,這非常有用。如果 'cpoptions' 包含 'f' 旗標(預設情況下不包含)cpo-f,則會為 ":read file" 命令設定檔案名稱。當在沒有引數的情況下啟動 Vim,然後執行 ":read file" 來開始編輯檔案時,這非常有用。當設定了檔案名稱,並且 'filetype' 為空時,將會觸發檔案類型偵測自動指令。not-edited
因為設定了檔案名稱,但實際上並沒有開始編輯該檔案,因此你會受到保護,不會覆寫該檔案。這是透過設定 "notedited" 旗標來完成的。你可以使用 CTRL-G 或 ":file" 命令來查看是否設定了此旗標。當設定了 "notedited" 旗標時,它將包含 "[Not edited]"。當將緩衝區寫入目前的檔案名稱時(使用 ":w!"),"notedited" 旗標會被重設。
abandon
Vim 會記住你是否已變更緩衝區。你會受到保護,不會遺失所做的變更。如果你嘗試在沒有寫入的情況下退出,或想要開始編輯另一個檔案,Vim 會拒絕此操作。為了覆寫此保護,請在命令中加入 '!'。這樣做將會遺失變更。例如:如果緩衝區已變更,則 ":q" 將無法運作,但 ":q!" 將可以運作。若要查看緩衝區是否已變更,請使用 "CTRL-G" 命令。如果緩衝區已變更,訊息將包含字串 "[Modified]",或者如果 'm' 旗標在 'shortmess' 中,則會包含 "+"。
如果你想要自動儲存變更而不詢問,請開啟 'autowriteall' 選項。'autowrite' 是相關的 Vi 相容選項,但並非適用於所有命令。
如果你想要保留已變更的緩衝區而不儲存它,請開啟 'hidden' 選項。請參閱 hidden-buffer。即使未設定 'hidden',某些命令也會以這種方式運作,請檢查該命令的說明。

2. 編輯檔案 edit-a-file

:e :edit reload :e[dit][!] [++opt] [+cmd] 編輯目前的檔案。當目前的檔案在 Vim 之外已變更時,重新編輯目前的檔案非常有用。:edit! discard 如果提供了 [!],則會捨棄目前緩衝區中未儲存的變更。如果沒有 [!],則如果存在未儲存的變更,該命令將會失敗,除非設定了 'autowriteall' 並且可以寫入檔案。另請參閱 ++opt+cmd
:edit_f
:e[dit][!] [++opt] [+cmd] {file} 編輯 {file}:edit!_f
如果提供了 [!],則會捨棄目前緩衝區中未儲存的變更。如果沒有 [!],則如果存在未儲存的變更,該命令將會失敗,除非設定了 'hidden' 或設定了 'autowriteall' 並且可以寫入檔案。另請參閱 ++opt+cmd
:edit_# :e# :e[dit] [++opt] [+cmd] #[count] 編輯第 [count] 個緩衝區(如 :files 所示)。此命令與 [count] CTRL-^ 的功能相同。但是,如果備用緩衝區沒有檔案名稱,則 ":e #" 無法運作,而 CTRL-^ 仍會運作。另請參閱 ++opt+cmd
:ene :enew :ene[w] 編輯一個新的未命名緩衝區。如果已對目前的緩衝區進行變更,則此操作將會失敗,除非設定了 'hidden' 或設定了 'autowriteall' 並且可以寫入檔案。如果 'fileformats' 不為空,則將使用給定的第一個格式作為新緩衝區。如果 'fileformats' 為空,則會使用目前緩衝區的 'fileformat'
:ene! :enew! :ene[w]! 編輯一個新的未命名緩衝區。捨棄對目前緩衝區的所有變更。像 :enew 一樣設定 'fileformat'
:fin :find :fin[d][!] [++opt] [+cmd] {file}'path' 中尋找 {file},然後 :edit 它。
:{count}fin[d][!] [++opt] [+cmd] {file} 與 ":find" 相同,但在 'path' 中使用第 {count} 個比對。因此,":2find file" 將會尋找在 'path' 中找到的第二個 "file"。當在 'path' 中找到的檔案比對數少於要求時,你會收到錯誤訊息。
:ex
:ex [++opt] [+cmd] [file] 與 :edit 相同。
:vi :visual :vi[sual][!] [++opt] [+cmd] [file] 在 Ex 模式中使用時:離開 Ex 模式,回到一般模式。否則與 :edit 相同。
:vie :view :vie[w][!] [++opt] [+cmd] file 在 Ex 模式中使用時:離開 Ex 模式,回到一般模式。否則與 :edit 相同,但會為此緩衝區設定 'readonly' 選項。
CTRL-^ CTRL-6 CTRL-^ 編輯備用檔案。備用檔案通常是先前編輯的檔案。這是在兩個檔案之間切換的快速方法。它等同於 ":e #",但當沒有檔案名稱時也有效。
如果 'autowrite''autowriteall' 選項開啟,且緩衝區已變更,則會寫入。^ 字元通常位於 6 鍵上,按下 CTRL 和 6 即可得到我們所稱的 CTRL-^。但在某些非美式鍵盤上,CTRL-^ 會以其他方式產生。
{count}CTRL-^ 編輯緩衝區列表中的第 [count] 個檔案(等同於 ":e #[count]")。這是快速切換檔案的方法。如需更多詳細資訊,請參閱上方的 CTRL-^
gf E446 E447 [count]gf 編輯游標下方或後方的檔案。助記詞:「goto file」。使用 'isfname' 選項來判斷哪些字元應該在檔案名稱中。會忽略尾隨的標點符號字元「.,:;!」。跳脫字元「\ 」會縮減為單一空格。使用 'path' 選項作為目錄名稱列表來尋找檔案。如需關於相對目錄和萬用字元的詳細資訊,請參閱 'path' 選項。使用 'suffixesadd' 選項來檢查是否已新增字尾的檔案名稱。如果找不到檔案,則會使用 'includeexpr' 來修改名稱並再次嘗試。如果指定 [count],則會編輯在 'path' 中找到的第 count 個檔案。如果 Vim 拒絕 放棄目前的檔案,則此命令會失敗。如果您想要在新視窗中編輯檔案,請使用 CTRL-W_CTRL-F。如果您想要編輯新檔案,請使用
:e <cfile>
讓 gf 永遠以這種方式運作
:map gf :e <cfile><CR>
如果名稱是超文字連結,看起來像「type://machine/path」,則您需要 netrw 外掛程式。對於 Unix,會展開「~」字元,就像在「~user/file」中一樣。也會展開環境變數 expand-env
v_gf
{Visual}[count]gf 與 "gf" 相同,但會使用醒目標示的文字作為要編輯的檔案名稱。'isfname' 會被忽略。會跳過開頭的空白,否則所有空白和特殊字元都會包含在檔案名稱中。(關於 {Visual},請參閱 視覺模式。)
gF
[count]gF 與 "gf" 相同,但如果檔案名稱後跟著一個數字,則游標會定位在檔案中的該行。檔案名稱和數字必須以非檔案名稱(請參閱 'isfname')和非數字字元分隔。「 line 」也會被辨識,就像在 :verbose command UserCmd 的輸出中所使用的一樣。檔案名稱、分隔符號和數字之間的空白會被忽略。範例
eval.c:10
eval.c @ 20
eval.c (30)
eval.c 40
v_gF
{Visual}[count]gF 與 "v_gf" 相同。
這些命令用於開始編輯單一檔案。這表示檔案會讀入緩衝區,並設定目前的檔案名稱。開啟的檔案取決於目前目錄,請參閱 :cd
如需檔案讀取後所顯示訊息的說明,請參閱 read-messages
如果您搞亂了緩衝區並想要重新開始,可以使用 ":e!" 命令。只有在您變更目前檔案名稱時,":e" 命令才有用。
:filename {file} 除了這裡提到的項目之外,在 cmdline-special 中也提及了更多預期檔案名稱的特殊項目。
針對 Unix 以外的系統的注意事項:當使用接受單一檔案名稱的命令(例如「:edit file」)時,允許檔案名稱中包含空格,但會忽略尾隨的空格。這在經常在檔案名稱中嵌入空格的系統(例如 MS-Windows)上很有用。範例:命令「:e Long File Name 」會編輯檔案「Long File Name」。當使用接受多個檔案名稱的命令(例如「:next file1 file2」)時,必須使用反斜線跳脫嵌入的空格。
萬用字元 萬用字元 {file} 中的萬用字元會展開,但與檔案完成一樣,會套用 'wildignore''suffixes'。支援哪些萬用字元取決於系統。以下是常見的萬用字元:? 符合一個字元 * 符合任何內容,包括無 ** 符合任何內容,包括無,會遞迴到目錄中 [abc] 符合 'a'、'b' 或 'c'
為了避免萬用字元的特殊含義,請在前面加上反斜線。但是,在 MS-Windows 上,反斜線是路徑分隔符號,當 "[" 在 'isfname' 選項中時,「path\[abc]」仍然被視為萬用字元。避免這種情況的一個簡單方法是使用「path\[[]abc]」,這會符合檔案「path\[abc]」。
starstar-wildcard
在 Unix、Win32、macOS 和其他一些系統上可以展開「**」(但這可能取決於您在 Unix 和 macOS 上的 'shell' 設定)。已知 zsh 可以正常運作;對於 bash,這需要至少 bash 版本 >= 4.X。這允許搜尋目錄樹。這會深入到 100 個目錄。請注意,有些命令的運作方式略有不同,請參閱 file-searching。範例
:n **/*.txt
尋找檔案
aaa.txt
subdir/bbb.txt
a/b/c/d/ccc.txt
當萬用字元字元直接在「**」之前或之後使用時,這些字元只會在最上層目錄中符合。它們不會用於樹狀結構中更深層的目錄。例如
:n /usr/inc**/types.h
尋找檔案
/usr/include/types.h
/usr/include/sys/types.h
/usr/inc/old/types.h
請注意,包含 "/sys" 的路徑會被包含在內,因為它不需要符合 "/inc"。因此,它就像是符合 "/usr/inc*/*/*...",而不是 "/usr/inc*/inc*/inc*"。
反引號展開 `-展開 在 Unix 和其他一些系統上,您也可以對檔案名稱引數使用反引號,例如
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch  \| head -n1`
Vim 會使用 'shell' 在反引號中執行命令,並將標準輸出作為給定 Vim 命令的引數(來自 shell 命令的錯誤訊息會被捨棄)。若要查看 Vim 正在執行的 shell 命令,請將 'verbose' 選項設定為 4。當 shell 命令傳回非零的結束代碼時,會顯示錯誤訊息,且 Vim 命令會中止。若要避免這種情況,請讓 shell 永遠傳回零,如下所示
:next `find . -name ver\\*.c -print \|\| true`
星號之前的反斜線是必要的,以防止 shell 在執行 find 程式之前展開「ver*.c」。shell 管道符號「|」之前的反斜線可防止 Vim 將其剖析為命令終止。這也適用於大多數其他系統,但限制是反引號必須圍繞整個項目。無法在第一個反引號之前或最後一個反引號之後直接輸入文字。
`=
您可以將反引號展開為 Vim 表達式,而不是外部命令,方法是在第一個反引號之後加上等號,例如
:e `=tempname()`
該表達式可以包含幾乎任何內容,因此這也可以用於避免「"」、「|」、「%」和「#」的特殊含義。但是,'wildignore' 確實像其他萬用字元一樣適用。
在評估表達式時,會展開表達式中的環境變數,因此這會運作
:e `=$HOME .. '/.vimrc'`
這會在字串內使用 $HOME,而且會按字面使用,這很可能不是您的本意
:e `='$HOME' .. '/.vimrc'`
如果表達式傳回字串,則名稱之間必須以換行符號分隔。當結果為 List 時,則會將每個項目用作名稱。換行符號也會分隔名稱。請注意,只有在預期檔案名稱作為 Ex 命令引數的位置才支援此類表達式。
++opt [++opt] [++opt] 引數可用於為單一命令設定某些選項,並指定錯誤字元的行為。格式為
++{optname}
++{optname}={value}
其中 {optname} 是以下其中一個:++ff ++enc ++bin ++nobin ++edit ff 或 fileformat 會覆寫 'fileformat' enc 或 encoding 會覆寫 'fileencoding' bin 或 binary 會設定 'binary' nobin 或 nobinary 會重設 'binary' bad 會指定錯誤字元的行為 edit 用於 :read:保持選項,如同編輯檔案一樣 p 用於 :write:建立檔案的父目錄
{value} 不能包含空白字元。它可以是選項的任何有效值。範例
:e ++ff=unix
這會再次編輯同一個檔案,並將 'fileformat' 設定為「unix」。
:w ++enc=latin1 newfile
這會以 latin1 格式將目前的緩衝區寫入「newfile」。
'fileencoding' 或 ++enc 指定的值與 'encoding' 不同時,寫入檔案時顯示的訊息會顯示「[converted]」。
可以有多個 ++opt 引數,以空白分隔。它們必須全部出現在任何 +cmd 引數之前。
++p
如果檔案的父目錄不存在,「++p」旗標會建立該目錄。例如,如果您編輯「foo/bar/file.txt」,則「:write ++p」命令會在寫入檔案之前建立「foo/bar/」(如有必要)。
:edit foo/bar/file.txt
:write ++p
如果您想要讓 :write(沒有「++p」)永遠建立遺失的父目錄,請將此 autocmd 新增至您的設定
" Auto-create parent directories (except for URIs "://").
au BufWritePre,FileWritePre * if @% !~# '\(://\)' | call mkdir(expand('<afile>:p:h'), 'p') | endif
++bad
「++bad=」的參數指定如何處理無法轉換的字元和非法位元組。它可以是以下三種情況之一:++bad=X:單一位元組字元,用於取代每個錯誤字元。++bad=keep:保留錯誤字元,不做轉換。請注意,這可能會導致文字中出現非法位元組!++bad=drop:移除錯誤字元。
預設值類似於「++bad=?」:將每個錯誤字元取代為問號。在某些地方會使用倒問號 (0xBF)。
請注意,並非所有指令都使用 ++bad 參數,即使您新增此參數也不會產生錯誤。例如::write
請注意,讀取時,'fileformat''fileencoding' 選項將會設定為所使用的格式。寫入時則不會這樣,因此下一次寫入將使用選項的舊值。'binary' 選項也是如此。
+cmd [+cmd] [+cmd] 參數可用於將游標定位在新開啟的檔案中,或執行任何其他指令:+:從最後一行開始。+{num}:從第 {num} 行開始。+/{pat}:從第一個包含 {pat} 的行開始。+{command}:在開啟新檔案後執行 {command}{command} 是任何 Ex 指令。若要在 {pat}{command} 中包含空白字元,請在其前面加上反斜線。將反斜線數量加倍。
:edit  +/The\ book             file
:edit  +/dir\ dirname\\      file
:edit  +set\ dir=c:\\\\temp  file
請注意,在最後一個範例中,反斜線的數量會減半兩次:一次是針對 "+cmd" 參數,另一次是針對 ":set" 指令。
檔案格式
'fileformat' 選項設定檔案的 <EOL> 樣式
'fileformat' 字元名稱
「dos」<CR><NL><NL> DOS 格式 DOS 格式
「unix」<NL> Unix 格式 Unix 格式
「mac」<CR> Mac 格式 Mac 格式
讀取檔案時,提及的字元會被解譯為 <EOL>。在 DOS 格式 (Windows 的預設格式) 中,<CR><NL><NL> 都會被解譯為 <EOL>。請注意,以 DOS 格式寫入檔案時,會為每個單獨的 <NL> 新增 <CR> 字元。另請參閱 file-read
寫入檔案時,提及的字元會用於 <EOL>。對於 DOS 格式,會使用 <CR><NL>。另請參閱 DOS-format-write
您可以讀取 DOS 格式的檔案,並以 Unix 格式寫入。這會將所有 <CR><NL> 對取代為 <NL> (假設 'fileformats' 包含 "dos")
:e file
:set fileformat=unix
:w
如果您讀取 Unix 格式的檔案,並以 DOS 格式寫入,則所有 <NL> 字元都會被取代為 <CR><NL> (假設 'fileformats' 包含 "unix")
:e file
:set fileformat=dos
:w
如果您開始編輯新的檔案,且 'fileformats' 選項不是空的 (這是預設值),Vim 會嘗試偵測檔案中的行是否以指定的格式分隔。當設定為「unix,dos」時,Vim 會檢查是否具有單一 <NL> (在 Unix 上使用) 或 <CR><NL> 對 (MS-Windows) 的行。只有在 ALL 行以 <CR><NL> 結尾時,'fileformat' 才會設定為「dos」,否則會設定為「unix」。當 'fileformats' 包含「mac」,且檔案中未找到任何 <NL> 字元時,'fileformat' 會設定為「mac」。
如果 'fileformat' 選項在非 MS-Windows 系統上設定為「dos」,則會顯示訊息「[dos]」,以提醒您發生不尋常的情況。在 MS-Windows 系統上,如果 'fileformat' 設定為「unix」,則會收到訊息「[unix]」。在所有系統上,如果 'fileformat' 設定為「mac」,則會收到訊息「[mac]」。
如果 'fileformats' 選項為空且使用 DOS 格式,但在讀取檔案時,某些行並未以 <CR><NL> 結尾,則檔案訊息中會包含「[CR missing]」。如果 'fileformats' 選項為空且使用 Mac 格式,但在讀取檔案時找到 <NL>,則檔案訊息中會包含「[NL missing]」。
如果新檔案不存在,則當 'fileformats' 為空時,會使用目前緩衝區的 'fileformat'。否則,會使用 'fileformats' 中的第一個格式來處理新檔案。
在編輯二進位、可執行檔或 Vim 腳本檔案之前,您應該設定 'binary' 選項。執行此操作的簡單方法是使用「-b」選項啟動 Vim。這會避免使用 'fileformat'。若不這麼做,您可能會冒著單一 <NL> 字元意外被取代為 <CR><NL> 的風險。

行尾和檔案結尾 eol-and-eof

Vim 有數個選項可以控制檔案格式:'fileformat'<EOL> 樣式:Unix、DOS、Mac。'endofline':最後一行是否以 <EOL> 結尾。'endoffile':檔案是否以 CTRL-Z 結尾。'fixendofline':是否要修正 eol 和 eof。
前三個值通常在讀取檔案時自動偵測,並在將文字寫入檔案時使用。編輯緩衝區時,看起來每行都有行尾,且 CTRL-Z 不存在 (當設定 'binary' 時是例外,其運作方式不同)。
'fixendofline' 選項可用於選擇要寫入的內容。您也可以變更選項值,以不同於讀取方式來寫入檔案。
以下是一些如何使用它們的範例。
如果您想要 Unix 格式的檔案 (每行以 NL 終止)
setl ff=unix fixeol
您可能應該在任何類 Unix 系統上執行此操作。此外,現代 MS-Windows 系統也往往能與此搭配運作良好。建議一律將此格式用於 Vim 腳本。
如果您想在現代環境中使用舊的 MS-DOS 檔案,修正行尾並捨棄 CTRL-Z,但保留 <CR><NL> 樣式的 <EOL>
setl ff=dos fixeol
這對許多 MS-Windows 程式很有用,它們通常預期會有 <CR><NL> 行尾。
如果您想捨棄最終的 <EOL> 並新增最終的 CTRL-Z (例如,適用於 CP/M 等舊系統)
setl ff=dos nofixeol noeol eof
如果您想完全保留檔案格式,包括任何最終的 <EOL> 和最終的 CTRL-Z
setl nofixeol

3.引數清單 引數清單 arglist

如果在啟動 Vim 時提供多個檔案名稱,則此清單會記住為引數清單。您可以跳至此清單中的每個檔案。
請勿將此與緩衝區清單混淆,您可以使用 :buffers 指令查看緩衝區清單。引數清單已在 Vi 中存在,緩衝區清單是 Vim 中的新功能。引數清單中的每個檔案名稱也會出現在緩衝區清單中 (除非使用 :bdel:bwipe 刪除)。但緩衝區清單中的名稱通常不會出現在引數清單中。
本主題在使用者手冊的 07.2 節中介紹。
有一個全域引數清單,預設會用於所有視窗。可以建立一個視窗專用的新引數清單,請參閱 :arglocal
您可以使用下列指令以及運算式函數 argc()argv() 來使用引數清單。這些都適用於目前視窗的引數清單。
:ar :arg :args :ar[gs]:列印引數清單,並以方括號括住目前的檔案。
:ar[gs] [++opt] [+cmd] {arglist} :args_f
{arglist} 定義為新的引數清單,並編輯第一個引數。當變更已完成且 Vim 不想要捨棄目前的緩衝區時,這會失敗。另請參閱 ++opt+cmd
:ar[gs]! [++opt] [+cmd] {arglist} :args_f!
{arglist} 定義為新的引數清單,並編輯第一個引數。捨棄對目前緩衝區的所有變更。另請參閱 ++opt+cmd
:[count]arge[dit][!] [++opt] [+cmd] {name} .. :arge :argedit{name} 新增至引數清單並編輯它。不會檢查重複項目,您可以將一個檔案新增至引數清單兩次 :argded。這類似於使用 :argadd,然後使用 :edit (除了 :edit 不會變更引數清單,因此引數清單指標不會變更的小例外)。檔案名稱中的空格必須使用 "\" 跳脫。[count] 的用法與 :argadd 相同。如果目前的檔案無法被捨棄,則 {name} 仍會新增至引數清單,但不會被編輯。不會檢查重複項目。另請參閱 ++opt+cmd
:[count]arga[dd] {name} .. :arga :argadd E479 :[count]arga[dd] E1156
{name} 新增至引數清單。如果省略 {name},則將目前緩衝區名稱新增至引數清單。如果省略 [count],則 {name} 會新增在引數清單中目前項目的正後方。否則,它們會新增在第 [count] 個檔案之後。如果引數清單為「a b c」,且「b」是目前的引數,則這些指令會導致
指令新引數清單
:argadd x a [b] x c :0argadd x x a [b] c :1argadd x a x [b] c :$argadd x a [b] c x 且在最後一個指令之後: :+2argadd y a [b] c x y 不會檢查重複項目,您可以將一個檔案新增至引數清單兩次。您可以使用 :argdedupe 來稍後修正它
:argadd *.txt | argdedupe
目前編輯的檔案不會變更。注意:您也可以使用此方法
:args ## x
這會新增「x」項目並排序新的清單。
:argded[upe] :argded :argdedupe 從引數清單中移除重複的檔案名稱。如果目前的檔案是重複的,則目前的檔案將變更為原始的檔案索引。
:argd[elete] {pattern} .. :argd :argdelete E480 E610 從引數清單中刪除符合 {pattern} 的檔案。{pattern} 的用法類似檔案模式,請參閱 file-pattern。「%」可用於刪除目前項目。此指令會保留目前編輯的檔案,即使它已從引數清單中刪除。範例
:argdel *.obj
:[range]argd[elete]:從引數清單中刪除 [range] 檔案。範例
:10,$argdel
刪除引數 10 和之後的引數,保留 1-9。
:$argd
只刪除最後一個。
:argd
:.argd
刪除目前的引數。
:%argd
從引數清單中移除所有檔案。當範圍中的最後一個數字太高時,會刪除到最後一個引數。
:argu :argument :[count]argu[ment] [count] [++opt] [+cmd] 編輯參數列表中的第 [count] 個檔案。若省略 [count],則使用目前項目。當變更已發生且 Vim 不想捨棄目前的緩衝區時,此命令會失敗。另請參閱 ++opt+cmd
:[count]argu[ment]! [count] [++opt] [+cmd] 編輯參數列表中的第 [count] 個檔案,並捨棄目前緩衝區的所有變更。若省略 [count],則使用目前項目。另請參閱 ++opt+cmd
:[count]n[ext] [++opt] [+cmd] :n :ne :next ]a E165 E163 編輯下一個第 [count] 個檔案。當變更已發生且 Vim 不想捨棄目前的緩衝區時,此命令會失敗。另請參閱 ++opt+cmd
:[count]n[ext]! [++opt] [+cmd] 編輯下一個第 [count] 個檔案,並捨棄緩衝區的所有變更。另請參閱 ++opt+cmd
:n[ext] [++opt] [+cmd] {arglist} :next_f
:args_f 相同。
:n[ext]! [++opt] [+cmd] {arglist}:args_f! 相同。
:[count]N[ext] [count] [++opt] [+cmd] :Next :N E164 編輯參數列表中前一個第 [count] 個檔案。當變更已發生且 Vim 不想捨棄目前的緩衝區時,此命令會失敗。另請參閱 ++opt+cmd
:[count]N[ext]! [count] [++opt] [+cmd] 編輯參數列表中前一個第 [count] 個檔案。並捨棄緩衝區的所有變更。另請參閱 ++opt+cmd
:[count]prev[ious] [count] [++opt] [+cmd] :prev :previous [a 與 :Next 相同。另請參閱 ++opt+cmd
:rew :rewind [A :rew[ind] [++opt] [+cmd] 開始編輯參數列表中的第一個檔案。當變更已發生且 Vim 不想捨棄目前的緩衝區時,此命令會失敗。另請參閱 ++opt+cmd
:rew[ind]! [++opt] [+cmd] 開始編輯參數列表中的第一個檔案。並捨棄緩衝區的所有變更。另請參閱 ++opt+cmd
:fir :first :fir[st][!] [++opt] [+cmd] ":rewind" 的另一個名稱。
:la :last ]A :la[st] [++opt] [+cmd] 開始編輯參數列表中的最後一個檔案。當變更已發生且 Vim 不想捨棄目前的緩衝區時,此命令會失敗。另請參閱 ++opt+cmd
:la[st]! [++opt] [+cmd] 開始編輯參數列表中的最後一個檔案。並捨棄緩衝區的所有變更。另請參閱 ++opt+cmd
:wn :wnext :[count]wn[ext] [++opt] 寫入目前檔案並開始編輯下一個第 [count] 個檔案。另請參閱 ++opt+cmd
:[count]wn[ext] [++opt] {file} 將目前檔案寫入 {file} 並開始編輯下一個第 [count] 個檔案,除非 {file} 已存在且 'writeany' 選項已關閉。另請參閱 ++opt+cmd
:[count]wn[ext]! [++opt] {file} 將目前檔案寫入 {file} 並開始編輯下一個第 [count] 個檔案。另請參閱 ++opt+cmd
:[count]wN[ext][!] [++opt] [file] :wN :wNext :[count]wp[revious][!] [++opt] [file] :wp :wprevious 與 :wnext 相同,但改為前往上一個檔案而非下一個檔案。
上述命令中的 [count] 預設為一。某些命令可以使用兩個計數。最後一個(最右邊的那個)會被使用。
如果沒有 [+cmd] 參數,則游標會定位到該檔案的最後已知游標位置。如果設定了 'startofline',則游標會定位到該行中的第一個非空白字元,否則會使用最後已知的列。如果沒有最後已知的游標位置,則游標將位於第一行(Ex 模式中的最後一行)。
{arglist}
參數列表中的萬用字元會被展開,並且檔案名稱會被排序。因此,您可以使用命令 vim *.c 來編輯所有 C 檔案。在 Vim 中,命令 :n *.c 會執行相同的操作。
空白字元用於分隔檔案名稱。在空格或 Tab 前面放置反斜線,以將其包含在檔案名稱中。例如,要編輯單個檔案 "foo bar"
:next foo\ bar
在 Unix 和其他一些系統上,您也可以使用反引號,例如
:next `find . -name \\*.c -print`
星號前的反斜線是必要的,以防止 "*.c" 在執行 find 程式之前被 Shell 展開。
arglist-position
當有一個參數列表時,您可以在視窗標題中看到您正在編輯的檔案(如果有的話且 'title' 已開啟)以及您使用 "CTRL-G" 命令取得的檔案訊息。您將會看到類似 (4 of 11) 的內容。如果您實際上並未編輯參數列表中目前位置的檔案,則會顯示 ((4) of 11)。這表示您在參數列表中的位置為 4,但未編輯參數列表中的第四個檔案。當您執行 ":e file" 時,會發生這種情況。

本機參數列表

:arglocal
:argl[ocal] 建立全域參數列表的本機副本。不會開始編輯另一個檔案。
:argl[ocal][!] [++opt] [+cmd] {arglist} 定義新的參數列表,該列表是目前視窗的本機列表。否則與 :args_f 的行為相同。
:argglobal
:argg[lobal] 將全域參數列表用於目前視窗。不會開始編輯另一個檔案。
:argg[lobal][!] [++opt] [+cmd] {arglist} 將全域參數列表用於目前視窗。定義新的全域參數列表,如 :args_f 一樣。所有使用全域參數列表的視窗都會看到這個新的列表。
可以有多個參數列表。它們可以在視窗之間共享。當它們被共享時,在一個視窗中變更參數列表也會在另一個視窗中變更它。
當視窗被分割時,新的視窗會繼承目前視窗的參數列表。然後,這兩個視窗會共享此列表,直到其中一個視窗使用 :arglocal:argglobal 來使用另一個參數列表。

使用參數列表

:argdo
:[range]argdo[!] {cmd} 對於參數列表中的每個檔案,或如果指定了 [range],則僅對該範圍內的參數執行 {cmd}。它的作用類似於執行以下操作
:rewind
:{cmd}
:next
:{cmd}
etc.
當無法捨棄目前檔案且未出現 [!] 時,命令會失敗。當在一個檔案上偵測到錯誤時,將不會存取參數列表中的其他檔案。參數列表中的最後一個檔案(或發生錯誤的檔案)會成為目前檔案。{cmd} 可以包含 '|' 以串連多個命令。{cmd} 不得變更參數列表。注意:在執行此命令時,Syntax autocommand 事件會透過將其新增至 'eventignore' 來停用。這會大幅加快編輯每個檔案的速度。另請參閱 :windo:tabdo:bufdo:cdo:ldo:cfdo:lfdo
範例
:args *.c
:argdo set ff=unix | update
這會將 'fileformat' 選項設定為 "unix",如果檔案現在已變更,則寫入該檔案。這是對所有 *.c 檔案執行的。
範例
:args *.[ch]
:argdo %s/\<my_foo\>/My_Foo/ge | update
這會將所有 "*.c" 和 "*.h" 檔案中的單字 "my_foo" 變更為 "My_Foo"。":substitute" 命令使用 "e" 旗標,以避免在未使用 "my_foo" 的檔案中發生錯誤。":update" 僅在進行變更時寫入檔案。

4. 寫入 writing save-file

注意:'write' 選項關閉時,您將無法寫入任何檔案。
:w :write E502 E503 E504 E505 E512 E514 E667 E949 :w[rite] [++opt] 將整個緩衝區寫入目前檔案。這是將變更儲存到檔案的正常方式。當設定了 'readonly' 或因為其他原因而無法寫入檔案時,此命令會失敗,例如當父目錄不存在時(使用 ++p 以避免這種情況)。如需 ++opt,請參閱 ++opt,但只有 ++p、++bin、++nobin、++ff 和 ++enc 是有效的。
:w[rite]! [++opt] 與 ":write" 類似,但在設定了 'readonly' 或有其他原因導致寫入被拒絕時強制寫入。注意:這可能會變更檔案的權限和所有權,並破壞(符號)連結。將 'W' 旗標新增至 'cpoptions' 以避免這種情況。
:[range]w[rite][!] [++opt] 將指定的行寫入目前檔案。這是不尋常的,因為檔案不會包含緩衝區中的所有行。
:w_f :write_f :[range]w[rite] [++opt] {file} 將指定的行寫入 {file},除非它已存在且 'writeany' 選項關閉。
:w!
:[range]w[rite]! [++opt] {file} 將指定的行寫入 {file}。覆寫現有檔案。
:w_a :write_a E494 :[range]w[rite][!] [++opt] >
Append the specified lines to the current file.
:[range]w[rite][!] [++opt] >> {file} 將指定的行附加到 {file}。「!」會強制寫入,即使檔案不存在。
:w_c :write_c :[範圍]w[rite] [++選項] !{cmd} 使用 [範圍] 行作為標準輸入執行 {cmd} (請注意 '!' 前面的空格)。{cmd} 的執行方式與 ":!{cmd}" 相同,任何 '!' 都會被替換為先前的命令 :!
":w" 命令的預設 [範圍] 是整個緩衝區 (1,$)。如果您寫入整個緩衝區,則不再視為已變更。當您使用 ":w 某些檔案" 將其寫入不同的檔案時,則取決於 'cpoptions' 中的 "+" 標誌。當包含此標誌時,即使緩衝區本身可能仍與其檔案不同,寫入命令也會重置 'modified' 標誌。
如果使用 ":w" 給定檔案名稱,則該名稱會成為替代檔案。例如,當寫入失敗且您想要稍後使用 ":w #" 再次嘗試時,可以使用此功能。可以通過從 'cpoptions' 選項中移除 'A' 標誌來關閉此功能。
請注意,'fsync' 選項在這裡很重要。如果設定了此選項,可能會使寫入速度變慢(但更安全)。
:sav :saveas :sav[eas][!] [++選項] {檔案}{檔案} 的名稱儲存目前的緩衝區,並將目前的緩衝區的檔案名稱設定為 {檔案}。先前的名稱用於替代檔案名稱。需要 [!] 來覆寫現有的檔案。當 'filetype' 為空時,會在寫入檔案之前使用新名稱執行檔案類型偵測。當寫入成功時,'readonly' 會被重置。
:up :update :[範圍]up[date][!] [++選項] [>>] [檔案] 類似於 ":write",但僅在緩衝區已修改時寫入。

使用多個緩衝區寫入 buffer-write

:wa :wall :wa[ll] 寫入所有已變更的緩衝區。沒有檔案名稱的緩衝區會導致錯誤訊息。唯讀緩衝區不會被寫入。
:wa[ll]! 寫入所有已變更的緩衝區,甚至是唯讀的緩衝區。沒有檔案名稱的緩衝區不會被寫入,並導致錯誤訊息。
如果您嘗試覆寫在其他地方已變更的檔案(除非使用了 "!"),Vim 會警告您。請參閱 時間戳記
backup E207 E506 E507 E508 E509 E510 如果您寫入現有檔案(但不附加),同時 'backup''writebackup''patchmode' 選項開啟,則會建立原始檔案的備份。檔案會被複製或重新命名(請參閱 'backupcopy')。在檔案成功寫入之後,且當 'writebackup' 選項開啟而 'backup' 選項關閉時,備份檔案會被刪除。當 'patchmode' 選項開啟時,備份檔案可能會被重新命名。
備份表
關閉 關閉 不製作備份 關閉 開啟 備份目前的檔案,然後刪除(預設) 開啟 關閉 刪除舊備份,備份目前的檔案 開啟 開啟 刪除舊備份,備份目前的檔案
'backupskip' 模式符合要寫入的檔案名稱時,不會建立備份檔案。屆時將會忽略 'backup''writebackup' 的值。
'backup' 選項開啟時,舊的備份檔案(與新備份檔案的名稱相同)將被刪除。如果未設定 'backup',但設定了 'writebackup',則現有的備份檔案將不會被刪除。在寫入檔案時建立的備份檔案將會有不同的名稱。
在某些檔案系統上,可能會發生在當機時,您會遺失備份和新寫入的檔案(它可能存在,但包含虛假數據)。在這種情況下,請嘗試還原,因為交換檔案已同步到磁碟,並且可能仍然存在。 :recover
使用 'backupdir' 選項給定的目錄用於放置備份檔案。(預設:與寫入檔案相同的目錄)。
備份是成為原始檔案的副本的新檔案,還是重新命名的原始檔案,取決於 'backupcopy' 選項。請參閱該選項以了解何時建立副本以及何時重新命名檔案。
如果建立備份檔案失敗,則不會執行寫入。如果您仍然想要寫入,請在命令中加入 '!'。
檔案監看器
當您發現程式在緩衝區寫入時(如 inotify、entr 或 fswatch)有問題,或者當外部應用程式執行 Vim 來編輯檔案(如 git)時,且這些程式似乎沒有注意到原始檔案已變更,您可能需要考慮將 'backupcopy' 選項值切換為 "yes"。這可確保 Vim 寫入那些監看程式所期望的相同檔案,而不會建立新檔案(這會阻止它們偵測到檔案已變更)。另請參閱 crontab
寫入權限
當寫入新檔案時,權限是讀寫權限。對於 Unix,遮罩是 0o666 並額外套用 umask。當寫入已讀取的檔案時,Vim 會保留權限,但會清除 s 位元。
寫入唯讀
'cpoptions' 選項包含 'W' 時,Vim 將拒絕覆寫唯讀檔案。當不存在 'W' 時,如果系統允許(目錄必須是可寫入的),":w!" 將會覆寫唯讀檔案。
寫入失敗
如果新檔案的寫入失敗,您必須小心,不要遺失您的變更以及原始檔案。如果沒有備份檔案,且新檔案的寫入失敗,您已經遺失了原始檔案!在您寫出檔案之前,請勿結束 VIM!如果建立了備份,則會將其放回原始檔案的位置(如果可能)。如果您結束 Vim,並且遺失了所做的變更,則原始檔案大多仍然存在。如果放回原始檔案失敗,則會出現錯誤訊息,告訴您您遺失了原始檔案。
DOS 格式寫入
如果 'fileformat' 是 "dos",則 <CR><NL> 用於 <EOL>。這是 Windows 的預設值。在其他系統上,會顯示訊息 "[dos]",以提醒您使用了不常見的 <EOL>Unix 格式寫入
如果 'fileformat' 是 "unix",則 <NL> 用於 <EOL>。在 Windows 上,會顯示訊息 "[unix]"。 Mac 格式寫入
如果 'fileformat' 是 "mac",則 <CR> 用於 <EOL>。會顯示訊息 "[mac]"。
另請參閱 檔案格式'fileformat''fileformats' 選項。
ACL
ACL 代表存取控制列表。這是一種控制檔案存取權限的進階方式。它用於新的 MS-Windows 和 Unix 系統上,但僅在檔案系統支援時才會使用。Vim 會嘗試在寫入檔案時保留 ACL 資訊。備份檔案將會取得原始檔案的 ACL 資訊。ACL 資訊也用於檢查檔案是否為唯讀(當開啟檔案時)。
xattr E1506 E1508 E1509 xattr 代表擴展屬性。這是一種將中繼資料與檔案一起儲存在檔案系統中的進階方式。它取決於所使用的實際檔案系統,並且 Vim 僅在 Linux 系統上支援它。Vim 會嘗試在寫入檔案時保留擴展屬性資訊。備份檔案將會取得原始檔案的擴展屬性。
唯讀共享
當 MS-Windows 在網路上共享磁碟機時,它可以標記為唯讀。這表示即使檔案唯讀屬性不存在,且 NT 網路共享磁碟機上的 ACL 設定允許寫入檔案,您仍然無法寫入檔案。Win32 平台上的 Vim 將會偵測唯讀網路磁碟機,並將檔案標記為唯讀。您將無法使用 :write 覆寫它。
寫入裝置
當檔案名稱實際上是裝置名稱時,Vim 不會建立備份(這是不可能的)。您需要使用 "!",因為裝置已經存在。Unix 的範例
:w! /dev/lpt0
和 MS-Windows
:w! lpt0
對於 Unix,當名稱未指向一般檔案或目錄時,就會偵測到裝置。fifo 或具名管道對 Vim 而言也看起來像裝置。對於 MS-Windows,裝置是根據其名稱來偵測的:CON CLOCK$ NUL PRN COMn n=1,2,3... 等 LPTn n=1,2,3... 等。名稱可以是大小寫。

5. 寫入並退出 write-quit

:q :quit :q[uit] 關閉目前的視窗。如果這是最後一個 編輯視窗,則關閉 Vim。當已進行變更且 Vim 拒絕 放棄 目前的緩衝區時,以及當引數清單中的最後一個檔案尚未編輯時,此操作會失敗。如果還有其他索引標籤頁,且關閉目前索引標籤頁中的最後一個視窗時,則會關閉目前的索引標籤頁 索引標籤頁。觸發 QuitPre 自動命令事件。如需關閉另一個視窗,請參閱 CTRL-W_q
:conf[irm] q[uit] 關閉,但在已進行變更時,或引數清單中的最後一個檔案尚未編輯時,會給予提示。請參閱 :confirm'confirm'
:q[uit]! 關閉而不寫入,即使目前的緩衝區有變更也一樣。緩衝區會被卸載,即使它已設定 'hidden'。如果這是最後一個視窗,且有修改過的隱藏緩衝區,則會放棄目前的緩衝區,而第一個變更的隱藏緩衝區會成為目前的緩衝區。請使用 ":qall!" 來永遠結束。
:cq[uit] 永遠關閉,不寫入,並傳回錯誤碼。請參閱 :cq
:wq
:wq [++選項] 寫入目前的檔案並關閉視窗。如果這是最後一個 編輯視窗,則 Vim 會關閉。當檔案為唯讀或緩衝區沒有名稱時,寫入會失敗。當引數清單中的最後一個檔案尚未編輯時,關閉會失敗。
:wq! [++選項] 寫入目前的檔案並關閉視窗。如果這是最後一個 編輯視窗,則 Vim 會關閉。當目前的緩衝區沒有名稱時,寫入會失敗。
:wq [++選項] {檔案} 寫入 {檔案} 並關閉視窗。如果這是最後一個 編輯視窗,則 Vim 會關閉。當引數清單中的最後一個檔案尚未編輯時,關閉會失敗。
:wq! [++選項] {檔案} 寫入 {檔案} 並關閉目前的視窗。如果這是最後一個 編輯視窗,則關閉 Vim。
:[範圍]wq[!] [++選項] [檔案] 與上述相同,但僅寫入 [範圍] 中的行。
:x :xit :[範圍]x[it][!] [++選項] [檔案] 類似 ":wq",但僅在變更發生時寫入。當 'hidden' 設定且有多個視窗時,目前的緩衝區在寫入檔案後會變成隱藏狀態。
:exi :exit :[範圍]exi[t][!] [++選項] [檔案] 與 :xit 相同。
ZZ
ZZ 寫入目前檔案(如果已修改)並關閉目前的視窗(與 ":x" 相同)。如果目前檔案有多個視窗,則只關閉目前的視窗。
ZQ
ZQ 不檢查變更即退出(與 ":q!" 相同)。

多重視窗與緩衝區 window-exit

:qa :qall :qa[ll] 除非有些緩衝區已變更,否則退出 Vim。(使用 ":bmod" 跳至下一個已修改的緩衝區)。當 'autowriteall' 設定時,所有已變更的緩衝區都會寫入,如同 :wqall
:conf[irm] qa[ll] 退出 Vim。當某些緩衝區已變更時,會出現提示。請參閱 :confirm
:qa[ll]! 退出 Vim。對緩衝區的任何變更都會遺失。另請參閱 :cquit,它執行相同操作,但以非零值退出。
:quita :quitall :quita[ll][!] 與 ":qall" 相同。
:wqa[ll] [++選項] :wqa :wqall :xa :xall :xa[ll] 寫入所有已變更的緩衝區並退出 Vim。如果存在沒有檔案名稱、唯讀或因其他原因無法寫入的緩衝區,Vim 將不會退出。
:conf[irm] wqa[ll] [++選項] :conf[irm] xa[ll] 寫入所有已變更的緩衝區並退出 Vim。當某些緩衝區為唯讀或因其他原因無法寫入時,會出現提示。請參閱 :confirm
:wqa[ll]! [++選項] :xa[ll]! 寫入所有已變更的緩衝區,即使是唯讀的緩衝區,並退出 Vim。如果存在沒有檔案名稱或因其他原因無法寫入的緩衝區,Vim 將不會退出。

6. 對話方塊 edit-dialogs

:confirm :conf :conf[irm] {command} 執行 {command},當需要確認操作時,會使用對話方塊。可於 :edit:q:qa:w 指令上使用(後者會覆寫唯讀設定),以及任何可能因未儲存的變更而失敗的指令,例如 :only:buffer:bdelete 等。
範例
:confirm w foo
當 "foo" 已存在時,會要求確認。
:confirm q
當有變更時,會要求確認。
:confirm qa
如果存在任何已修改、未儲存的緩衝區,系統會提示您儲存或放棄每個緩衝區。還有「全部儲存」或「全部放棄」的選項。
如果您想始終使用 ":confirm",請設定 'confirm' 選項。
:browse :bro E338 E614 E615 E616 :bro[wse] {command}{command} 的引數開啟檔案選取對話方塊。目前此功能適用於 :e:w:wall:wq:wqall:x:xall:exit:view:sview:r:saveas:sp:mkexrc:mkvimrc:mksession:mkview:split:vsplit:tabe:tabnew:cfile:cgetfile:caddfile:lfile:lgetfile:laddfile:diffsplit:diffpatch:pedit:redir:source:update:visual:vsplit:qall(如果 'confirm' 已設定)。注意:僅在 Win32 GUI 中;在主控台中,如果 FileExplorer 自動指令群組存在,則 `:browse edit` 可運作。當 ":browse" 不可用時,您會收到錯誤訊息。如果 {command} 不支援瀏覽,則會執行 {command} 而不顯示對話方塊。":browse set" 的運作方式與 :options 相同。另請參閱 :oldfiles 的 ":browse oldfiles"。
透過一些範例,可以最好地說明語法
:browse e $vim/foo
在 $vim/foo 目錄中開啟瀏覽器,並編輯選擇的檔案。
:browse e
'browsedir' 指定的目錄中開啟瀏覽器,並編輯選擇的檔案。
:browse w
在目前緩衝區的目錄中開啟瀏覽器,並將目前緩衝區的檔案名稱作為預設值,然後將緩衝區儲存為所選的檔案名稱。
:browse w C:/bar
在 C:/bar 目錄中開啟瀏覽器,並將目前緩衝區的檔案名稱作為預設值,然後將緩衝區儲存為所選的檔案名稱。另請參閱 'browsedir' 選項。對於不支援瀏覽的 Vim 版本,該指令會以未修改的方式執行。
browsefilter
對於 MS-Windows,您可以修改瀏覽對話方塊中使用的篩選器。透過設定 g:browsefilter 或 b:browsefilter 變數,您可以全域或本機地變更緩衝區的篩選器。該變數設定為 "{篩選器標籤}\t{樣式};{樣式}\n" 格式的字串,其中 "{篩選器標籤}" 是出現在 "檔案類型" 下拉式方塊中的文字,而 {樣式} 是篩選檔案名稱的樣式。可以指定多個樣式,並以 ';' 分隔。
例如,若要在對話方塊中只顯示 Vim 檔案,您可以使用下列指令
let g:browsefilter = "Vim scripts\t*.vim\nVim Startup Files\t*vimrc\n"
您可以透過設定 b:browsefilter 變數,在每個緩衝區的基礎上覆寫篩選器設定。您最有可能在檔案類型外掛程式中設定 b:browsefilter,以便瀏覽對話方塊包含與您目前編輯的檔案類型相關的項目。缺點:這使得開始編輯不同類型的檔案變得困難。為了克服這一點,您可能希望在 Windows 上將 "所有檔案(.)\t*\n" 作為最終篩選器,或在其他平台上將 "所有檔案()\t\n" 作為最終篩選器,以便使用者仍然可以存取任何想要的檔案。
若要避免在 Vim 實際上不支援瀏覽篩選器時設定瀏覽篩選器,您可以使用 has("browsefilter")
if has("browsefilter")
   let g:browsefilter = "whatever"
endif

7. 目前目錄 current-directory

您可以使用 :cd:tcd:lcd 來變更為另一個目錄,這樣您就不必在檔案名稱前面輸入該目錄名稱。對於執行外部指令(例如 ":!ls" 或 ":te ls")也有影響。
有三個目前目錄「範圍」:全域、索引標籤和視窗。視窗本機工作目錄的優先順序高於索引標籤本機工作目錄,而索引標籤本機工作目錄的優先順序又高於全域工作目錄。如果不存在本機工作目錄(索引標籤或視窗),則會套用階層中的下一個較高範圍。
:cd E747 E472 :cd[!] 在非 Unix 系統上,當 'cdhome' 關閉時:列印目前的目錄名稱。否則:將目前的目錄變更為主目錄。清除任何視窗本機目錄。在所有系統上使用 :pwd 來列印目前的目錄。
:cd[!] {path} 將目前的目錄變更為 {path}。如果 {path} 是相對路徑,則會在 'cdpath' 中列出的目錄中搜尋。清除任何視窗本機目錄。不會變更已開啟檔案的含義,因為會記住其完整路徑名稱。不過,來自 arglist 的檔案可能會變更!在 MS-Windows 上,這也會變更活動磁碟機。若要變更為目前檔案的目錄
:cd %:h
:cd- E186 :cd[!] - 變更為上一個目前的目錄(在之前的 ":cd {path}" 指令之前)。
:chd :chdir :chd[ir][!] [path] 與 :cd 相同。
:tc :tcd :tc[d][!] {path}:cd 類似,但僅設定目前索引標籤的目錄。目前視窗也會使用此目錄。其他索引標籤中的視窗以及目前索引標籤中具有其自身視窗本機目錄的視窗,其目前的目錄不會變更。
:tcd-
:tc[d][!] - 變更為上一個目前的目錄(在之前的 ":tcd {path}" 指令之前)。
:tch :tchdir :tch[dir][!] 與 :tcd 相同。
:lc :lcd :lc[d][!] {path}:cd 類似,但僅設定目前視窗的目前目錄。其他視窗或索引標籤的目前目錄不會變更。
:lch :lchdir :lch[dir][!] 與 :lcd 相同。
:lcd-
:lc[d][!] - 變更為上一個目前的目錄(在之前的 ":lcd {path}" 指令之前)。
:pw :pwd E187 :pw[d] 列印目前的目錄名稱。另請參閱 getcwd():pwd-verbose
'verbose' 非零時,:pwd 也會顯示設定目前目錄的範圍。範例
" Set by :cd
:verbose pwd
[global] /path/to/current
" Set by :lcd
:verbose pwd
[window] /path/to/current
" Set by :tcd
:verbose pwd
[tabpage] /path/to/current
只要未使用 :lcd:tcd 指令,所有視窗都會共用相同的目前目錄。使用指令跳至另一個視窗不會對目前目錄產生任何變更。
當已對視窗使用 :lcd 時,指定的目錄會成為該視窗的目前目錄。未使用 :lcd 指令的視窗會保留全域或索引標籤本機目錄。當跳至另一個視窗時,目前的目錄會變更為上次指定的本機目前目錄。如果沒有指定,則會使用全域或索引標籤本機目錄。當建立新視窗時,它會繼承目前視窗的本機目錄。
當變更索引標籤時,也會套用相同的行為。如果目前的索引標籤沒有本機工作目錄,則會使用全域工作目錄。
當使用 :cd 指令時,目前的視窗和標籤頁會失去它們的本機目前目錄,並從現在開始使用全域目前目錄。當使用 :tcd 指令時,只有目前的視窗會失去它的本機工作目錄。
在使用 :cd 之後,將會使用完整路徑名稱來讀取和寫入檔案。在某些網路檔案系統上,這可能會導致問題。使用完整路徑名稱的結果是,目前正在使用的檔案名稱將繼續參照相同的檔案。範例:如果你有一個檔案 a:test 和一個目錄 a:vim,指令 ":e test"、":cd vim"、":w" 會覆寫檔案 a:test,而不是寫入 a:vim/test。但是如果你執行 ":w test",則會寫入檔案 a:vim/test,因為你給了一個新的檔案名稱,並且沒有參照在 ":cd" 之前的檔案名稱。

8. 編輯二進位檔案 edit-binary

雖然 Vim 是為了編輯文字檔案而設計的,但它也可以編輯二進位檔案。-b Vim 引數(b 代表二進位)會使 Vim 以二進位模式執行檔案 I/O,並設定一些用於編輯二進位檔案的選項('binary' 開啟、'textwidth' 設為 0、'modeline' 關閉、'expandtab' 關閉)。設定 'binary' 選項具有相同的效果。請記得在讀取檔案之前執行此操作。
編輯二進位檔案時,有幾件事需要記住
當編輯可執行檔案時,位元組數不得變更。僅使用 "R" 或 "r" 指令來變更文字。不要使用 "x" 或退格鍵刪除字元。
'textwidth' 選項設為 0。否則,行會意外地被分割成兩部分。
當沒有很多 <EOL> 時,行會變得非常長。如果你想要編輯一個螢幕上放不下的行,請重設 'wrap' 選項。這時會使用水平捲動。如果一行變得太長(請參閱 limits),則你無法編輯該行。在讀取檔案時,該行將被分割。當讀取檔案時,你也可能收到「記憶體不足」的錯誤。
請確保在載入檔案之前設定 'binary' 選項。否則,<CR><NL><NL> 都會被視為行的結尾,並且在寫入檔案時,<NL> 將被替換為 <CR><NL>
<Nul> 字元在螢幕上顯示為 ^@。你可以使用 "CTRL-V CTRL-@" 或 "CTRL-V 000" 輸入它們。
若要將 <NL> 字元插入檔案中,請分割一行。當將緩衝區寫入檔案時,將會為 <EOL> 寫入 <NL>
如果檔案結尾沒有 <EOL>,Vim 通常會在檔案結尾附加一個 <EOL>。設定 'binary' 選項可以防止這種情況發生。如果你想要新增最後的 <EOL>,請設定 'endofline' 選項。你也可以讀取此選項的值,以查看最後一行是否有 <EOL>(你在文字中看不到)。

9. 加密 encryption

10. 時間戳記 timestamp timestamps

當你開始編輯檔案時,Vim 會記住檔案的修改時間戳記、模式和大小。這用於避免你有同一個檔案的兩個不同版本(在不知情的情況下)。
在執行 shell 命令後(:!cmdsuspend:read!K),會比較視窗中所有緩衝區的時間戳記、檔案模式和檔案大小。Vim 將執行任何相關的 FileChangedShell 自動指令,或針對任何已變更的檔案顯示警告。在 GUI 中,當 Vim 重新取得輸入焦點時,會發生這種情況。
E321 E462 如果你想要在檔案於 Vim 外部變更時自動重新載入檔案,請設定 'autoread' 選項。不過,這在寫入檔案的同時不起作用,只會在檔案沒有在 Vim 內部變更時起作用。ignore-timestamp
如果你不想要被詢問或自動重新載入檔案,你可以使用此設定
set buftype=nofile
或者,當從 shell 啟動 gvim 時
gvim file.log -c "set buftype=nofile"
請注意,如果定義了 FileChangedShell 自動指令,你將不會收到警告訊息或提示。預期自動指令會處理此情況。
對於目錄(例如,使用 netrw-browse),沒有警告。但是,如果你開始編輯一個新檔案,而它稍後被建立為目錄,則你會收到警告。
當 Vim 注意到檔案的時間戳記已變更,並且該檔案正在緩衝區中編輯但尚未變更時,Vim 會檢查檔案的內容是否相等。這是透過再次讀取檔案(到一個隱藏的緩衝區,然後立即再次刪除)並比較文字來完成的。如果文字相等,你將不會收到警告。
如果你沒有經常收到警告,你可以使用以下指令。
:checkt :checktime :checkt[ime] 檢查是否有任何緩衝區在 Vim 外部變更。這會檢查並警告你是否會得到同一個檔案的兩個版本。如果這是從自動指令、":global" 指令呼叫或不是手動輸入的,則實際檢查會延遲到副作用(重新載入檔案)無害時才執行。會檢查每個載入的緩衝區是否相關檔案已變更。如果檔案已變更,Vim 將會採取行動。如果緩衝區中沒有變更,並且設定了 'autoread',則會重新載入緩衝區。否則,你會被詢問是否要重新載入檔案。如果檔案已被刪除,你會收到錯誤訊息。如果檔案先前不存在,則如果它現在存在,你會收到警告。一旦檢查完檔案,時間戳記就會重設,你將不會再次收到警告。語法強調、標記、差異狀態、'fileencoding''fileformat''binary' 選項不會變更。請參閱 v:fcs_choice 以便也重新載入這些選項(例如,如果程式碼格式工具已變更檔案)。
:[N]checkt[ime] {filename} :[N]checkt[ime] [N] 檢查特定緩衝區的時間戳記。緩衝區可以使用名稱、數字或模式指定。
E813 E814 如果你選擇這麼做,Vim 將會重新載入緩衝區。如果一個視窗可見,且其中包含此緩衝區,則重新載入將在此視窗的內容中發生。否則,將使用特殊視窗,以便大多數自動指令都能運作。你無法關閉此視窗。還有一些其他限制。最好確保在目前緩衝區之外不會發生任何事情。例如,設定視窗本機選項可能會在錯誤的視窗中結束。分割視窗、在那裡執行一些操作並關閉它應該可以(如果其他自動指令沒有副作用)。關閉不相關的視窗和緩衝區會讓你陷入麻煩。
在寫入檔案之前,會檢查時間戳記(除非使用了 "!")。如果它已變更,Vim 會詢問你是否真的想要覆寫檔案
警告: 檔案自讀取以來已變更!!!你真的想要寫入它嗎 (y/n)?
如果你按下 'y',Vim 將繼續寫入檔案。如果你按下 'n',則寫入將會中止。如果你使用 ":wq" 或 "ZZ",Vim 將不會退出,你將有另一個機會寫入檔案。
此訊息通常表示某人在編輯工作階段開始後寫入該檔案。這可能是另一個人,在這種情況下,你可能需要檢查你對檔案的變更以及其他人的變更是否應該合併。以另一個名稱寫入檔案並檢查差異(可以使用 "diff" 程式來執行此操作)。
你也可能從另一個編輯工作階段或使用另一個指令(例如,篩選指令)修改了檔案。然後你會知道你想要保留檔案的哪個版本。
時間檢查的精確度取決於檔案系統。在 Unix 上,它通常是次秒級的。使用舊檔案系統和在 MS-Windows 上,它通常是一秒。使用 has('nanotime') 來檢查是否有次秒時間戳記檢查可用。
在一個情況下,你會收到訊息但沒有任何問題:在 Win32 系統上,夏令時間開始的那一天。Win32 程式庫中有些東西會讓 Vim 對於小時時差感到困惑。這個問題會在隔天消失。

11. 檔案搜尋 file-searching

檔案搜尋目前用於 'path''cdpath''tags' 選項,以及 finddir()findfile()。其他指令使用 萬用字元,這略有不同。
有三種不同類型的搜尋
1) 向下搜尋:starstar
向下搜尋使用萬用字元 "*"、"**" 以及你的作業系統可能支援的其他萬用字元。"*" 和 "**" 在 Vim 內部處理,因此它們可在所有作業系統上運作。請注意,"**" 只有在名稱開頭時才會作為特殊萬用字元。
"*" 的用法非常簡單:它會比對 0 個或多個字元。在搜尋模式中,這會是 ".*"。請注意,"." 不用於檔案搜尋。
"**" 比較複雜
它只會比對目錄。
預設情況下,它最多會比對 30 層目錄深度,因此你可以使用它來搜尋整個目錄樹
比對的最大層級數可以透過在 "**" 後面附加數字來給定。因此 '/usr/**2' 可以比對
/usr
/usr/include
/usr/include/sys
/usr/include/g++
/usr/lib
/usr/lib/X11
....
它不符合 '/usr/include/g++/std',因為這會是三層。允許的數字範圍是 0 (「**0」被移除) 到 100。如果給定的數字小於 0,則預設為 30;如果大於 100,則使用 100。系統對路徑長度也有一個限制,通常是 256 或 1024 位元組。
「**」只能在路徑的末尾,或是後面跟著路徑分隔符號,或是跟著一個數字和一個路徑分隔符號。
你可以以任何順序組合使用「*」和「**」。
/usr/**/sys/*
/usr/*tory/sys/**
/usr/**2/sys/*
2) 向上搜尋:在這裡你可以給定一個目錄,然後向上搜尋目錄樹以尋找檔案。你可以給定停止目錄來限制向上搜尋。停止目錄會附加到路徑(對於 'path' 選項)或檔案名稱(對於 'tags' 選項),並以「;」分隔。如果你想要多個停止目錄,請用「;」分隔。如果你不想要停止目錄(「向上搜尋直到根目錄」),則只需使用「;」。
/usr/include/sys;/usr
將會搜尋以下位置
/usr/include/sys
/usr/include
/usr
如果你使用相對路徑,則向上搜尋會從 Vim 的當前目錄或當前檔案的目錄開始(如果相對路徑以 './' 開始,且 'd' 未包含在 'cpoptions' 中)。
如果 Vim 的當前路徑是 /u/user_x/work/release,而你執行了
:set path=include;/u/user_x
然後用 gf 搜尋檔案,則會在以下位置搜尋檔案
/u/user_x/work/release/include
/u/user_x/work/include
/u/user_x/include
注意: 如果你的 'path' 設定包含一個不存在的目錄,Vim 會略過該不存在的目錄,如果使用向上搜尋,也不會在該不存在目錄的父目錄中搜尋。
3) 結合向上/向下搜尋:如果 Vim 的當前路徑是 /u/user_x/work/release,而你執行了
set path=**;/u/user_x
然後用 gf 搜尋檔案,則會在以下位置搜尋檔案
/u/user_x/work/release/**
/u/user_x/work/**
/u/user_x/**
請小心!這可能會耗費大量時間,因為搜尋 '/u/user_x/**' 包含 '/u/user_x/work/**' 和 '/u/user_x/work/release/**'。因此,'/u/user_x/work/release/**' 會被搜尋三次,而 '/u/user_x/work/**' 會被搜尋兩次。
在上面的例子中,你可能想要將 path 設定為
:set path=**,/u/user_x/**
這會搜尋
/u/user_x/work/release/**
/u/user_x/**
這會搜尋相同的目錄,但順序不同。
請注意,對於包含 URL 或使用帶有深度限制器(/usr/**2)或向上搜尋(;)表示法的雙星號的 'path' 項目,":find"、":sfind" 和 ":tabfind" 命令的補全目前無法運作。

12. 受信任的檔案 trust

如果啟用了 'exrc',Nvim 會執行檔案系統上找到的任意程式碼。為了防止執行惡意程式碼,只會執行「受信任的檔案」。你可以使用 :trust 命令或 vim.secure.read() 函數將檔案標記為受信任或不受信任。
:trust E5570 :trust [++deny] [++remove] [file]
管理受信任的檔案。如果沒有 ++ 選項,:trust 會將目前緩衝區標記為受信任,並以其內容的雜湊值為索引。信任清單儲存在磁碟上,Nvim 會在重新啟動後重複使用它。
[++deny] 會將 [file](如果沒有 [file],則為目前緩衝區)標記為不受信任:它永遠不會被執行,'exrc' 會忽略它。
[++remove] 會從信任清單中移除 [file](如果沒有 [file],則為目前緩衝區)。當 'exrc'vim.secure.read() 發現該檔案時,會詢問使用者是否信任或拒絕該檔案。
主目錄
命令索引
快速參考