もた日記

くだらないことを真面目にやる

Vimメモ : jedi-vimでPythonの入力補完

jedi-vim


github.com

Pythonを使う機会があったのでVimPythonの環境を整えてみる。
補完についてはjedi-vimというプラグインが良さそうなので試してみる。

インストール


前提条件

Vim+pythonコンパイルされている必要があるので下記コマンドで確認。Python3を使うため+python3/dynとなっていればよさそう(dynは動的リンクということらしい)。この状態だとVim:echo has('python3')を実行すると1が返ってくる。

$ vim --version | grep python
+cryptv          +linebreak       -python          +vreplace
+cscope          +lispindent      +python3/dyn     +wildignore

jedi-vimではjediライブラリを使用するので、jediをインストールしておく必要がある。pipの場合は下記コマンドを実行。ただし、このプラグイン以外にjediを使用する予定がないのであれば後で説明するgit submoduleとしてインストールする方法もある。

$ pip install jedi

また、関数パラメータ補完機能を使用するためにはVimのバージョンが7.3以上で、+concealとなっている必要があるとのこと。

$ vim --version | grep conceal
+conceal         +libcall         +profile         +viminfo


インストール方法

NeoBundleの場合は下記行をvimrcに追加。

NeoBundle 'davidhalter/jedi-vim'

deinの場合は下記行をdeinlazy.tomlなどに追加。

[[plugins]]
repo = 'davidhalter/jedi-vim'
on_ft = 'python'

そしてjediを個別にインストールする場合はjedi-vimディレクトリでサブモジュールの更新と初期化を行う。

$ git submodule update --init


インストールが成功していればVim:help jedi-vimでヘルプ画面が表示されるようになる(ヘルプが表示されない場合は:helptags {path/to/vimruntime}/docの実行が必要かも)。

f:id:wonder-wall:20170129154054p:plain

基本的な使い方


インストールが成功していればデフォルトの設定で動作が確認でき、以下のようにPythonのファイルを開いて.を入力すると補完候補が表示される。

f:id:wonder-wall:20170129155319p:plain

続いて文字を入力すれば候補が絞り込まれる。

f:id:wonder-wall:20170129155337p:plain

また、関数名の後で(を入力すると引数が表示される。

f:id:wonder-wall:20170129155626p:plain

FAQ



FAQがあったので見てみる。
https://github.com/davidhalter/jedi-vim#faq

docstringのポップアップを無効

補完時にdocstring(モジュール、クラス、関数などの説明文)のポップアップウィンドウ(前のキャプチャ画像で上部に表示されている)が表示されるが、無効にしたい場合はvimrcに下記行を追加。

autocmd FileType python setlocal completeopt-=preview


タブキーで補完

タブキーを押して補完したい場合はsupertabプラグインを使用するとよいらしい。
NeoBundleの場合は下記行をvimrcに追加してインストール。

NeoBundle 'ervandew/supertab'

タブキーを押しても補完できない場合や、補完の順番が逆になる場合は下記行をvimrcに追加。

let g:SuperTabContextDefaultCompletionType = "context"
let g:SuperTabDefaultCompletionType = "<c-n>"


補完が遅い

Numpyなどのライブラリの補完は1回目は時間がかかることがあるが、2回目以降は結果がキャッシュされるので高速に補完できるとのこと。

デフォルト設定


基本的な使い方はわかったのでデフォルト設定をヘルプで確認してみる。

項目 キー 説明
g:jedi#completions_command <Ctrl-Space> 補完開始
g:jedi#goto_command <leader>d Definition(またはAssignment)に移動
g:jedi#goto_assignments_command <leader>g Assignmentに移動
g:jedi#goto_definitions_command - 非推奨なので#goto_commandを使用
g:jedi#documentation_command <K> pydoc表示
g:jedi#rename_command <leader>r 変数リネーム
g:jedi#usages_command <leader>n 使用箇所表示
:Pyimport :Pyimport モジュールのオープン

上記のようにjedi-vimでは補完だけでなく定義への移動やpydocの表示などができる。
キー設定を変更したい場合は、

let g:jedi#completions_command = "<C-N>"

のようにvimrcに記述すればよい。

その他の設定値としては以下のものがあり、1の場合は有効化されている。

項目 デフォルト 説明
g:jedi#auto_initialization 1 自動で初期化
g:jedi#auto_vim_configuration 1 completeoptの設定
g:jedi#popup_on_dot 1 ピリオド(.)を入力したら補完
g:jedi#popup_select_first 1 補完候補の1番目を選択
g:jedi#auto_close_doc 1 プレビューウィンドウを自動で閉じる
g:jedi#show_call_signatures 1 関数の引数表示を有効化(2を指定すればコマンドラインに表示)
g:jedi#show_call_signatures_delay 500 関数の引数表示をするまでの時間(millisecondで指定)
g:jedi#use_tabs_not_buffers 0 定義移動などをタブで表示
g:jedi#squelch_py_warning 0 Vimが+pythonコンパイルされていない場合に表示する警告を無効にしたいときは1に
g:jedi#completions_enabled 1 補完機能を有効化
g:jedi#use_splits_not_buffers "" 定義移動などを分割で表示。"left", "right", "top", "bottom", "winwidth"を指定
g:jedi#force_py_version "auto" Python2, Python3の両方がインストールされている場合にどちらを使用するか指定
g:jedi#smart_auto_mappings 1 from module.name<space>と入力したときの補完を有効化
g:jedi#use_tag_stack 1 タグスタック機能を有効化

設定値を変更したい場合は、

let g:jedi#use_tabs_not_buffers = 1

のようにvimrcに記述すればよい。

補完以外の機能


定義へ移動

例えば、以下のようなファイル構成のときにfile1.pyfooにカーソルを置いて、<leader>dを押すと定義元のfile3.pybar()に移動するが、<leader>gを押すとfile2.pyfooに移動する。

# file1.py:
from file2 import foo

# file2.py:
from file3 import bar as foo

# file3.py
def bar():
    pass


pydoc表示

調べたい単語にカーソルを置いてKを押すとpydocが表示される。
f:id:wonder-wall:20170129211658p:plain

変数リネーム

リネームしたい変数にカーソルを置いて<leader>rを押すと、変数が削除されて挿入モードになる。そして、新しい変数名を入力して挿入モードを抜けると関連する部分がリネームされる。
f:id:wonder-wall:20170129212023p:plain

使用箇所表示

使用箇所を調べたい単語にカーソルを置いて<leader>nを押すとQuickfixにリストが表示される。

f:id:wonder-wall:20170129212835p:plain

入門 Python 3

入門 Python 3