文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>vim set 功能設定

vim set 功能設定

时间:2006-11-21  来源:qfox

9. set 功能設定

本單元可說是 Vim 的微調功能,可依您個人的喜好做有限度的調整。由於 Vim 做了相當多的擴充,文內主要是述敘 Vim 的設定,但 elvis 沒有的也會標明。但並不打算一網打盡,只說明重要、常用的部份,其它的可以 :h option-list 來查閱。

在系統上,會有個 vimrc_example.vim 檔,可以依據這個檔案來設定一些常要用到的內容。


9.1 該在何處設定呢?

9.1.1 Vim 的設定檔

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

~/.exrc ~/.vimrc ~/.gvimrc GUI 版本 $VIM/vimrc 系統預設值,最好不去修改 $VIM/gvimrc GUI 版本 $VIM\_vimrc Windows 版本 $VIM\_gvimrc 

您要把 GUI 的設定設在 $HOME/.vimrc 也是可以的,但分開來可能對以後要修改時會比較找得到地方改。那 $VIM 在哪裡呢?/usr/share/vim 或 /usr/local/share/vim 這是編譯時就決定的,但可在 $HOME/.bash_profie 或 $HOME/.bashrc 中另設。Windows 版本的 $VIM 則在 C:\Vim 這個目錄中,亦可設在 autoexec.bat 中。

9.1.2 elvis 的設定檔

~/.exrc ~/.elvislib/elvis.rc C:\Program Files\elvis\elvis.rc Windows 版本 

如果您的系統上同時有 Vim 及 elvis,則使用 $HOME/.exrc 要小心,以免互相影響了設定。好處是可以把共同的設定設在 $HOME/.exrc 裡。提醒您一下!設在設定檔中時 set 前當然是不必冒號的。

9.1.3 nvi-m17n 的設定檔

~/.exrc ~/.nexrc 


9.2 如何得知目前的設定

:set 或 :se 會顯示所有經過修改的部份,就是和預設值不一樣的部份。 :set all 顯示目前所有設定值內容。 :scriptnames 顯示各種設定檔的所在路徑及其檔名。 :set option? 顯示 option 這設定的目前值。 :option 直接線上設定,有些設定需加 = 後加上設定值內容。 :set nooption 取消該設定。:set 後面是可以多重設定的。例如 :set autoindent noconfirm autowrite,這樣三種設定就會同時重設。 

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

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

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


9.3 各種 set 功能說明

方括號內的是縮寫,由於 Vim 新增的指令、設定項實在是相當多,建議一開始使用完整的寫法,等熟悉後再來使用縮寫會比較好。

9.3.0.1 autoindent[ai]

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

9.3.0.2 autowrite[aw]

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

9.3.0.3 background[bg] (Vim 才有)

可設成 dark 或 light,這是兩種不同的 highlight 顏色設定,系統預設的內容是在一個 synload.vim 檔中,詳見 $VIMRUNTIME/syntax/synload.vim。不過您要更動顏色的設定,最好是設在 $HOME/.vimrc 或 $HOME/.gvimrc 中,原始檔預設檔盡量不要去動她。

ㄟㄟㄟ,你從沒提過 $VIMRUNTIME 好不好!其實這是最近版本的 Vim 為了不至安裝新版本時把舊版本的一些設定或 macro 檔幹掉,所以 $VIMRUNTIME 就是 $VIM/vimxx,xx 就是版本號碼啦!例如您使用的是 Vim 6.1 版,那麼就是 $VIM/vim61,往後安裝 6.2 版時,會把 runtime files 裝在 $VIM/vim62,這樣就不會把舊的 runtime files 給蓋掉。

9.3.0.4 backup[bk]

是否要 backup file。預設不打開。

9.3.0.5 writebackup[wb] (Vim 才有)

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

9.3.0.6 backupdir[bdir] (Vim 才有)

設定存放 backup file 的目錄。預設在所編輯的檔案之所在目錄。

9.3.0.7 binary[bin] (Vim 才有)

設在編輯二進位檔狀態,這是防止存二進位檔時把 EOL 也寫進二進位檔,那就會悔不當初,如果是圖檔將會無法再觀看,如果是可執行檔就無法執行了!因此預設是 off。elvis 會自動判斷是否為二進位檔,而且會分成左右兩半,左半部會以 16 進位的方式顯示,右半部則是以 ASCII 的方式來顯示。

