【一人 vimrc advent calendar 2017】autocmd FileType 時に設定を追加する場合の注意点【20日目】

一人 vimrc advent calendar 2017 20日目の記事になります。
前回filetype の設定に関する記事を書いたのですが、今回はそれに関係するお話。

autocmd FileType 等で設定するときの注意点

autocmd FileType などで『任意の filetype に対して』設定を行う際は基本的には『そのバッファでのみ』反映される設定を行います。
ですので、オプションやキーマップなどはすべてバッファローカルにして設定する必要があります。

オプションの設定

オプションを設定する場合は :set ではなくて :setlocal を使用します。

" なんかいろいろ設定
setlocal cindent
setlocal cinoptions+=:0
setlocal matchpairs+=<:>

ただし、オプションによってはバッファローカルではなくてグローバルでしか設定できないオプションがあるので注意してください。

キーマッピング

キーマッピングは引数に <buffer> を追加することでバッファローカルとして設定することができます。

" 最後に定義された include 箇所へ移動してを挿入モードへ
nnoremap <buffer> <Space>ii :execute "?".&include<CR> :noh<CR> o

Ex コマンド

Ex コマンドの場合は -buffer を追加します。

command! -buffer Hoge echo "hoge"

autocmd

autocmd の場合はちょっと手間で、augroup を利用します。

" filetype 用の augroup を用意する
augroup my-vimfiler
   " その augroup の <buffer> を削除する
    autocmd! * <buffer>

   " autocmd は <buffer> を追加して定義する
   " こうすることでバッファローカルの autocmd になる
    autocmd CursorHold <buffer> execute "normal \<Plug>(vimfiler_print_filename)"
"     autocmd CursorMoved <buffer> execute "normal \<Plug>(vimfiler_print_filename)"
augroup END

このようにグローバルの autocmd と同様に autocmd が2回設定されることを防ぐために augroup を利用する必要があります。

まとめ

  • オプションなどを設定する場合は何に対して設定するのか注意しよう


ちなみに1つのバッファで複数の filetype を切り替えて使う場合の注意点もあるんですが、気力が尽きたので機会があれば別に書きます…。