2012/10/19

Recent entries from same category

  1. VimConf 2023 Tiny に参加しました
  2. Vim で Go 言語を書くために行った引越し作業 2020年度版
  3. Vim をモダンな IDE に変える LSP の設定
  4. ぼくがかんがえたさいきょうの Vim のこうせい 2019年 年末版
  5. VimConf 2019 を終えて

pythonの補完は、vimが標準で配布している物で事足りるかなーとか思ってたけど浅墓すぎた。
今日見つけた jedi-vim は良い。
davidhalter/jedi-vim - GitHub

Using the jedi autocompletion library for VIM.

https://github.com/davidhalter/jedi-vim
何が良いって精度が良い。そして標準配布の pythoncomplete がモジュールとそのモジュール内関数しか補完出来ないのに比べ、jedi は評価値を補完出来る。
そしてスゴイのが構文を仮実行しているのではなく、パースしている点。jedi というモジュールを使って、構文解析している。

davidhalter/jedi - GitHub

Awesome autocompletion library for python. It works.

https://github.com/davidhalter/jedi
なので例えば import time

class Foo():
  global time
  asdf = time
  
def asdfy():
  with open("foo.log""w"as f:
    f.write("fooooo")
  return Foo

xorz = getattr(asdfy()(), 'asdf')
xorz.
こんなコードを補完してもゴミファイルが出来たりしない。そして vim script で頑張る pythoncomplete に比べて速い!
上のコードから
さらに関数のヒントまで表示される。
ただ1点だけハマりポイントがあって、この ftplugin はオフィシャルの pythoncomplete とバッティングし得る。先に jedi.vim が読まれる場合、後の pythoncomplete.vim を読ませない為に autocmd FileType python let b:did_ftplugin = 1
この様に b:did_ftplugin を設定してやる必要があった(これは後でpull-req送るかも)。また quickrun のキーアサイン <c-r> ともバッティングするので最終的には jedi の為に以下の設定をした。
let g:jedi#auto_initialization = 1
let g:jedi#rename_command = "<leader>R"
let g:jedi#popup_on_dot = 1
autocmd FileType python let b:did_ftplugin = 1
このキーアサインは、関数名やクラス名をリネームする物で、名前変更後にインサートモードを抜けるとファイル内のシンボルが置き換えられる。調べてないが、構文解析しているので単なる置換ではなく正しいリネーム結果になるはず。試しに上記のコードで文字列内に xorz を埋め込み、xorz をリネームしてみたが文字列内の xorz が置き換わる事は無かった。すばらしい。
その他、pydoc が見れる機能やジャンプ機能もある。しばらく使ってみようと思う。

Posted at by