2020/01/30

python2 に依存した Vim plugin が無いか確認と修正対応をしたお話

2020/01/01(Wed) に python2 のサポートが終了しました。が、今の所私の周辺で問題は発生していません。

Neovim で :checkhealth を実行していると、まだ python2 provider が有効な事にふと気付きました。
「いつか python2 provider も消えるのだろうな」と悠長に考えたのが1つ目の感想。
「python2 に依存した plugin があったらマズいのでは」と思って焦ったのが2つ目の感想。
「問題は発生していない」と思っているけれど、本当にそうなのか念のために確認+対応したログです。


環境

  • OS: macOS Mojave 10.14.6
  • Neovim: 0.4.3
  • Python2: 2.7.16 (system builtin)
  • Python3: 3.7.6 (installed by homebrew)


has('python') している plugin が無いか確認

私は Neovim の plugin management に dein を使っています。
そして、plugin の install 先は ~/.config/nvim/dein を指定しているので、その先に cd して grep をかけてみます。
  • $ cd ~/.config/nvim/dein/repos/github.com
  • $ egrep 'has\(.python.\)' -R .
egrep のオプションの -R は、指定したディレクトリを起点に recursive に探索してくれます。
そして、渡しているディレクトリは '.' なので、 カレントディレクトリ以下の全てのファイルを対象にできます。

egrep で指定した正規表現は 'has\(.python.\)' です。これは
  • まず、 vim/neovim で特定の feature が有効か確認する方法として 'has' function があります。
  • そして python2 provider が有効かどうかは has('python') の実行結果で分かります。
  • 加えて考慮する事として、python を括る文字が ' と " のどちらかの問題があります。
    • これは面倒なので . にしました。 ['"] 2つなどでもOKです。
  • 最後に、'()' は egrep パターンマッチに使う記号なので \ でエスケープします。

さて、実行結果は以下のようになりました。
前後のソースを読んではいないので、 現段階では対応が必要かもしれない plugin 一覧とします。


一時的に python2 provider を無効にする

Neovim で :help provider とすると、各 provider の説明が確認できます。
その中には provider を無効化する方法も存在しており、 python2 の場合は
  • let g:loaded_python_provider = 0
と ~/.config/nvim/init.vim に書くと無効化できます。

なお、この状態で :checkhealth を実行すると
  • - INFO: Disabled (g:loaded_python_provider=0).
と表示されます。

さて、これで仮に python2 provider が消えた時状態を再現できました。
先程 egrep で見付けたプラグインの動作確認を行なった結果、
が動作しませんでした。


VimCalc 対応: VimCalc -> VimCalc3

安直に「VimCalc python3」で検索をかけてみます。
そうすると、fedorenchik/VimCalc3 が見付かりました。なお、 fork 元は本家の gregsexton/VimCalc です。
お試しでインストールすると、ほぼ同じ動作。ということで VimCalc3 に乗り換えます。


gundo.vim 対応: let g:gundo_prefer_python3 = 1

さて、二度目も安直に「gundo.vim python3」でググります。
そうすると bitbucket の issue のページがヒットしました。どうやら既に対応済みだったらしく
  • let g:gundo_prefer_python3 = 1
と書くことで python3 を利用するようです。動作確認もできたので、 gundo.vim はそのまま使う事にします。


まとめ

これで Neovim がいつ python2 provider を消しても大丈夫になりました。

蛇足ですが、対応した2つのプラグインは利用頻度が低く、 LazyLoad していました。
なので、仮に Neovim が python2 provider を消したとしても、気付くのに時間がかかった可能性は十分にあります。
それを排除できたので、備えあれば何とやら、ですね。