Vim 編輯文件篇
分類
說明
用 Vim 編輯一個文件意味著:
- 把該文件讀到緩衝區
- 用編輯器指令修改緩衝區
- 把緩衝區內容寫回文件
這裡要提醒大家,編輯文件和編輯文本是不一樣的主題,編輯文件主要是操作文件,例如:切換文件,編輯文件等等。編輯文本是操作文件裡面的文本。
啟動多個文件
$ vim file1 file2 ...
使用這個方式可以一次開啟多個文件在同一個 vim 視窗。
關於 vim 開啟的方式,請參考 Vim 開啟篇。
緩衝區特殊符號
%
幫助文件: :help current-file
只要你不保存緩衝區,原來的文件保持不變。如果你開始編輯一個文件 (把它的內容讀到緩衝區裡),該文件名被認作 “當前文件名”,或者說當前緩衝區的名字。命令列上,可以用 “%” 來引用它。
#
幫助文件: :help alternate-file
如果已經有了另一個當前文件名,它會成為輪換文件名稱。命令列上,可以用 “#” 引用它。你也可以用 CTRL-^
命令在當前和替換文件之間切換。
放棄緩衝區
查看幫助: :help abandon
Vim 記住你是否修改了緩衝區。你所作的修改不會不小心丟失。如果試著不寫回而退出,或開始編輯別的文件,Vim 會拒絕。要繞過這重保護,在命令後面加上 !
。這樣,修改就會失去。例如: :q
在緩衝區修改後不會運作,但 :q!
會。
一般
CTRL-G
:f[ile]
顯示目前文件名稱 (如同輸入的那樣,除非使用過 :cd
)、遊標位置 (除非置位了 ruler
選項) 和文件狀態 (唯讀、已修改、讀入錯誤、新文件)。
:f[ile]!
和 :file
類似,但即使 shortmess
要求截短文件名,也不這麼做。
:f[ile][!] {name}
設定目前文件名稱為 {name}
。可選的 !
避免截短訊息。
功能類似複製當前文件,取名為 {name}
。
範例
:file %.backup
備份當前文件,名稱為當前文件後面加.backup
編輯單個文件
:e[dit] [++opt] [+cmd]
編輯當前文件。可用於在它被 Vim 之外的程序所改變的時候重新編輯當前文件。
:e[dit]! [++opt] [+cmd]
總是編輯當前文件。放棄當前緩衝區任何已有的改變。如果你想從頭來過,這就會很有用。
範例
:e!
回到上一次儲存的文件內容,放棄當前緩衝區任何已有的改變。
:e[dit] [++opt] [+cmd] {file}
編輯文件 {file}
。如果當前緩衝區已修改,這會失敗。
範例
:e index.html
編輯 index.html。
:e + file
從最後一行開始編輯 file。
:e +num file
從第 num 行開始編輯 file。
:e #
編輯輪換文件,請參考緩衝區特殊符號。
:e[dit]! [++opt] [+cmd] {file}
總是編輯文件 {file}
。放棄當前緩衝區任何已有的改變。
:e[dit] [++opt] [+cmd] #[count]
編輯第 [count]
個緩衝區 (根據 :files
顯示的結果)。
這個命令和 [count] CTRL-^
一樣,但是 :e #
在輪換緩衝區沒有檔案名稱時不能工作,而 CTRL-^
則可以。
:vi[sual][!] [++opt] [+cmd] [file]
用於 Ex 模式時: 退出 Ex 模式,回到普通模式。否則和 :edit
相同。
:vie[w][!] [++opt] [+cmd] file
用於 Ex 模式時: 退出 Ex 模式,回到普通模式。否則和 :edit
相同,但為本緩衝區置位 readonly
選項。
CTRL-^
編輯輪換文件。
多數情況下,輪換文件就是上次編輯的文件。這是切換兩個文件的一個快速方法。這和 :e #
等價,但也能用在沒有文件名的情況。
[count]gf
編輯遊標之上或之後的文件名稱對應的文件。
查看幫助: :help [+cmd]
[+cmd]
參數可以用來在新開啟的文件定位遊標或執行任何其他命令:
-
+
從最後一行開始。
-
+{num}
從第
{num}
行開始。 -
+/{pat}
從匹配
{pat}
的第一行開始。 -
+{command}
開啟新檔案以後執行
{command}
。
{command}
可以是任何 Ex 指令。
參數列表
如果你在啟動 Vim 的時候給予多個文件名,這些文件將被記住,即參數列表。你可以跳到該列表裡的任何一個文件。
不要把它和 :buffers
命令裡的緩衝區列表混淆。
:ar[gs]
顯示參數列表,目前文件以方括號表示。
可用來顯示 vim 視窗有啟動那些文件。
:ar[gs] [++opt] [+cmd] {arglist}
查看幫助 :help :args_f
定義 {arglist}
為新的參數列表並編輯其中的第一個。如果已經作了修改而 vim 不能放棄目前的緩衝區,則該命令失敗。
:ar[gs]! [++opt] [+cmd] {arglist}
查看幫助 :help :args_f!
定義 {arglist}
為新的參數列表並編輯其中的第一個。忽略任何對目前緩衝區的改動。
:[count]n[ext] [++opt] [+cmd]
編輯向後第 [count]
個文件。如果已經作了修改而 vim 不能放棄 abandon 目前的緩衝區,則該指令失敗。
範例
:n
編輯下一個文件。
:[count]n[ext]! [++opt] [+cmd]
編輯向後第 [count]
個文件。忽略任何對目前緩衝區的已有修改。
範例
:n!
強制編輯下一個文件。
:n[ext] [++opt] [+cmd] {arglist}
和 :args {arglist}
相同。
:n[ext]! [++opt] [+cmd] {arglist}
和 :args! {arglist}
相同。
::[count]N[ext] [count] [++opt] [+cmd]
編輯向前第 [count]
個文件。如果已經作了修改而 vim 不能放棄目前的緩衝區,則該命令失敗。
:[count]N[ext]! [count] [++opt] [+cmd]
編輯向前第 [count]
個文件。忽略任何對目前緩衝區的已有修改。
:[count]prev[ious] [count] [++opt] [+cmd]
和 :Next
相同。
範例
:prev
編輯上一個文件。
:rew[ind] [++opt] [+cmd]
開始編輯參數列表的第一個文件。如果已經作了修改而 vim 不能放棄目前的緩衝區,則該命令失敗。
範例
:rew
編輯第一個文件。
:rew[ind]! [++opt] [+cmd]
開始編輯參數列表的第一個文件。忽略任何對目前緩衝區的已有修改。
:fir[st][!] [++opt] [+cmd]
:rewind
的別名。
:la[st] [++opt] [+cmd]
開始編輯參數列表的最後一個文件。如果已經作了修改而 vim 不能放棄目前的緩衝區,則該命令失敗。
範例:
:last
編輯最後一個文件。
:la[st]! [++opt] [+cmd]
開始編輯參數列表的最後一個文件。忽略任何對目前緩衝區的已有修改。
:[count]wn[ext] [++opt]
寫回目前文件並開始編輯向後第 [count]
個文件。
:[count]wn[ext] [++opt] {file}
寫入目前文件到 {file}
並開始編輯向後第 [count]
個文件。若 {file}
已經存在並且 writeany
選項被關閉,則不寫入。
:[count]wn[ext]! [++opt] {file}
寫入目前文件到 {file}
並開始編輯向後第 [count]
個文件。
:[count]wN[ext][!] [++opt] [file]
:[count]wp[revious][!] [++opt] [file]
和 :wnext
相同,但向前編輯而不是向後。
:wn
系列備註
[count]
預設為1。
寫入
:w[rite] [++opt]
將整個緩衝區寫入目前文件。這是保存文件更動最普通的方式。
如果置位了 readonly
選項或其他原因不能寫入文件,它會失敗。
範例
:w
儲存當前文件
:w[rite]! [++opt]
和 :write
類似,但即使 readonly
已置位或有其他原因寫入被拒絕,還是強制寫入。
注意: 這可能會改變文件的權限和擁有者,或解除 (符號) 連結。
:[range]w[rite][!] [++opt]
將指定的行寫入當前文件。這比較不尋常,因為該文件不會包含緩衝區中的所有行。
:[range]w[rite] [++opt] {file}
將指定行寫入文件 {file}
。
範例
:w {file}
寫入 {file}
文件,不指定 [range]
就代表全寫,就像另存新文件。
:1,10w {file}
將當前緩衝區1~10行,寫入 {file}
文件。
:w %.backup
寫入 file.backup 文件,類似備份文件的作用。
:[range]w[rite]! [++opt] {file}
將指定行寫入文件 {file}
。覆蓋已存在的文件。
範例
:w! {file}
強制將文件寫入到 {file}
,例如:我用 vim 開啟 a 文件 $ vim a
,假設已經存在 b 文件,我可以用 :w! b
寫入到 b 文件。
:[range]w[rite][!] [++opt] >>
將指定行附加到當前文件後。
幫助文件 :help :w_a
:[range]w[rite][!] [++opt] >> {file}
將指定行附加到文件 {file}
之後。!
強制寫入,即使該文件還不存在。
範例
:1,100w >> {file}
將1到100行附加到 {file}
。
:[range]w[rite] [++opt] !{cmd}
執行指令 {cmd}
,以 [range]
指定的行作為它的標準輸入。
範例
:1,3w !sort
將第1行到第3行的內容傳遞給 sort 命令,它會開啟 shell 並輸出排序好的內容。
:w
命令預設的 [range]
是整個緩衝區 (1,$)
。
寫入多個緩衝區
:wa[ll]
儲存所有已修改的緩衝區。沒有文件名稱的緩衝區會報錯誤。只讀的緩衝區不會被寫入。
:wa[ll]!
儲存所有已修改的緩衝區,包括唯讀的。沒有文件名稱的緩衝區不會寫入並報錯誤。
寫入並退出
:q[uit]
退出目前視窗。
如果是最後的一個編輯視窗,就退出 Vim。
如果已經有修改且 Vim 拒絕放棄目前的緩衝區,或者如果參數列表的最後一個文件還沒有被編輯,則該操作失敗。
:q[uit]!
退出不保存,即使當前緩衝區發生了修改。
:wq [++opt]
寫回目前的文件並且關閉視窗。如果是最後的一個編輯視窗,Vim 退出。
如果文件只讀或該緩衝區無名,寫回操作失敗。
如果參數列表的最後一個文件還沒有編輯,則退出操作失敗。
:wq! [++opt]
寫回目前的文件並且關閉視窗。如果是最後的一個編輯視窗,Vim 退出。
如果目前緩衝區無名,則寫回操作失敗。
:wq [++opt] {file}
寫入到 {file}
並且關閉視窗。如果是最後的一個編輯視窗,Vim 退出。
如果參數列表的最後一個文件還沒有編輯,則退出操作失敗。
:wq! [++opt] {file}
寫入到 {file}
並且關閉視窗。如果是最後的一個編輯視窗,Vim 退出。
如果參數列表的最後一個文件還沒有編輯,則退出操作失敗。
:[range]wq[!] [++opt] [file]
同上,但只寫入 [range]
界定的那些行。
:[range]x[it][!] [++opt] [file]
和 :wq
類似,但只有在文件已修改時寫入才會實際進行。
ZZ
如果文件被修改,寫回目前文件。然後關閉目前視窗。(和 :x
相同)。
如果有目前文件有多個視窗,只有目前視窗會被關閉。
ZQ
退出,不檢查是否發生了修改 (同 :q!
)。
:qa[ll]
退出 Vim,除非有修改過的緩衝區。
:qa[ll]!
退出 Vim,不會儲存任何的修改。
:quita[ll][!]
同 :qall
。
:wqa[ll] [++opt]
:xa[ll]
儲存所有修改過的緩衝區並退出 Vim。如果其中有無名的、唯讀的、其他原因寫入失敗的緩衝區,或有仍在執行作業的終端,Vim 不會退出。
:wqa[ll]! [++opt]
:xa[ll]!
儲存所有修改過的緩衝區,甚至包括唯讀的,然後退出 Vim。不過,如果有無名或其他原因寫入失敗的緩衝區,Vim 仍然不會退出。
當前目錄
cd[!]
在非 Unix 系統上且 cdhome
關閉時: 顯示目前目錄名稱。否則,切換目前目錄到主 (home) 目錄。清除任何局部於視窗的目錄。
在所有的系統上,用 :pwd
可以顯示目前目錄。
:cd[!] {path}
切換目前目錄為 {path}
。
:chd[ir][!] [path]
和 :cd
相同。
:pw[d]
顯示目前目錄名稱。
加密
Vim 可用加密的方式寫入文件並讀回。沒有正確的密鑰,加密文本不能被讀取。
:X
提示加密密鑰。輸入時不會反顯輸入的內容。別人即使看到螢幕,也不能看見你的密鑰。輸入的字元保存在 key
選項裡,它的值用來在寫入文件時加密該文件。
若要關閉加密,重設 key
選項為空值:
:set key=
或 :X
不輸入密鑰。
範例
:e path/to/password.txt
編輯 path/to/password.txt,此時是未加密的文件。
:X
輸入加密密鑰
:w
寫入當前文件,並且加密該文件,因上一步有設定加密密鑰。
重新啟動 Vim…
:e path/to/password.txt
編輯 path/to/password.txt,此時會提示輸入密鑰,若輸入錯誤,文件會變成亂碼。
關閉加密
:X
將密鑰設定成空白(直接按 Enter),取消加密。
:w
寫入當前文件,此時文件恢復成未加密狀態。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!