Hatena::ブログ(Diary)

Alone Like a Rhinoceros Horn

2012-01-12

Vim のプラグインを書きたいと思っている人は今すぐ :help write-plugin を読もう!

特に *use-cpo-save* のところ。プラグインのソースでよく見かける、

これ

let s:save_cpo = &cpo
set cpo&vim

と、これ

let &cpo = s:save_cpo

がなぜ必要なのかが書いてあるよ!

というか、行の継続を許容するためだったとか全然知らんかったw

ということで、このイディオム効用を勝手に誤解していた自分のプラグインでは、行の継続をばりばり使っているにも関わらず、正しく set cpo&vim していないソースが散見されたので、ここ数日それをせっせと直していました。あわわ(汗

これまでこの件でエラーの報告がきたことはないので、Vim を起動したら(意図せず) 'compatible' が ON になる、という条件*1のユーザーは極めて少ないんだとは思うけど、自作のプラグインを公開するものとして、所作は正しく身に付けておきたいものです(キリッ ( ← 数日前までできてなかった)

See also

*1Vimプラグインを拾ってきて自分の .vim に配置できて、なおかつ vimrc も gvimrc もない、という条件のユーザー。かなり想像しにくい。

tyrutyru 2012/01/13 17:41 .vimrc が見つかった時点でcompatibleはoffになるのでonになってるユーザは少ないかもしれません。
http://vim-users.jp/2010/10/hack179/

h1mesukeh1mesuke 2012/01/13 18:07 プラグインによってはロード時のチェックで 'compatible' がオンならロードをキャンセルして finish する流儀のものもありますね。'compatible' がオンということは、ユーザーは vi互換の動作を求めているので、Vim のプラグインはそもそもロードする必要がないし、されるべきでもない、ということのようです。

確かに、source の時だけ set cpo&vim しても、'compatible' がオンになっている時点で、(それが意図したものであるとするなら)ユーザーにプラグインを使う意志があるとは考えにくいので、'cpo' をどうこうする以前にそもそもロードしないのが正解ではないかと最近は考えたりしてます。

この辺、プラグインの作者によって流儀がバラバラで見ていて面白いですね。

h1mesukeh1mesuke 2012/01/13 18:13 Hack #179 を See also に追加しました。

tyrutyru 2012/01/17 02:38 確かに。
それと厳密にやるなら、set cpo&vimして終わりで復元しても、定義したExコマンド、コマンド、関数などを呼ぶ時もいちいち&cpや&cpoをチェックする必要があると思うんですよね。
そんなことをチラッと考えながらずっと見ないふりをして書いてきました...懺悔しますorz
自分も今度から&cpがオンだったらfinishするようにしようかなぁ...

h1mesukeh1mesuke 2012/01/17 03:17 >自分も今度から&cpがオンだったらfinishするようにしようかなぁ...

これ自分も迷いました。そうすべきかなとは思ったのですが、そこまでやってるプラグインって少ないし、プラグインのロードのキャンセルは -u NONE や --noplugin でできるし、一部のプラグインだけそうなってても意味ないんじゃないかと思って、結局やりませんでした。

揺るぎなき公式見解が欲しいところです。(*write-plugin* がそうなのだとすると、やっぱり必要ないんじゃないかなあ)

トラックバック - http://d.hatena.ne.jp/h1mesuke/20120112/p1
Connection: close