2008/12/28

Vim 的 modeline

有團隊合作寫程式經驗的人,應該能夠了解共同的 coding style 是非常重要的。先不管 if-else、for、while 之類的述句該怎麼編排,至少縮排幾格、tab 如何處理一定要統一。否則一個 source code 經過幾個人 (其實是編輯器) 的修改,可能會變得不成人形。

問題出在不同的編輯器對 tab 可以有不同的處理方式:對齊四或八格?要不要展開成空白?若編輯器的設定不同,甲看起來漂漂亮亮的排版,在乙那邊可能是歪七扭八的。

Vim 的 modeline 提供一個方便的解法:在 source code 當中就可以指定編輯設定,包含此檔案的 tab 應該要如何解讀。

Modeline 是藏在文件開頭或末尾幾行的特殊格式字串,vim 讀取文件時若發現這些字串便會修正自身的設定。在程式當中,通常是寫在註解裡頭。例如:
// vim: ts=4 sw=4 et
這是 modeline 的第一種寫法。vim: 標記特殊字串的開頭,結尾則是本行結束。特殊字串當中以空白或「:」隔開各個設定項目。利用這種方式,後面不可有其他任何字元,所以,若是用 C 的註解符號必須寫成:
/* vim: ts=4 sw=4 et
*/
第二種寫法同樣以 vim: 標記特殊字串的開始,但之後必須跟著一個 set。下一個「:」代表特殊字串的結束,之後可以有其他文字。例如以下用於 Python 的範例,同一行除了包含 vim modeline 之外,也包含 Pyhton 指定 source code encoding 的寫法:
# vim: set ts=4 sw=4 et: -*- coding: utf-8 -*-
個人推薦這種寫法,因為 vim 的 modeline 處理並非強制的,有些 Linux distro 的 vim 預設值將 modeline 關閉;也有些人有安全顧慮,不想開啟 modeline。遇到此情況,我們可以直接剪貼兩個冒號之間的字串即可複製該設定。若要啟用或關閉 modeline 功能可以編輯 ~/.vimrc:
set modeline
set modelines=2
第一行是啟用 modeline;第二行是將搜尋 modeline 的範圍設定為文件開頭和末尾各兩行,若省略則預設為五行。

參考資料:

沒有留言: