如何在 Vim 中使用模式行進行文件特定的設置
雖然插件毫無疑問是 Vim 最大的優勢,然而,還有其它一些功能,使得它成為當今 Linux 用戶中最強大、功能最豐富的文本編輯器/IDE 之一。其中一個功能就是可以根據文件做特定的設置。我們可以使用該編輯器的 模式行 特性來實現該功能。
在這篇文章中,我將討論如何使用 Vim 的 模式行 特性來簡單的理解一些例子。
在開始之前,值得提醒一下,這篇教程中提及的所有例子、命令和指令都已經在 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/
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive