Linux中國

如何在 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
      Last set from ~/.vimrc
 modelines=10
      Last set from ~/.vimrc

關於 Vim 的模式行特性,你還需要知道一些重要的點:

  • 默認情況下,當 Vim 以非兼容(nocompatible)模式運行時該特性是啟用的,但需要注意的是,在一些發行版中,出於安全考慮,系統的 vimrc 文件禁用了該選項。
  • 默認情況下,當以 root 許可權編輯文件時,該特性被禁用(如果你是使用 sudo 方式打開該文件,那麼該特性依舊能夠正常工作)。
  • 通過 set 來設置模式行,其結束於第一個冒號,而非反斜杠。不使用 set,則後面的文本都是選項。比如,/* vim: noai_ts=4:sw=4 */ 是一個無效的模式行。

(LCTT 譯註:關於模式行中的 set,上述描述指的是:如果用 set 來設置,那麼當發現第一個 : 時,表明選項結束,後面的 */ 之類的為了閉合注釋而出現的文本均無關;而如果不用 set 來設置,那麼以 vim: 起頭的該行所有內容均視作選項。 )

安全考慮

令人沮喪的是, Vim 的模式行特性可能會造成安全性問題。事實上,在過去,已經報道過多個和模式行相關的問題,包括 shell 命令注入任意命令執行無授權訪問等。我知道,這些問題發生在很早的一些時候,現在應該已經修復好了,但是,這提醒了我們,模式行特性有可能會被黑客濫用。

結論

模式行可能是 Vim 編輯器的一個高級命令,但是它並不難理解。毫無疑問,它的學習曲線會有一些複雜,但是不需多問也知道,該特性是多麼的有用。當然,出於安全考慮,在啟用並使用該選項前,你需要對自己的選擇進行權衡。

你有使用過模式行特性嗎?你的體驗是什麼樣的?記得在下面的評論中分享給我們。

via: https://www.howtoforge.com/tutorial/vim-modeline-settings/

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

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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國