首頁 > 軟體

如何在 Vim 中使用模式行進行檔案特定的設定

2020-06-16 17:14:45

雖然外掛毫無疑問是 Vim 最大的優勢,然而,還有其它一些功能,使得它成為當今 Linux 使用者中最強大、功能最豐富的文字編輯器/IDE 之一。其中一個功能就是可以根據檔案做特定的設定。我們可以使用該編輯器的模式行(Modeline)特性來實現該功能。

在這篇文章中,我將討論如何使用 Vim 的模式行(Modeline)特性來簡單的理解一些例子。

在開始之前,值得提醒一下,這篇教學中提及的所有例子、命令和指令都已經在 Ubuntu 16.04 中使用 Vim 7.4 版本測試過。

 

VIM 模式行

 

用法

正如上面已經提到的, Vim 的模式行特性讓你能夠進行特定於檔案的更改。比如,假設你想把專案中的一個特定檔案中的所有製表符用空格替換,並且確保這個更改不會影響到其它所有檔案。這是模式行幫助你完成你想做的事情的一個理想情況。

因此,你可以考慮將下面這一行加入檔案的開頭或結尾來完成這件事。

  1. #vim:set expandtab:

(LCTT 譯註:模式行就是一行以注釋符,如 #///* 開頭,間隔一個空格,以 vim: 關鍵字觸發的設定命令。可參看:http://vim.wikia.com/wiki/Modeline_magic

如果你是在 Linux 系統上嘗試上面的練習來測試用例,很有可能它將不會像你所期望的那樣工作。如果是這樣,也不必擔心,因為某些情況下,模式行特性需要先啟用才能起作用(出於安全原因,在一些系統比如 Debian、Ubuntu、GGentoo 和 OSX 上預設情況下禁用)。

為了啟用該特性,開啟 .vimrc 檔案(位於 home 目錄),然後加入下面一行內容:

  1. set modeline

現在,無論何時你在該檔案輸入一個製表符然後儲存時(檔案中已輸入 expandtab 模式行命令的前提下),都會被自動轉換為空格。

讓我們考慮另一個用例。假設在 Vim 中, 製表符預設設定為 4 個空格,但對於某個特殊的檔案,你想把它增加到 8 個。對於這種情況,你需要在檔案的開頭或末尾加上下面這行內容:

  1. // vim: noai:ts=8:

現在,輸入一個製表符,你會看到,空格的數量為 8 個。

你可能已經注意到我剛才說的,這些模式行命令需要加在靠近檔案的頂部或底部。如果你好奇為什麼是這樣,那麼理由是該特性以這種方式設計的。下面這一行(來自 Vim 官方檔案)將會解釋清楚:

“模式行不能隨意放在檔案中的任何位置:它需要放在檔案中的前幾行或最後幾行。modelines 變數控制 Vim 檢查模式行在檔案中的確切位置。請檢視 :help modelines 。預設情況下,設定為 5 行。”

下面是 :help modelines 命令(上面提到的)輸出的內容:

如果 modeline 已啟用並且 modelines 給出了行數,那麼便在相應位置查詢 set 命令。如果 modeline 禁用或 modelines 設定的行數為 0 則不查詢。

嘗試把模式行命令置於超出 5 行的範圍(距離檔案底部和頂部的距離均超過 5 行),你會發現, 製表符將會恢復為 Vim 預設數目的空格 — 在我的情況裡是 4 個空格。

然而,你可以按照自己的意願改變預設行數,只需在你的 .vimrc 檔案中加入下面一行命令

  1. set modelines=[新值]

比如,我把值從 5 增加到了 10 。

  1. set modelines=10

這意味著,現在我可以把模式行命令置於檔案前 10 行或最後 10 行的任意位置。

繼續,無論何時,當你在編輯一個檔案的時候,你可以輸入下面的命令(在 Vim 編輯器的命令模式下輸入)來檢視當前與命令列相關的設定以及它們最新的設定。

  1. :verbose set modeline? modelines?

比如,在我的例子中,上面的命令產生了如下所示的輸出:

  1. modeline
  2. Lastsetfrom~/.vimrc
  3. modelines=10
  4. 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/

作者:Ansh 譯者:ucasFL 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-05/143909.htm


IT145.com E-mail:sddin#qq.com