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

formatoptionsを設定するためのvim plugin書いた

vim vimplugin

前置き

vimでのテキストの自動折り返しや、改行時のコメント開始文字自動挿入がうっとおしかったので、.vimrcでformatoptionsに設定したんですが、うまく設定されませんでした。

どうやら、.vimrc読み込み後、filetypeが切り替わった際に、$VIMRUNTIME/ftplugin配下のファイルが読み込まれ、ここでformatoptionsが上書きされてしまっているようです。

回避策として、.vim/after/ftplugin配下に設定したいfiletypeのファイル(cならc.vimなど)を作成し、そこでformatoptionsを設定すれば、うまく設定できます。例えば、以下の様な感じ

setlocal fo-=t fo-=c fo -=r fo-=o " foはformatoptionsの省略形

ただ、上記設定をファイルタイプごとに用意するのは大分面倒です。

しかたがないので、上記を実現するvim pluginを作成しました。
formatoptions設定するだけだと芸がないので、ftpluginロード後に任意のコマンド(.vimrcで設定)を実行できるようにしてます。

インストール方法

githubに置いているので、.vim配下にコピーしてください。
deris/vim-loadafterft · GitHub

Vundleや、NeoBundleなどのpluginを使えば、.vimrcに以下のように記載してインストールすればOK。(以下はVundleを使った例)

Bundle 'deris/vim-loadafterft'

設定方法

デフォルトでは何もしないので、.vimrcに設定する必要があります。
以下ように変数の設定を.vimrcに記載すれば、ftpluginロード後に設定したコマンドを実行できます。

let g:execcmd_after_ftplugin = {
  \    '_': [
  \        'setlocal fo-=t fo-=c fo-=r fo-=o',
  \    ],
  \    'c': [
  \        'setlocal fo-=t fo-=c fo-=r fo-=o',
  \    ],
  \    'perl': [
  \        'setlocal fo-=t fo-=c fo-=r fo-=o',
  \    ],
  \}

上記は、filetypeをキーとした辞書(ハッシュ)です。上記の様にfiletypeごとに実行したいコマンドのリストを指定することで、ftpluginロード後に指定したコマンドを実行することができます。
'_'は特殊な設定で、どのfiletypeにでも実行されます。'_'とfiletypeの両方を指定した場合は、'_'に指定したコマンドを実行した後に、filetypeごとのコマンドを実行します。(上記例ではいずれも同じコマンドを指定しているのであまり意味が無いです。あくまで例なので)

また、filetypeごとに読み込まれるファイルはftplugin以外にも、indent、syntax、ftdetectなどがあります。
(各ディレクトリの説明はここが詳しいです。)

私の環境では、indent配下のファイルでformatoptionsを設定しているものがあったので(phpなど)、indentロード後に実行するための変数も用意しました。

let g:execcmd_after_indent = {
  \    '_': [
  \        'setlocal fo-=t fo-=c fo-=r fo-=o',
  \    ],
  \    'php': [
  \        'setlocal fo-=t fo-=c fo-=r fo-=o',
  \    ],
  \}

syntax、ftdetectはとりあえず必要性を感じなかったので、用意していません。

終わりに

.vimrc読み込み後に、ftpluginがロードされるのはどうなんだろう。ロード順は仕方ないにしてもせめてautocmdのイベントが用意されていれば。。。実は知らないだけで何か方法があるのかなぁ。

8/26 追記

上記の様なことをやりたいだけであれば、FileTypeイベントでいけるみたいです。
(thincaさんにコメントで教えていただきました。ありがとうございます。)
以下の様な感じでいけると思います。

augroup mycustomfiletype
  autocmd!
  " FileType共通で設定したければ
  autocmd FileType * setlocal fo-=t fo-=c fo-=r fo-=o
  " FileTypeごとに設定したければ
  autocmd FileType vim setlocal fo-=t fo-=c fo-=r fo-=o
  autocmd FileType c setlocal fo-=t fo-=c fo-=r fo-=o
  autocmd FileType perl setlocal fo-=t fo-=c fo-=r fo-=o
augroup END

いそいそ作ったんですけど無駄になっちゃいました。なんか他に使い道あるかなぁ。ないよなぁ。。。