2015年7月12日 星期日

VIM中的縮排(Tab)

程式設計師間對於縮排鍵(Tab)的使用真是百家爭鳴,
主要的問題是:
1. 一次縮排八個字元太多,縮排沒幾次code都看不見了。
2.在各家環境中,一個Tab鍵造成的縮排可能不同於你想像中的8個字元(Characters)長,而且tab鍵看不見,某些文字處理情境容易造成錯誤(例如弄混tab跟space之類)。

目前看到的多半都是讓一次的縮排使用4個字元,但是具體作法就百家爭鳴了,Vim提供以下幾種方式:
1. set tabstop=4
     改變Tab鍵為一次縮進4個字元,最好是別這樣改,因為其他程式不知道Vim改掉Tab的縮進值,格式怕跑掉,而且某些印表機吃到一個Tab鍵就是印八格,改到這種的印出來格式跑掉就糗了。
2. set softtabstop=4
     混用Tab與space,保留tabstop=8,改成每次按下Tab就插入4個Space,再度按下Tab時會先刪除原來的4個Space,改成插入1個Tab符號(^I)。
3. set smarttab
     混用Tab與space,用於縮排時每個縮排符號使用shiftwidth,而在第一個非空白字元後的Tab就真的使用(^I)
4. set expandtab
     不使用縮排符號(^I),改以Space替代,如果縮排寬度沒改的話就是8個Space,<BS>要按8次刪除

支持使用space的人認為就是直接把(^I)從文檔中全部拿掉,^I可能依系統不同造成佔用不同長度的空間,改成Space就是每個Space固定一個字元。

反方說法是保留其他文檔使用者自訂Tab寬度的權力,畢竟有的人愛縮排2,縮排3不一定,而且一個(^I)比八個Space佔用較少的空間。

我目前使用的是這樣,必要之惡:
set tabstop=8
set softtabstop=4
set expandtab

不管使用縮排符號與否,對於已經存在的文檔最好是統一一下,此時可以使用:%retab!
將文檔內縮排符號改為Space:
:set expandtab
:%retab!
將文檔內縮排符號改為^I:
:set noexpandtab
:%retab!

#其實set list可以讓Vim將Tab符號顯示為^I, 將行末顯示為$,只是Tab或是行數多的時候很醜,set nolist可以關掉。

沒有留言:

張貼留言