2021-05-12 14:32:11
如何在 Vim 中使用模式行進行檔案特定的設定
雖然外掛毫無疑問是 Vim 最大的優勢,然而,還有其它一些功能,使得它成為當今 Linux 使用者中最強大、功能最豐富的文字編輯器/IDE 之一。其中一個功能就是可以根據檔案做特定的設定。我們可以使用該編輯器的模式行(Modeline)特性來實現該功能。
在這篇文章中,我將討論如何使用 Vim 的模式行(Modeline)特性來簡單的理解一些例子。
在開始之前,值得提醒一下,這篇教學中提及的所有例子、命令和指令都已經在 Ubuntu 16.04 中使用 Vim 7.4 版本測試過。
VIM 模式行
用法
正如上面已經提到的, Vim 的模式行特性讓你能夠進行特定於檔案的更改。比如,假設你想把專案中的一個特定檔案中的所有製表符用空格替換,並且確保這個更改不會影響到其它所有檔案。這是模式行幫助你完成你想做的事情的一個理想情況。
因此,你可以考慮將下面這一行加入檔案的開頭或結尾來完成這件事。
#vim:set expandtab:
(LCTT 譯註:模式行就是一行以注釋符,如 #
、//
、/*
開頭,間隔一個空格,以 vim:
關鍵字觸發的設定命令。可參看:http://vim.wikia.com/wiki/Modeline_magic )
如果你是在 Linux 系統上嘗試上面的練習來測試用例,很有可能它將不會像你所期望的那樣工作。如果是這樣,也不必擔心,因為某些情況下,模式行特性需要先啟用才能起作用(出於安全原因,在一些系統比如 Debian、Ubuntu、GGentoo 和 OSX 上預設情況下禁用)。
為了啟用該特性,開啟 .vimrc
檔案(位於 home
目錄),然後加入下面一行內容:
set modeline
現在,無論何時你在該檔案輸入一個製表符然後儲存時(檔案中已輸入 expandtab
模式行命令的前提下),都會被自動轉換為空格。
讓我們考慮另一個用例。假設在 Vim 中, 製表符預設設定為 4 個空格,但對於某個特殊的檔案,你想把它增加到 8 個。對於這種情況,你需要在檔案的開頭或末尾加上下面這行內容:
// vim: noai:ts=8:
現在,輸入一個製表符,你會看到,空格的數量為 8 個。
你可能已經注意到我剛才說的,這些模式行命令需要加在靠近檔案的頂部或底部。如果你好奇為什麼是這樣,那麼理由是該特性以這種方式設計的。下面這一行(來自 Vim 官方檔案)將會解釋清楚:
“模式行不能隨意放在檔案中的任何位置:它需要放在檔案中的前幾行或最後幾行。
modelines
變數控制 Vim 檢查模式行在檔案中的確切位置。請檢視:help modelines
。預設情況下,設定為 5 行。”
下面是 :help modelines
命令(上面提到的)輸出的內容:
如果
modeline
已啟用並且modelines
給出了行數,那麼便在相應位置查詢set
命令。如果modeline
禁用或modelines
設定的行數為 0 則不查詢。
嘗試把模式行命令置於超出 5 行的範圍(距離檔案底部和頂部的距離均超過 5 行),你會發現, 製表符將會恢復為 Vim 預設數目的空格 — 在我的情況裡是 4 個空格。
然而,你可以按照自己的意願改變預設行數,只需在你的 .vimrc
檔案中加入下面一行命令
set modelines=[新值]
比如,我把值從 5 增加到了 10 。
set modelines=10
這意味著,現在我可以把模式行命令置於檔案前 10 行或最後 10 行的任意位置。
繼續,無論何時,當你在編輯一個檔案的時候,你可以輸入下面的命令(在 Vim 編輯器的命令模式下輸入)來檢視當前與命令列相關的設定以及它們最新的設定。
:verbose set modeline? modelines?
比如,在我的例子中,上面的命令產生了如下所示的輸出:
modeline
Lastsetfrom~/.vimrc
modelines=10
Lastsetfrom~/.vimrc
關於 Vim 的模式行特性,你還需要知道一些重要的點:
- 預設情況下,當 Vim 以非相容(
nocompatible
)模式執行時該特性是啟用的,但需要注意的是,在一些發行版中,出於安全考慮,系統的vimrc
檔案禁用了該選項。 - 預設情況下,當以 root 許可權編輯檔案時,該特性被禁用(如果你是使用
sudo
方式開啟該檔案,那麼該特性依舊能夠正常工作)。 - 通過
set
來設定模式行,其結束於第一個冒號,而非反斜槓。不使用set
,則後面的文字都是選項。比如,/* vim: noai:ts=4:sw=4 */
是一個無效的模式行。
(LCTT 譯註:關於模式行中的 set
,上述描述指的是:如果用 set
來設定,那麼當發現第一個 :
時,表明選項結束,後面的 */
之類的為了閉合注釋而出現的文字均無關;而如果不用 set
來設定,那麼以 vim:
起頭的該行所有內容均視作選項。 )
安全考慮
令人沮喪的是, Vim 的模式行特性可能會造成安全性問題。事實上,在過去,已經報道過多個和模式行相關的問題,包括 shell 命令注入,任意命令執行和無授權存取等。我知道,這些問題發生在很早的一些時候,現在應該已經修復好了,但是,這提醒了我們,模式行特性有可能會被駭客濫用。
結論
模式行可能是 Vim 編輯器的一個高階命令,但是它並不難理解。毫無疑問,它的學習曲線會有一些複雜,但是不需多問也知道,該特性是多麼的有用。當然,出於安全考慮,在啟用並使用該選項前,你需要對自己的選擇進行權衡。
你有使用過模式行特性嗎?你的體驗是什麼樣的?記得在下面的評論中分享給我們。
Vim入門基礎知識集錦 http://www.linuxidc.com/Linux/2017-02/140903.htm
Vim入門基礎教學 http://www.linuxidc.com/Linux/2017-02/140279.htm
把Vim打造成優秀的C++ IDE http://www.linuxidc.com/Linux/2016-06/132262.htm
Ubuntu 14.04升級Vim7.4到8.0 http://www.linuxidc.com/Linux/2016-11/136816.htm
Vim安裝youcompleteme自動補全外掛 http://www.linuxidc.com/Linux/2016-11/137665.htm
Linux Vim編輯器使用簡單講解 http://www.linuxidc.com/Linux/2016-12/138930.htm
Vim文字編輯器 http://www.linuxidc.com/Linux/2017-03/142275.htm
Vim安裝與設定進階版 http://www.linuxidc.com/Linux/2017-03/141724.htm
Ubuntu 16.04 Vim YouCompleteMe自動補全的安裝設定與使用 http://www.linuxidc.com/Linux/2017-02/141088.htm
via: https://www.howtoforge.com/tutorial/vim-modeline-settings/
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-05/143909.htm
相關文章