[Vim] if_python のおかしな挙動
if_python を使っていたらおかしな挙動ではまったのでメモ。
if_python では vim.eval 関数を使えます。 vim.eval は引数に Vim script の式を取って、それを評価した結果を python の値として取得できます。
以下のコードでは、 Vim script の matchstr('', 'a') を評価した結果を表示します。
これを実行した結果として、空文字列('')が表示されることを期待しましたが、 None と表示されました。Vim のバグ?
python import vim python print repr(vim.eval("matchstr('', 'a')")) " Noneと表示される
普通に Vim script として評価した場合は期待通りの結果となります。 if_python で vim.eval したときだけなぜか None となってしまいます。
echo matchstr('', 'a') " 結果は空文字列となる echo type(matchstr('', 'a')) == type('') " 型は文字列型となっている
ちなみに、 matchstr が空文字列以外を返す場合は期待通りの動作となります。
python import vim python print repr(vim.eval("matchstr('a', 'a')")) " 'a'と表示される let g:str = '' python print repr(vim.eval("g:str")) " ''と表示される let g:str = matchstr('a', 'a') python print repr(vim.eval("g:str")) " Noneと表示される。一時変数に入れてもやっぱりだめ
回避策
とりあえず、 matchstr の結果に空文字列を結合することで期待通りの動作になりました。
python import vim python print repr(vim.eval("matchstr('', 'a') . ''")) " ''と表示される。期待通り