CONAN ZONE

          你越掙扎我就越興奮

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            0 Posts :: 282 Stories :: 0 Comments :: 0 Trackbacks

          本節所用命令的幫助入口:

          :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

          posted on 2009-04-08 21:49 CONAN 閱讀(596) 評論(0)  編輯  收藏 所屬分類: VIM
          主站蜘蛛池模板: 游戏| 名山县| 慈利县| 兴海县| 平舆县| 安达市| 南宁市| 瑞丽市| 麦盖提县| 佳木斯市| 河源市| 延边| 克什克腾旗| 仪征市| 密山市| 临汾市| 卓尼县| 达州市| 洪湖市| 内丘县| 九寨沟县| 瓮安县| 邳州市| 兴文县| 屏南县| 丰原市| 茌平县| 藁城市| 奉节县| 河北区| 七台河市| 鹤峰县| 夏河县| 黄骅市| 嘉荫县| 图们市| 诸城市| 随州市| 新安县| 浦城县| 瑞安市|