9.3.0.8 browsedir[bsdir] (Vim 才有)

瀏覽檔案的目錄,GUI 版本始有。預設是上一次瀏覽的目錄。就是 GUI 版本功能表上的 [File] 234 [Open] 會打開的目錄。

9.3.0.9 cindent[cin] (Vim 才有)

寫 C 時很好用,indent 比一般敏感,專為 C 程式碼而設。預設 off。編輯 C/C++ code 時會自動打開。

9.3.0.10 cmdheight[ch] (Vim 才有)

狀態列的行數,預設一行,建議設成兩行。

9.3.0.11 compatible[cp] (Vim 才有)

設為和原始 vi 相容的狀態,vim 的擴充功能會被抑制。預設 off。

9.3.0.12 confirm[cf] (Vim 才有)

各種確認動作。預設 off。

9.3.0.13 directory[dir]

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

9.3.0.14 fileformat[ff] (Vim 才有)

這是寫入檔案時置放 EOL(end of line) 的形式
dos 是以 0x0D0A 來斷行。 unix 是以 0x0A 來斷行。 mac 是以 0x0D 來斷行。 
預設以各系統平檯而定,在 Linux 當然是 unix 形式。

9.3.0.15 fileformats[ffs] (Vim 才有)

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

如果不這樣設,也就是您不管 ff 或 ffs 都設成 unix,那讀入 dos 格式的檔案時在每行尾會出現 ^M 這個字元(就是 0x0D 啦!)這時縱使 :set ff=unix 也來不及了!只好 :%s/^M//g 來消去這個 ^M。ㄟ,還記得怎麼替換嗎?就是把 ^M 換成沒有啦!而且 ^M 怎麼打出來的還記得吧!翻一翻前面的單元吧!

Hey,你怎麼知道是 0x0D 呀!好吧!告訴您一個密秘,您把游標移到 ^M 那個位置,然後按 ga 在狀態列就會顯示 10,16,8 進位的值。其它的字元也是可以如此顯示。a 就是 ascii 的意思。但這是 Vim 的擴充功能,elvis 沒有。elvis 縱使載入 dos 格式的檔案,也是會自動把 ^M 隱藏起來。

9.3.0.16 ignorecase[ic]

尋找時不分大小寫,這對中文會造成困擾。預設 off。

9.3.0.17 incsearch[is] (Vim 才有)

加強式尋找功能,在鍵入 patern 時會立即反應移動至目前鍵入之 patern 上。預設 off。

9.3.0.18 hlsearch[hls] (Vim 才有)

尋找時,符合字串會反白表示。預設 off。如果您是使用 vim 的預設的 vimrc 檔的話,可設在 F8 鍵來切換。

9.3.0.19 textwidth[tw]

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

9.3.0.20 wrapmargin[wm]

和 textwidth 作用相同,只是是從右視窗邊向左算起要幾個字元起折行。預設是 0。

9.3.0.21 wrap

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

9.3.0.22 wrapscan[ws]

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

9.3.0.23 paste (Vim 才有)

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

9.3.0.24 ruler[ru] (Vim 才有)

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

9.3.0.25 statusline[stl] (Vim 才有)

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

9.3.0.26 shiftwidth[sw]

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

9.3.0.27 tabstop[ts]

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

9.3.0.28 showcmd[sc]

在狀態列顯示目前所執行的指令,未完成的指令片段亦會顯示出來。

9.3.0.29 showmode[smd]

在狀態列顯示目前的模式,例如是 Insert mode 或是 Visual mode。當然平常的 normal mode(commond mode)是不顯示的。在載入檔案的同時,會在這個地方顯示檔案名稱及其總行數、總字元數。

9.3.0.30 viusalbell[vb] (Vim 才有)

以螢幕閃動代替 beep 聲。

9.3.0.31 number[nu]

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

9.3.0.32 list

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

9.3.0.33 swapfile[swf] (Vim 才有)

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

9.3.0.34 fileencoding[fe] (Vim 才有)

首先,先鼓掌一下,啪啪啪……,因為有支援 Taiwan,也支援 XIM,也就是說可以使用 xcin-2.5x 來作輸入,當然您用 xcin-2.3x 配合 XA 也是可以啦!但前提是您要把 multi_byte 編譯進去,這在一開始就講過了。預設是使用 ansi。set guifont 及 set guifontset 已在一開始講過,在此就不重複了。

