大家來學VIM(一個歷久彌新的編輯器)[九]

set 功能設定

 

本單元可說是 vi(m) 的微調功能,可依您個人的喜好做有限度的調整。由於 vim 做了相當的擴充,文內主要是述敘 vim 的設定,但 elvis 沒有的也會標明。但並不打算一網打盡,只說明重要、常用的部份,其它的可以 :h option-list 來查閱。Linux Journal 四月份(April, 2000)有一篇關於 configuring Vim 的文章,有興趣的朋友也可參考一下,不過依據的版本是 vim 5.5 版,而非最新的 5.6 版。

 

 

該在何處設定呢?

可在線上做設定,例如 :set ai 或 :set noai,ai 是 autoindent 的縮寫,這樣就可以馬上改變縮格的設定,但離開 vim 後就又恢復原狀。要永久設定就得設在設定檔中。 vim 的設定檔在:

~/.exrc
~/.vimrc
~/.gvimrc    GUI 版本
$VIM/vimrc
$VIM/gvimrc    GUI 版本

  • windows 版本則在 $VIM/_vimrc 及 $VIM/_gvimrc
  • 您要把 GUI 的設定設在 ~/.vimrc 也是可以的,但分開來可能對以後要修改時會比較找得到地方改。
  • 那 $VIM 在哪裡呢? /usr/share/vim 或 /usr/local/share/vim 這是編譯時就決定的,但可在 ~/.profie 或 ~/.bashrc 中另設。windows 版本可設在 autoexec.bat 中。
elvis 的則在:

~/.exrc
~/.elvislib/elvis.rc

  • windows 版本在 C:\Program Files\elvis\elvis.rc
  • 如果您的系統上同時有 vim 及 elvis,則使用 ~/.exrc 要小心,以免互相影響了設定。好處是可以把共同的設定設在 ~/.exrc 裡。
  • 拜託您一下!設在設定檔中時 set 前當然是不必冒號的。:-)


 

如何得知目前的設定

:set 或 :se  會顯示所有經過修改的部份,就是和預設值不一樣的部份。
:set all  顯示目前所有設定值內容。
:set option?  顯示 option 這設定的目前值。
:set option  直接線上設定,有些設定需加 = 後加上設定值內容。
:set nooption  取消該設定。

  • :set 後面是可以多重設定的。例如 :set autoindent noconfirm autowrite,這樣三種設定就會同時重設。

您當然可以改設定檔來改變設定值。在 vim 也可以使用 :opt[ion] 來直接線上設定,會列出目前的設定,在 set 這個字上按 Enter 即可改變設定,或就直接修改其值亦可,改完後按 :q 就可以了。在簡短說明處按 Enter 則會叫出該部份的說明檔給您參考,您說方不方便?改好後

:mk[exrc]    則會寫入 ~/.exrc 檔
:mkv[imrc]   則會寫入 ~/.vimrc 檔

當然您得先搞清楚您目前所在目錄在什麼地方,如果您是在家目錄啟動的那就不用擔心了,否則找不到您的新 .vimrc 可不要寫信來罵我。:-) elvis 可就沒這麼方便了,得自行修改 ~/.exrc 或 ~/.elvislib/elvis.rc


 

各種set功能說明

autoindent(ai)
自動縮排,也就是說如果本行是從第五個字元開始寫的,您按 Enter
後游標就會停在次行第五個字元處。預設是不打開的。

autowrite(aw)
檔案一有更動就會自動存檔。預設不打開。

background(bg)    <vim 才有>
可設成 dark 或 light,這是兩種不同的 highlight 顏色設定,詳見
$VIMRUNTIME/syntax/synload.vim。不過您要更動顏色的設定,最好
是設在 ~/.vimrc 或 ~/.gvimrc 中,原始檔最好不要去動她。

  • ㄟㄟㄟ,你從沒提過 $VIMRUNTIME 好不好!其實這是最近版本的 vim 為了不至安裝新版本時把舊版本的一些設定或 macro 檔幹掉,所以 $VIMRUNTIME 就是 $VIM/vimxx,xx 就是版本號碼啦!例如您使用的是 vim 5.6 版,那麼就是 $VIM/vim56。
backup(bk)
是否要 backup file。預設不打開。

