disabling

何かを無効にするときには適当な global variable を定義するのが vim の流儀みたいなんだけど…、というあたりのまとめ。一応 :help write-plugin:help write-filetype-plugin にここらへんの流儀は書いてあるんだけどちょっと紛らわしかったり厳密にした方がいいかなというところがあったり一部 local rule があったりという感じなので。

まず plugin の無効化について。 Bram 氏は ( :help write-plugin してから /NOT LOADING ) plugin script の最初で "loaded_<plugin name>" ( "foo.vim" という plugin だったら "loaded_foo" ) が定義されているかを check してもし存在したらその時点で script の実行を終了させろ、といっているんだけどこれって字面だけ読むと二重読み込み防止の意味しか持ってないんだよね。でも .vimrc に例えば let loaded_foo = 1 と書いておくと foo.vim は読み込まれないので plugin 無効化にも使える、というだけで。

で、ここらへんの semantical なまぎらわしさがアレだと思ったのか ( もしかしたら以前の version ではこういう書き方を推奨していたのかもしれないけど ) kaoriya さんとこのについてくる plugin では "plugin_<plugin name>_disable" という変数を使っている。まぁこっちも plugin 無効化にしか使えないような名前なんだけど二重読み込みの防止は ":source" や ":runtime" で意図的に読み込ませない限り起こらないしひとの意図に合致しやすい名前なのでこちらのほうがいい気がする。

あーでもそもそも "disable" 「無効化」というのはすでに "enable" 「有効化」されてるものの影響を clear するという意味も含むのでちょっとアレかな…。うーん vim 自体が ":disable" という名前あたりで script name や ":scriptnames" で表示される番号 N を指定して無効化する ex command ( ftplugin における "b:undo_ftplugin" のような変数もしくは関数を評価する command ? ) を提供するというような level までいかないとここらへんの妄想はあまり意味がないか。

うだうだと長いこと書いてきたけど誰かの書いた plugin を使うひとはとりあえず plugin の無効化については "loaded_<plugin name>" を .vimrc に書けばいいということで。それでも無効にならないようなら他の変数名使ってようがそもそも check してなかろうが直に script 覗かないといけない、と。

次 mapping の無効化について。 :help write-filetype-plugin/MAPPINGS に書いてあるのは "no_plugin_maps" と "no_<plugin name>_maps" を check して定義されているなら mapping を登録しないようにしろ、ってことなんだけどこれは "no_plugin_maps" が ftplugin による mapping の登録の拒否で "no_<plugin name>_maps" が特定の ftplugin に mapping を登録しないように指示するもの。これはわかりやすいっちゃわかりやすいんだけど ftplugin だけじゃなくて plugin やそのほかの script でもこの check はすべきと思う。 command のみ欲しいとか自分で <Plug> を明示的に mapping したときのみ使いたいとかいう場面は考えられるので。

で、 Bram 氏のやり方はすべて「定義されているかどうか」で見ているので実は紛らわしかったりする。例えば example.vim という plugin があったとして "loaded_example" という変数が定義されていると読み込まれないわけなので let loaded_example = 0 と .vimrc に書くと読み込まれない。 loaded が false -> まだ読み込まれていない -> これから読み込まれるというわけではないことに注意。まぁここらへん厳密にやろうとすると 1 もしくは 0 ならいいのか "yes" / "no" や "on" / "off" ではダメなのかというあたりでここらへんを処理する autoload function を書きたくなってしまうわけだけどそんな primitive なところに依存性を持たせたくないというのが本音なわけで。ここは普通に Blam 氏流で定義されているか否かのみを見るという「慣習」ということで自分を納得させるのが一番楽かも。 plugin manager 的なものを vim が標準で提供してくれればいいんだけども。