読者です 読者をやめる 読者になる 読者になる

neobundle管理しているpluginをfiletypeに応じて読む

実践vimを久しぶりに読んで知ったftpluginについてメモ。vimにもともと備わっている機能で読むファイルの種類に応じて設定を行う。

vimはファイルを開くとその拡張子や中身の記述などからファイルがどの種類かを検知する。
その検知したファイルの種類に応じて$VIMRUNTIME/ftplugin/の下にあるそれぞれのファイルを読み込んで設定を行っている。

ftpluginについての詳細はヘルプやこちらのページがとてもわかりやすい
http://whileimautomaton.net/2008/09/07213145


デフォルトの設定に加えて独自の設定を入れたい場合は以下の場所に設定ファイルを置く
~/.vim/after/ftplugin/.vim

~/.vimはデフォルトならruntimepathの先頭に設定されている
については例えばphpjavascriptなど

自分の.vimrcを見ると特定のfiletypeでしか必要のない設定がいくつも書かれていたのでその設定をftpluginに分けてみることにした

まずftpluginを使う前に.vimrcにすべて書く場合は例えば以下のようにできる

set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim                 
  call neobundle#rc(expand('~/.vim/bundle/'))
endif   

NeoBundle 'Shougo/neobundle.vim'
NeoBundle 'Shougo/neocomplcache'
autocmd FileType haskell NeoBundle 'eagletmt/ghcmod-vim'

filetype plugin indent on

.hsファイルを読み込んだときのみghcmod-vimが使えるようになる
各ファイルタイプに対して加えたい設定が少ないなら↑のように書くのが簡単で良さそう。
だが、数が多くなってくるとFileTypeに応じた処理ばかりで汚くなる。そのときにはftpluginによって設定を書くファイル自体を分けてしまえる。上の例を分けると以下のようにできる。

after/ftplugin/haskell.vim

filetype off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim                 
  call neobundle#rc(expand('~/.vim/bundle/'))
endif   

NeoBundle 'eagletmt/ghcmod-vim'
filetype plugin indent on

.vimrc

set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim                 
  call neobundle#rc(expand('~/.vim/bundle/'))
endif   

NeoBundle 'Shougo/neobundle.vim'
NeoBundle 'Shougo/neocomplcache'
filetype plugin indent on

これで.hsファイルをいじるときのみghcmod-vimが有効になる
neobundleなどのプラグインを読み込むときは一度filetypeをoffにしておく必要があるので忘れずに。
vimrcで一度読み込めばよいのかと思っていたが、neobundleの初期化設定をpluginにしたファイルにも入れる必要がある模様。今度neobundleがどんな処理でプラグインを読んでいるか調べてみようと思う。

今のところ、一つのfiletypeに対して加えたい設定が多くなってきたらftpluginとして分けるというのが良さそう