2008/12/29

Vim 建議的四種 TAB 字元處理方式

Vim 的 help 建議四種 TAB 字元處理方式:
  1. 將 'tabstop' 固定設為 8;'softtabstop' 和 'shiftwidth' 設為 4 (或其他你所喜好的縮排長度);然後指定 'noexpandtab'。這樣,vim 在處理檔案的時候會視需求自動混用 TAB 和空白字元,但你按 TAB 或 BS 鍵時,都會以 4 格 (或你喜好的縮排長度) 來移動。

  2. 將 'tabstop' 和 'shiftwidth' 設成你所喜好的縮排長度,然後設定 'expandtab'。這樣,你編輯的檔案將不會有任何 TAB 字元。以其他編輯器來看時,縮排不會受到 TAB 設定不同的影響。

  3. 將 'tabstop' 和 'shiftwidth' 設成你所喜好的縮排長度,然後將此設定以 modeline 的方式寫在檔案之中。這樣,只要使用 vim 而且 modeline 有開啟的話,大家看到的樣子都會一致。

  4. 將 'tabstop' 和 'shiftwidth' 設成相同的值,然後設 'noexpandtab'。這樣,即使別人的設定不一樣,看起來也只是縮排程度不同,結構上是沒有問題的。不過,你只能在每一行的開頭使用 TAB 字元,其他地方的 TAB 字元可能會因縮排長度的不同而破壞原來的排版 (例如:原本對齊的 C 常數定義變沒有對齊)。
個人推薦方式 2 再嵌入 modeline 設定,如下:
vim: set et ts=4 sw=4:
嵌入 modeline 設定不單純只給 vim 看,而是當作一種宣告:本文件的縮排為四格而且以空白展開 TAB,希望修改文件的人都能遵循這個慣例。

但是有一個例外:Makefile。Makefile 的 TAB 字元是有意義的,不可用空白取代,所以 modeline 應該設為:
vim: set noet ts=8 sw=8:
另外,我也建議 ~/.vimrc 要有如下的設定:
set smarttab
set autoindent
這樣寫程式會比較方便。

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 的範圍設定為文件開頭和末尾各兩行,若省略則預設為五行。

參考資料:

2008/12/24

VirtualBox 2.1.0 的 Host Interface Networking

使用 VirtualBox 的 Host Interface Networking 的好處是:可以省掉 NAT 型態設定 port forwarding 的麻煩;缺點則是要多一點設定的工作。但是 VirtualBox 2.1.0 版針對此部份有大幅的改進,只要從 GUI 點選 Host Interface,再從選單選出 host 主機的網路介面即可。請參考: