Vim打開和保存文件-Vim使用技巧(7)
使用Vim打開和保存文件是最常用的操作,介紹使用edit命令通過文件路徑來打開文件,使用write命令保存文件,當文件路徑不存在或用戶權限不匹配時,使用write命令調用外部shell程序完成操作。
1. edit命令打開文件
Vim命令 :edit
(縮寫形式為 :e
) 可以通過文件的絕對路徑或相對路徑來打開文件。
如果想打開的文件和當前活動文件緩沖區中的文件在同一個目錄裏,可以使用 :edit %:h<Tab>
命令。
%
符號代表活動緩沖區的完整文件路徑,:h
修飾符會去除路徑中的文件名,但保留路徑中的其他部分。因此,輸入的 %:h<Tab>
會被展開為當前文件所在目錄
Vim命令 %
和 :h
在命令行模式下具有特殊含義,可用於高效操作與Vim文件路徑相關的功能。
2. 把文件保存到不存在的目錄
如果使用 :edit {file}
命令指定了一個不存在的文件路徑,Vim 會創建一個新的空白緩沖區。在新建的空白緩沖區中按 <Ctrl-g>
時可以看到該緩沖區被標識為新文件。然後,當執行 :write
(縮寫形式為 :w
) 命令保存該緩沖區時,Vim 會嘗試將此緩沖區的內容寫到創建該緩沖區時所指定的文件路徑中。
如果指定的文件路徑不存在時,Vim會因為找不到對應目錄而顯示出錯信息 “無法打開並寫入文件”。
此時,一個常用的Vim使用技巧是調用外部的 mkdir 程序新建目錄。在Vim命令行模式下執行 :!mkdir -p %:h
:write
命令保存新建的文件。
:!mkdir
表示調用外部的 mkdir 命令,-p
參數使 mkdir 創建任何不存在的中間目錄,而 %:h
表示當前活動緩沖區對應文件所在目錄。
註:<Ctrl-g>
命令用於顯示當前文件的文件名及狀態,
3. 以超級用戶權限保存文件
在使用Vim工作時,有時會遇到需要以root身份保存文件的場景。
例如,假設當前用戶為 vim,打開 /etc/hosts
文件查看當前host配置後需要新增一個域名解析 vim.ink 127.0.0.1
。
首先,使用 Go
命令在hosts文件末尾新建內容後,使用 :write
命令嘗試保存結果,此時Vim會報錯 “E45:已設定選項 ‘readonly’ (請加 ! 強制執行)”。按照提示,使用命令 :write!
這說明現在的問題是當前用戶沒有寫 /etc/hosts
文件的權限。
為了不退出Vim而保留已有修改,可以使用Vim命令 :write !sudo tee % > /dev/null
,然後按Vim的提示輸入vim用戶的密碼並按 L 鍵重新將該文件加載到緩沖區即可。
這條命令是如何工作的?
首先,:write !{cmd}
命令會把當前文件緩沖區的內容作為標準輸入傳給指定的{cmd},{cmd} 可以是任何外部程序 (vim命令行模式下執行命令 :h :write_c
可查看更多內容)。
其次,在 Vim 命令行中,%
符號會展開成當前文件的完整路徑,因此上面的命令可以展開為 :write !sudo tee /etc/hosts > /dev/null
所以,上面這條命令會把當前文件緩沖區的內容當作標準輸入傳遞給linux的 tee
命令,以超級用戶權限運行 tee
命令重定向到文件 /etc/hosts
中,從而實現了不重啟Vim而以超級用戶權限保存文件的需求。
註:linux命令tee表示將內容重定向到指定的文件並重定向內容副本到標準輸出。
Vim打開和保存文件-Vim使用技巧(7)