本節所用命令的幫助入口:
:help filetype
:help setfiletype
:help modeline
:help 'modelines'
:help 'shiftwidth'
:help 'expandtab'
:help autocmd
打開文件類型檢測功能很簡單,在你的vimrc中加入下面一句話就可以了:
filetype plugin indent on
如果你用的是VIM自帶的示例vimrc,那么你已經打開了文件類型檢測功能。或者,你也可以輸入“:filetype”命令查看你的文件類型檢測功能有沒有打開。
這條命令究竟做了什么呢?我們在下面詳細介紹。
其實,上面這一條命令,可以分為三條命令:
filetype on
filetype plugin on
filetype indent on
我們逐條介紹這三條命令。
“filetype on”命令打開文件類型檢測功能,它相當于文件類型檢測功能的開關。在執行“filetype on”命令時,VIM實際上執行的是$VIMRUNTIME/filetype.vim腳本。這個腳本使用了自動命令(autocmd)來根據文件名來判斷文件的類型,如果無法根據文件名來判斷出文件類型,它又會調用$VIMRUNTIME/scripts.vim來根據文件的內容設置文件類型。有興趣可以讀一下這兩個腳本,以獲得更深的認識。
在上述步驟完成后,絕大多數已知類型的文件,都能被正確檢測出文件類型。如果文件的類型未能被正確的檢測出來,就需要手工設置文件類型,這可以通過“set filetype”完成,例如,如果你把main.c改名為main.c.bak1,那么它就無法被正確檢測出文件類型。通過下面的Ex命令,就可以把它的文件類型設為c:
:set filetype=c或者,你可以在文件中加入一個模式行,來指明這個文件的類型。VIM在打開文件時,會在文件首、尾的若干行(行數由'modelines'選項決定,缺省為5行)檢測具有VIM特殊標記的行,稱為模式行。如果檢測到,就使用模式行中定義的選項值,來修改該緩沖區的選項。你可以留意一下VIM的幫助頁,每個文件的最后一行都是這樣的模式行。
針對上例,我們可以在main.c.bak1的第一行或最后一行加上下面的內容,要指定這個文件的類型:
/* vim: ft=c */這句話使用“/* */”注釋起來了,因此不會影響編譯。“ft”是“filetype”的縮寫,VIM中很多命令、選項都有縮寫形式,以方便使用。注意“/*”與“vim:”間的空格。在“*/”與“ft=c”間,也需要有至少一個空格,這是模式行格式的要求,更多信息參閱“:help modeline”。
檢測出文件的類型有什么作用呢?我們知道,不同類型的文件具有不同的格式,VIM通過對文件類型的識別,可以為不同類型的文件,設置不同的選項值、定義不同鍵綁定等。例如,對于c類型的文件,它就和bash腳本有不同的注釋格式、不同的縮進格式、不同的關鍵字等。VIM在設置文件類型后,會觸發FileType事件,執行FileType相關的自動命令,對不同類型的文件區別對待。
上面提到的“filetype plugin on”,允許VIM加載文件類型插件。當這個選項打開時,VIM會根據檢測到的文件類型,在runtimepath中搜索該類型的所有插件,并執行它們。
“filetype plugin on”命令,實際上是執行$VIMRUNTIME/ftplugin.vim腳本,有興趣可以讀一下這個腳本。這個腳本中會設置自動命令,在runtimepath中搜索文件類型插件。
runtimepath的定義在不同的系統上不一樣,對UNIX系統來說,這些路徑包括:$HOME/.vim、$VIM/vimfiles、$VIMRUNTIME、$VIM/vimfiles/after、$HOME/.vim/after。
舉一個例子,當我們對一個c類型的文件打開“filetype plugin on”時,它會在上述這幾個目錄的ftplugin子目錄中搜索所有名為c.vim、c_*.vim,和c/*.vim的腳本,并執行它們。在搜索時,它按目錄在runtimepath中出現的順序進行搜索。缺省的,它會執行$VIMRUNTIME/ftplugin/c.vim,在這個腳本里,會設置c語言的注釋格式、智能補全函數等等。
“filetype indent on”允許VIM為不同類型的文件定義不同的縮進格式。這條命令也是通過一個腳本來完成加載:$VIMRUNTIME/indent.vim。和“filetype plugin on”類似,它也通過設置自動命令,在runtimepath的indent子目錄中搜索縮進設置。對c類型的文件來說,它只是打開了cindent選項。
我們了解了文件類型檢測的用途及它是如何工作的之后,就可以根據自己的需要,來對特定的文件類型進行特殊設置。
例如,我們在上篇文章中介紹過lookupfile插件,在它打開一個緩沖區時,會把緩沖區的filetype設置為lookupfile,我們可以利用這一點,在這個緩沖區里進行一些特殊的配置。例如,我們創建一個名為lookupfile.vim的文件,其內容為:
" close lookupfile window by two <Esc>
nnoremap <buffer> <Esc><Esc> <C-W>q
inoremap <buffer> <Esc><Esc> <Esc><C-W>q它定義了兩個局部于緩沖區的鍵綁定,無論在normal模式還是插入模式,只要連按兩次ESC,就關閉當前緩沖區。
把這個文件保存到你的runtimepath所指向任一目錄的ftplugin子目錄中(一般是放在~/.vim/ftplugin目錄中)。你在下次打開lookupfile窗口時,試試連按兩次ESC,是不是lookupfile窗口就關閉了?這樣設置,非常適合VIM中按ESC取消命令的習慣,效率也高。
如果你對VIM缺省文件類型插件的設置不太滿意,那么可以把這個全局插件拷貝到$HOME/.vim/plugin目錄中,然后更改其中的設置。你可以留意一下VIM缺省的文件類型插件,它們的頭部都有這樣的代碼:
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
finish
endif這類似于C語言頭文件中的“#ifndef XXX | #define XXX”的語句,可以防止該插件被執行多次。因此,把這個插件拷貝到$HOME/.vim/plugin中(這個目錄在runtimepath中排在最前面),它將先于VIM的缺省插件被加載;而它加載后,VIM的缺省文件類型插件就不會再被加載了。這就達到了我們修改設置的目的。
不過我們通常不用這種方法。如果這樣做,一旦VIM的缺省插件做了改變,我們也要更新我們改過的插件才行。我們可以在載入全局插件以后否決一些設置。在Unix 上,我們可以把我們的設置放在~/.vim/after/ftplugin/目錄中,這個目錄中的腳本會在VIM的缺省腳本后執行。這樣就可以修改配置,或增加我們自己的定義。
舉個例子,在多人一起開發項目時,為了使代碼風格盡量保持一致,一般不允許在代碼使用TAB符,而以4個空格代之。我們可以編輯一個文件,包含下面的內容:
set shiftwidth=4
set expandtab把這個文件保存為~/.vim/after/ftplugin/c.vim。這樣,每次在編輯c文件時,它的自動縮進為4個空格;當你在插入模式下使用CTRL-D、CTRL-T縮進時,它也會調整4個空格的縮進;當你按TAB鍵時,它將會插入8個空格……如果你想上面的設置對h文件也生效的話,需要把它另存一份:~/.vim/after/ftplugin/cpp.vim,因為h文件的文件類型被設為cpp。
我們知道,VIM在設置文件類型時,會觸發FileType自動命令,因此,上面的例子可以用下面的自動命令來實現:
autocmd FileType c,cpp set shiftwidth=4 | set expandtab把這個命令放在你的vimrc中,可以起到和上例同樣的效果。
來自:
http://blog.csdn.net/easwy/archive/2007/03/20/1534580.aspx