writebackup(wb)    <vim 才有>
在寫入檔案前先備份一份,和 backup 的作用不盡相同,請
:h backup-table。預設是打開的,所以您如果不要 backup,那要關
掉的是這個項目,而不是 backup。但請先檢查一下您編譯時是不是
有編譯進去,請 :ver。

backupdir(bdir)    <vim 才有>
設定存放 backup file 的目錄。預設在所編輯的檔案之所在目錄。

binary(bin)    <vim 才有>
設在編輯二進位檔狀態,這是防止存二進位檔時把 EOL 也寫進二進位
檔,那就會悔不當初,如果是圖檔將會無法再觀看,如果是可執行檔就
無法執行了!因此預設是 off。

  • elvis 會自動判斷是否為二進位檔,而且會分成左右兩半,左半部會以 16 進位的方式顯示,右半部則是以 ASCII 的方式來顯示。
browsedir(bsdir)    <vim 才有>
瀏覽檔案的目錄,GUI 版本始有。預設是上一次瀏覽的目錄。就是 GUI
版本功能表上的 [File] -> [Open] 會打開的目錄。

cindent(cin)    <vim 才有>
寫 C 時很好用,indent 比一般敏感,專為 C 程式碼而設。預設 off。
編輯 C/C++ code 時會自動打開。

cmdheight(ch)    <vim 才有>
狀態列的行數,預設一行,建議設成兩行。

compatible(cp)    <vim 才有>
設為和原始 vi 相容的狀態,vim 的擴充功能會被抑制。預設 off。

confirm(cf)    <vim 才有>
各種確認動作。預設 off。

directory(dir)
swap 檔存放的目錄。前面單元已有說明。

fileformat(ff)   <vim 才有>
這是寫入檔案時置放 EOL(end of line) 的形式
dos 是以 0D 0A 來斷行。
unix 是以 0A 來斷行。
mac 是以 0D 來斷行。
預設以各系統平檯而定,在 Linux 當然是 unix 形式。

fileformats(ffs)    <vim 才有>
可指定多個,會依載入的檔案形式來調整 ff。
例如 :set ffs=unix,dos ff=unix
則預設為 unix 格式,但如讀入的是 dos 格式的檔案,會自動調整
為 dos 格式,這樣存檔時就會以 dos 格式存檔(狀態列會顯示)。
。此時如要改成 unix 格式,可 set ff=unix 然後存檔就會轉成
unix 格式,反之亦然。

  • 如果不這樣設,也就是您不管 ff 或 ffs 都設成 unix,那讀入 dos 格式的檔案時在每行尾會出現 ^M 這個字元(就是 0D 啦!)這時縱使 :set ff=unix 也來不及了!只好 :%s/^M//g 來消去這個 ^M。ㄟ,還記得怎麼替換嗎?就是把 ^M 換成沒有啦!而且 ^M 怎麼打出來的還記得吧!翻一翻前面的單元吧!
  • Hey,你怎麼知道是 0D 呀!好吧!告訴您一個密秘,您把游標移到 ^M 那個位置,然後按 ga 在狀態列就會顯示 10,16,8 進位的值。其它的字元也是可以如此顯示。a 就是 ascii 的意思。但這是 vim 的擴充功能,elvis 沒有。
  • elvis 縱使載入 dos 格式的檔案,也是會自動把 ^M 隱藏起來。
ignorecase(ic)
尋找時不分大小寫,這對中文會造成困擾。預設 off。

incsearch(is)    <vim 才有>
加強式尋找功能,在鍵入 patern 時會立即反應移動至目前鍵入之
patern 上。預設 off。

hlsearch(hls)    <vim 才有>
尋找時,符合字串會反白表示。預設 off。如果您是使用 vim 的
預設的 vimrc 檔的話,會設在 F8 鍵來切換。

textwidth(tw)
是一種 word wrap 的功能,從左起算之固定每行的最大字元寬度。
超過此寬度就會自動折行,這可是真的折行,也就是說在折行處會插
入 EOL。預設是 0,也就是沒有 word wrap 的功能。

wrapmargin(wm)
和 textwidth 作用相同,只是是從右視窗邊向左算起要幾個字元起
折行。預設是 0。textwidth 與 wrapmargin 的功能目前並不適用於
中文,打中文還是您自行按 Enter 吧!

wrap
這也是折行功能,可是只是螢幕效果的折行,實際上並沒有插入 EOL。

wrapscan(ws)
這和折行沒有關係,是指尋找時,找至檔尾時,是否要從檔首繼續找。
預設是要。

