問題
こんな感じで、vimscriptの中にpythonのコード書けるじゃないですか。
python3<< EOS
defcheck(path):
print(path) # 何らかのチェックをしてると思ってくださいな
EOS
function! CheckSomething()python3<< EOS
import vimpath=vim.eval('expand("%")')check(path)
EOS
endfunction
で、こう書いた場合、 check()
はグローバルに定義される訳ですよね。
ついでに path
も、見た目上は CheckSomething()
内の変数ですがPythonの世界ではグローバルです。
なので、まったく別のプラグインのコードのどこかにpythonのコードが埋め込まれていて、そこで check
という名前の関数なり変数なりが定義されていたら、それを読み込んだ時点で上の CheckSomething()
は動かなくなってしまいます。
対応
グローバルでの名前の衝突を避けるために考えられる方法としてぱっと思いつくのはこんなとこでしょうか。
プレフィックスをつける
python3<< EOS
def hogeplugin_check():
"""以下略"""
EOS
クラスに包む
python3<< EOS
class PyHogePlugin:
@classmethod
defcheck(cls):
"""以下略"""
EOS
別のファイルにcheck()を定義してモジュールとして読み込む
python3<< EOS
import sys
sys.path.append(...) # 参照パスを適当に追加
import pyhogeplugin # pyhogeplugin.check()として呼ぶ
EOS
実際のところは?
と、上記のようなことをした方がいいんじゃないかと僕は思うのですが、有名どころのプラグインのコードを見てもその辺無頓着なのが多い気がします。
僕が考えすぎなのか、何か勘違いしているのか、やっぱり気をつけるべきなのか、よく分からないのでVimmerの人々に聞いてみたいところです。
※ python以外のif-XXXでも同じような話はあると思います