如何在 Vim 中使用模式行進行文件特定的設置
Vim 的模式行特性讓你能夠進行特定於文件的更改。比如,假設你想把項目中的一個特定文件中的所有製表符用空格替換,並且確保這個更改不會影響到其它所有文件。這是模式行幫助你完成你想做的事情的一個理想情況。 -- Ansh
本文導航
-VIM 模式行 …… 11%
-用法 …… 11%
-安全考慮 …… 79%
-結論 …… 87%
編譯自: https://www.howtoforge.com/tutorial/vim-modeline-settings/
作者: Ansh
譯者: ucasFL
雖然插件[1]毫無疑問是 Vim 最大的優勢,然而,還有其它一些功能,使得它成為當今 Linux 用戶中最強大、功能最豐富的文本編輯器/IDE 之一。其中一個功能就是可以根據文件做特定的設置。我們可以使用該編輯器的模式行Modeline特性來實現該功能。
在這篇文章中,我將討論如何使用 Vim 的模式行Modeline[2]特性來簡單的理解一些例子。
在開始之前,值得提醒一下,這篇教程中提及的所有例子、命令和指令都已經在 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?
比如,在我的例子中,上面的命令產生了如下所示的輸出:
modelineLast 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 命令注入[3],任意命令執行[4]和無授權訪問[5]等。我知道,這些問題發生在很早的一些時候,現在應該已經修復好了,但是,這提醒了我們,模式行特性有可能會被黑客濫用。
結論
模式行可能是 Vim 編輯器的一個高級命令,但是它並不難理解。毫無疑問,它的學習曲線會有一些複雜,但是不需多問也知道,該特性是多麼的有用。當然,出於安全考慮,在啟用並使用該選項前,你需要對自己的選擇進行權衡。
你有使用過模式行特性嗎?你的體驗是什麼樣的?記得在下面的評論中分享給我們。
via: https://www.howtoforge.com/tutorial/vim-modeline-settings/
作者:Ansh[6] 譯者:ucasFL 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
[1]: 插件 - https://linux.cn/article-7901-1.html
[2]: 模式行 - http://vim.wikia.com/wiki/Modeline_magic
[3]: shell 命令注入 - https://tools.cisco.com/security/center/viewAlert.x?alertId=13223
[4]: 任意命令執行 - http://usevim.com/2012/03/28/modelines/
[5]: 無授權訪問 - https://tools.cisco.com/security/center/viewAlert.x?alertId=5169
[6]: Ansh - https://www.howtoforge.com/tutorial/vim-modeline-settings/
TAG:Linux技術 |
※如何有效地進行設計合作?
※如何使用Mask RCNN模型進行圖像實體分割?
※如何用ImageJ對條帶進行定量分析?
※將DOC文件格式轉換成PDF文件格式,並進行許可權設置
※單創APP如何進行購物?
※如何運用OpenSSL 對文件進行加密和解密
※戴爾證實將進行IPO/或與VMware進行反向合併
※如何設計sgRNA,構建載體,對靶基因進行敲除
※如何使用 Python 進行時間序列預測?
※如何使用Ensembl資料庫對基因變異進行分類
※如何用Python進行圖像處理
※使用 Python 進行分散式系統協調
※Linux用vim進行C+編程的配置和操作入門
※該如何對半監督學習演算法實際性應用進行評估?Google給出了新答案
※如何對分散式 NewSQL 資料庫 TiDB 進行性能調優
※如何使用Redis進行微服務間通信
※Linux操作系統的應用程序如何跟Linux內核進行交互
※信鴿是如何進行定向的
※如何利用新媒體,進行新時代的營銷模式
※如何優雅的在手機上進行Python編程……