paste    <vim 才有>
這是防止在做剪貼時位置會不正確,前面單元已有說明。

ruler(ru)    <vim 才有>
會在狀態列顯示游標所在處之行列狀態,預設不打開,但建議打開。
最右邊之代號的意義如下:
Top  檔案第一行在螢幕可見範圍。
Bot  檔案最後一行在螢幕可見範圍。
All  檔案首尾皆在一個螢幕範圍內。
如非以上三種情形,則會顯示相對百分比位置。

statusline(stl)    <vim 才有>
狀態列顯示的格式,使用預設就可以了,如果您想騷包一下的話,那
就請您 :h stl。

shiftwidth(sw)
指由 >> 移動整行內容時,一次移動的字元寬度,一般是使用 Tab 的
值,但可由這個設定來改變。

tabstop(ts)
一個 Tab 鍵寬度。預設是 8 個字元寬度。最好不要隨便改,以免您寫
的東西由其它編輯器來閱讀時造成困擾,為解決這個問題,vim 有一種
softtabstop 的機制,在下一節會詳細說明。

showcmd(sc)
在狀態列顯示目前所執行的指令。

showmode(smd)
在狀態列顯示目前的模式,例如是 Insert mode 或是 Visual mode。
當然平常的 normal mode(commond mode)是不顯示的。

viusalbell(vb)    <vim 才有>
以螢幕閃動代替 beep 聲。

number(nu)
顯示行號。注意,冒號命令也有 :nu 這是顯示游標所在行的行號,您
嫌多打一個字的話,:# 也行。不過如果 ruler 打開的話,在狀態列本
就會顯示門前游標所在處的行列值。

list
這也可以算是一種模式,list mode。就是 Tab 的地方會以 ^I 顯示,
而行尾之 EOL 會顯示成 $。可以讓您清楚的知道 Tab 在哪裡,折行是
不是真的。

swapfile(swf)    <vim 才有>
是否需 swap 至磁碟。如果設為 noswf 的話,那將不會有 swapfile
產生,通通會載入在記憶體中。預設是要 swapfile。

fileencoding(fe)    <vim 才有>
首先先鼓掌一下,啪啪啪…,因為有支援 taiwan,也支援 XIM,也
就是說可以使用 xcin-2.5x 來作輸入,當然您用 xcin-2.3x 配合
XA 也是可以啦!目前支援簡繁中文、日文、韓文,unicode 尚未植
入。但前提是您要把 multi_byte 編譯進去,這在一開始就講過了。
預設是使用 ansi。set guifont 及 set guifontset 已在一開始講
過,在此就不重複了。

history(hi)
記錄冒號命令的歷史紀錄檔,就是可以用上下方向鍵叫出來的那鍋。
預設是 20 筆。


 

關於softtabstop(sts)

幾乎所有的 OS 及軟體都設定 Tab 就是 8 個字元長,這已經是個公認值,您硬要去改變它的話恐怕帶來許多不便,但實際上關於程式風格,許多人又認為 8 個字元太長了,幾個巢狀迴圈下來就需折行,反而不方便。因此 vim 體貼您,內建了 softtabstop 的功能,就是由 vim 來代您製造出一個假的 Tab,實際上是空白字元組成的 Tab。

舉個例子來說明比較清楚。

set softtabstop=4
set shiftwidth=4

這樣會由 4 個空白字元取代一個 Tab,您按 Tab 鍵 vim 就跳 4 格,需注意的是,如果您按了三次 Tab 鍵,那就是一個實際的 Tab 加上四個空白字元,可不是 12 個空白字元喔!是混合 Tab 及 space 的。

問題來了!那我要按真正的 8 字元的 Tab 時怎麼辦?簡單,還記得怎麼按特殊字元嗎? Ctrl-v Tab 或 Ctrl-v I 就可以了,那就是如假包換的 8 字元長之 Tab。當然,您按兩次 Tab 不就得了!:-)


 

關於折行

前面已說過 set wrap 就可以造成螢幕折行,可是卻會把一個英文單字折成兩半,實在很不雅觀。好了,vim 再體貼您一次,set linebreak(lbr) 就會避免這種問題發生,會在空白或標點符號的地方來折行,但也仍屬螢幕折行,並不會插入 EOL。這個功能目前在中文判斷上還是會出槌!:-(

你可能感兴趣的:(vim)