VimとPythonのバージョン

Sublime TextのPythonバージョンに端を発する問題がVimにあるのかを検証します。

Sublime Textが2から3に上がるのに際しプラグインを書くのに利用可能なPythonバージョンが2から3にあがり、既存のプラグインが利用できなくなる可能性がある問題がここ数日テキストエディタ業界を賑わしております。本記事では同様の問題がVimにあるのかを検証します。

最初に言っておきますが、VimはPython2とPython3に両対応しています。つまりPython2とPython3を同時に利用できるのです。特に+kaoriya版ではその機能を有効化してコンパイル&配布していますので、まずはやってみましょう。あ、もちろん別途Pythonがインストールされている必要はあります。

:py print(sys.version)
2.7.3 (default, ...

:py3 print(sys.version)
3.2.3 (default, ...

1つのVimからPython 2.7とPython 3.2(ちょっと古いですね)が使えることがわかります。加えて使い分けはコマンド名のレベルで行われていることもわかります。pyではPython 2.xに繋がり、py3ではPython 3.xに繋がるという具合ですね。

どちらのPythonが利用可能かはhas()関数でわかります。

:echo has('python')
1

:echo has('python3')
1

となればあとは py でPython 3.xが利用されることがなければ、既存のプラグインは誤ったバージョンのPythonで実行されることは無さそうです。

ちょっと手元で Python 2.x を無効化してコンパイル&実験して見ましょう。このへんをちょこっといじりまして… はいコンパイルできました。やってみましょう。

:echo has('python')
0

:echo has('python3')
1

:py print(sys.version)
E319: このバージョンでは...

:py3 print(sys.version)
3.2.3 (default, ...

この結果が示すのは、Pythonを利用したプラグイン作者の意図せぬバージョンでPythonスクリプトが実行されることは無い、ということです。互換性を大事にするVimらしいコマンド構成といえるでしょう。

ただし、現実問題としてVimがPython 3.xだけ有効化し2.xを無効化してしまったら、2.xをターゲットにして書かれたプラグインは動かなくなってしまいます。特にUbuntuなどでは既にそうなっているそうですね。その場合に起こるのは、pyが利用できないため E319 のエラーが発生するか、お行儀の良いプラグインなら has(‘python’) のチェックで穏やかなエラーを出すか、もしくは迂回ロジックが走る、ということになるでしょう。もっとクレバーなプラグインであれば既に3.xと2.x、両対応として作られているかもしれません。

ここまでは現状を見てきました。結果、Vimがコンパイル時にPython 2.xのサポートを切ってしまうと問題がある、ということはわかりましたね。となれば「Python 2.xのサポートを切ったのが誰の決定か」というところが根本的なポイントでしょう。少なくともVim本家の決定でないことはconfigureのヘルプを見れば明らかです。

$ ./configure --help
...
  --enable-pythoninterp=OPTS   Include Python interpreter. default=no OPTS=no/yes/dynamic
  --enable-python3interp=OPTS   Include Python3 interpreter. default=no OPTS=no/yes/dynamic
...

だから先の実例ではPython 2.xを使えなくしたのはディストリ(Ubuntu)の決定なのです。

さぁ、そろそろまとめに入りましょう。

  • Vim自体はPython 2.xとPython 3.xの両方に同時対応しています(仮にしていない箇所があれば直して取り込んでもらえます)
  • プレコンパイルバイナリがどちらに対応しているか(もしくは両方に対応しているか)はディストリ次第です
    • Linuxでは徐々に3.xのみ対応が増えると予想されます
    • Linuxなどで継続的に安定的に使いたいなら両対応バイナリを自分でコンパイルするのが良いかもしれません
    • +kaoriya版はPython 2.xのバイナリが公式に配布されている間は両対応としてコンパイルするつもりです
  • Pythonを利用したVimプラグインを作成している人たちへお願いします
    • 今から3.xでも動かせるよう、準備をしてください: has(‘python3’) をチェックし py3 コマンドを使ってください
    • has(‘python’) をチェックし、2.xが利用できない場合の動作を定義&確認してください

とこんなところでしょうか。なにか質問や報告があったらコメントかtwitterでお願いいたします。