Humanity

Edit the world by your favorite way

modelineを無視してfoldexprを使う

id:thincaさんの作ったfoldexprをさっそく使ってみました。
vim_fold.vim 作った - 永遠に未完成


vimスクリプト向けのftpluginで、イイ感じにfolding*1を作ってくれるftpluginです。
すばらしいのですが、自分の環境では.vimrcとvimスクリプトファイルに書かれたmodelineが邪魔をします。
以下はどう邪魔をするか、またそれをどう無効にしたかのまとめです。

時間がない人のために

これさえ.vimrcに書けば大丈夫です。

autocmd vimrc FileType vim setlocal nomodeline

それか、神経質な人は以下のようなafter/ftplugin/vim.vimを作ってください。

let s:save_cpo = &cpo
set cpo&vim


if exists('b:undo_ftplugin')
  let b:undo_ftplugin .= ' | '
else
  let b:undo_ftplugin = ''
endif
let b:undo_ftplugin .= 'setl modeline<'

setlocal nomodeline


let &cpo = s:save_cpo

そして.vim/bundle以下に冒頭のthincaさんのプラグインを置けば終了、なはずです。

after/ftplugin/vim.vim がわからない人のために

なぜafter/ftplugin/vim.vimはこんなに長いかというと
cpoptionsの保存/復元とb:undo_ftpluginのためです。
.vimrcに書けばcpoptionsに関しては大丈夫なのですが
なぜ大丈夫かはこちらのはっちゃけた記事を読んでください。


b:undo_ftpluginについては最初の例では省かれています。
なぜb:undo_ftpluginが必要かというと、
こちらの記事を参照してください。
ちなみに記事はyyyy年mm月dd日に公開予定です。

modelineがわからない人のために

自分の.vimrcには以下のようにmodelineが書かれています。

" vim:set fen fdm=marker:

https://github.com/tyru/dotfiles/blob/8052db815b5fce2d1e81e79440417d5e0d79a4ca/dotfiles/.vimrc#L1

このmodelineはけっこういろんな人のvimスクリプトにあるはずで、
なぜかというとfen(foldenable)オプションとfdm(foldmethod)オプションを確実に設定させるためです。
設定なんて各人が適当に変えてる可能性があるので
foldmethodをセットして見た目を統一させようみたいな感じのアレです。


しかしthincaさんのプラグインも同じく
見た目を操作するものなのでバッティングしてしまいます。
この場合はmodelineの方が読み込まれるタイミングが後なので
modelineの設定がthincaさんのプラグインを上書きしてしまいます。


冒頭で言ったようにこのmodelineはvimスクリプトではよくあるので、
今から全部のmodelineを削除するなんてやってられません。
なら無視するようにしてしまいましょう。


というのが本記事の趣旨でした。

*1:厳密に言えばfoldingは+foldで作られた折り畳み、foldは+fold機能や折り畳むことそのものを指す語として自分は使っています