Vim 編輯文件篇


建立時間: 2023年9月28日 09:36
更新時間: 2024年11月22日 10:04

說明

用 Vim 編輯一個文件意味著:

  1. 把該文件讀到緩衝區
  2. 用編輯器指令修改緩衝區
  3. 把緩衝區內容寫回文件

這裡要提醒大家,編輯文件和編輯文本是不一樣的主題,編輯文件主要是操作文件,例如:切換文件,編輯文件等等。編輯文本是操作文件裡面的文本。

啟動多個文件

$ 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-^ 則可以。


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]

開始編輯參數列表的最後一個文件。忽略任何對目前緩衝區的已有修改。


寫入

:w[rite] [++opt]

將整個緩衝區寫入目前文件。這是保存文件更動最普通的方式。

如果置位了 readonly 選項或其他原因不能寫入文件,它會失敗。

範例

:w
儲存當前文件


:w[rite]! [++opt]

:write 類似,但即使 readonly 已置位或有其他原因寫入被拒絕,還是強制寫入。

注意: 這可能會改變文件的權限和擁有者,或解除 (符號) 連結。


:[range]w[rite][!] [++opt]

將指定的行寫入當前文件。這比較不尋常,因為該文件不會包含緩衝區中的所有行。


:[range]w[rite] [++opt] {file}

將指定行寫入文件 {file}

範例

:w {file}
儲存到 {file} 文件,不指定 [range] 就代表全寫,就像另存新文件。

: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}


: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]

顯示目前目錄名稱。


觀看次數: 814
filevim
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!