9.3.0.35 history[hi]

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


9.4 關於 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 不就得了!:-)

另一個更大的問題也來了!在 Un*x 系統的有些設定檔,例如 Makefile, snedmail 的設定檔,他們會認真正的 Tab,因此如果您有程式開發或系統管理的需要的話,最好是不要隨意更動 Tab 值,也不要使用 softtabstop,可以使用 Vim 獨特的 modeline 來控制,請繼續研讀下一節。


9.5 Vim 的 modeline

這個是什麼哇?簡單的說,Vim 有能力去解讀所編輯檔案內的 Vim 控制參數,而這些控制參數是寫在檔案的註解行裡頭的,例如 sh script 的註解行是以 # 來開頭的,那 Vim 的控制參數就可以寫在這些註解裡頭,Vim 在開這個檔的同時,也會去控制自己的一些行為,當然,包括了上一節所說的 Tab 的長短,而 shell 本身則會忽略這些註解。

例如,現在把一個 sh script 檔裡頭,在檔案最後一行,設了個: # vim: ts=2

這樣一來,按個 Tab,實際上顯示出來會只有兩個空格,別擔心仍然是正港 Tab ,不相信的話,可用另一種編輯器打開就知道了。這個好用吧!詳細請進入 vim 後 :h modeline。

當然,這個功能很方便,但並不是全然沒有限制的,以下有些限制要注意:

1. 控制 modeline 本身的設定,不能寫在檔案裡頭,vim 會來不及讀他。 例如:在 sh script 檔案中設定 # vim: set modelines=0 這是行 不通的。 2. 這些設定必須要在檔案的開頭五行,或結尾五行內設定,否則 vim 會忽略。 3. 註解符號後要至少一個空白(sapce 或 Tab 皆可)隔開。例如: /* vim:noai:sw=3 ts=4 */ => C 程式碼 /* 和 vim 間至少要有個空白 // vim:ts=2 => C++ # vim:ts=2 => sh script, perl, python, tcl " vim:ts=2 => vim script 


9.6 關於折行

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

在一般的文書排版處理,甚至是寫程式碼,設定系統的設定檔,這些時機,可能自動折行並不很適合(指會插入 EOL 的),很容易把寫好的內容,因為一個不小心就都弄亂了,因為程式一般是一行一行在讀的,把一整行分成兩半,所讀的結果就不一樣了,除非加入程式碼的折行標誌,例如一般的倒斜線9.1\ 或 TeX/LaTeX 的百分號 %。而在排版軟體如 TeX/LaTeX,插入 EOL 的折行,會造成中文字間多出個空白,這在 HTML 格式的檔案亦同,因此,在做折行的決定時,也請考慮一下其他的『副作用』。


9.7 我的設定檔

以下是我個人的設定檔,僅供參考用:

9.7.1 .vimrc 範例

" ~/.vimrc by Edward G.J. Lee " 這個記號就是 vim 的註解,通常情形 vim 會忽略。 " This code is Public Domain " set backspace=indent,eol,start set autoindent " always set autoindenting on set history=50 " keep 50 lines of command line history set ruler " show the cursor position all the time set showcmd " display incomplete commands set enc=big5 " 檔案編碼設成 big5 "使用 :update 代替 :w,以便在有修改時才會存檔,注意,這和 vi 不相容。 map <F2> :up<CR> map <F3> :up<CR>:q<CR> " 存檔後離開 map <F4> :q!<CR> " 不存檔離開 map <F5> :bp<CR> " 前一個 buffer 檔案 map <F6> :bn<CR> " 下一個 buffer 檔案 " 單鍵 <F7> 控制 syntax on/off。倒斜線是 Vim script 的折行標誌 " 按一次 <F7> 是 on 的話,再按一次則是 off,再按一次又是 on。 " 原因是有時候顏色太多會妨礙閱讀。 map <F7> :if exists("syntax_on") <BAR> \ syntax off <BAR><CR> \ else <BAR> \ syntax enable <BAR> \ endif <CR> " 按 F8 會在 searching highlight 及非 highlight 間切換 map <F8> :set hls!<BAR>set hls?<CR> " Toggle on/off paste mode map <F9> :set paste!<BAr>set paste?<CR> set pastetoggle=<F9> map <F10> <ESC>:read !date<CR> " 插入日期 map <F11> :%!xxd<CR> " 呼叫 xxd 做 16 進位顯示 map <F12> :%!xxd -r<CR> " 回復正常顯示 "Default backspace like normal set bs=2 "Display a status-bar. "set laststatus=2 "Show matching parenthese. set showmatch " 以下是顏色設定,詳細請 :h hi hi Comment term=bold ctermfg=darkcyan hi Constant term=underline ctermfg=Red hi Special term=bold ctermfg=Magenta hi Identifier term=underline ctermfg=cyan hi Statement term=bold ctermfg=Brown hi PreProc term=bold ctermfg=DarkYellow hi Type term=bold ctermfg=DarkGreen hi Ignore ctermfg=white hi Error term=reverse ctermbg=Red ctermfg=White hi Todo term=standout ctermbg=Yellow ctermfg=Red hi Search term=standout ctermbg=Yellow ctermfg=Black hi ErrorMsg term=reverse ctermbg=Red ctermfg=White hi StatusLine ctermfg=darkblue ctermbg=gray hi StatusLineNC ctermfg=brown ctermbg=darkblue set viminfo='20,\"50 " read/write a .viminfo file, don't store more " than 50 lines of registers " 方便中文重排設定 set formatoptions=mtcql " 設定 modeline " vim: ts=2: 

9.7.2 .gvimrc 範例

" ~/.gvimrc by Edward G.J. Lee " This code is Public Domain " set mousehide " 當輸入文字時隱藏 mouse map <S-Insert> <MiddleMouse> map! <S-Insert> <MiddleMouse> " Only do this for Vim version 5.0 and later. if version >= 500 let c_comment_strings=1 if !exists("syntax_on") syntax on endif hi Comment guifg=DarkBlue hi Constant gui=bold guifg=Magenta guibg=#fffff5f2eed8 hi Special guifg=Blue guibg=#fffff5f2eed8 hi Identifier gui=bold guifg=DarkCyan hi Statement gui=bold guifg=brown hi PreProc gui=bold guifg=black hi Type guifg=darkgreen hi Ignore guifg=bg hi Error guibg=Red gui=bold guifg=White hi Todo guifg=Blue guibg=Yellow hi ErrorMsg guibg=Red gui=bold guifg=White hi Normal guibg=#fffff5f2eed8 hi ModeMsg guifg=DarkBlue guibg=yellow hi StatusLine gui=bold guifg=lightgray guibg=DarkBlue hi StatusLineNC gui=bold guifg=lightgray guibg=brown hi Cursor guibg=green guifg=NONE hi lCursor guibg=Cyan guifg=NONE endif " 讓 ex(:) mode 時可以輸入中文(gvim) set imcmdline " 讓 xcin 在 insert mode 不自動出現(gvim) set imdisable 

9.7.3 .vim 目錄範例

其實,一些設定檔除了家目錄下的 .vimrc 及 .gvimrc 外,可以置放於家目錄下的一個子目錄 .vim,其目錄結構可以仿 $VIMRUNTIME 這個系統上的結構。例如,我的 .vim 結構如下:

edt1023:~$ tree .vim .vim |-- filetype.vim |-- plugin | |-- format.vim | `-- tex.vim |-- syntax | |-- lily.vim | `-- svg.vim `-- view `-- ~=+bg5.txt= 3 directories, 6 files 

其中,filetype.vim 會在系統的 filetype.vim 載入後蓋過去,也就是家目錄的會先優使用。format.vim 及 tex.vim 是進入 vim 馬上會載入的 Vim script,主要用於中文重排及 TeX/LaTeX 排版系統編輯時的方便指令、按鍵。lily.vim 則是 GNU LilyPond 這個樂譜排版系統檔案的語法顏色定義檔,svg.vim 則是 SVG 向量圖檔的語法顏色定檔加強版。那 view 那個子目錄下的又是什麼呢?這是下 :mkview 指令時所存的一些狀態檔,在 :loadview 要參考到,請參考第 11 章,第 11.1.3 小節,頁 ,這個檔是個隱藏檔。

相关阅读 更多 +
排行榜 更多 +
少女爱换装

少女爱换装

休闲益智 下载
百变英雄射击

百变英雄射击

飞行射击 下载
魔灵契约

魔灵契约

休闲益智 下载