普段は、ほぼバニラ vim を使うことが多いのですが、vim plugin を使って python 開発環境を構築することを目指します。
Language Server を導入
vim-lsp-settings は簡単に language server を導入できるプラグインです。
(注意: vim-lsp は Vim version 8 が必要です。 (ref))
vim-plug を使った install では .vimrc に下記を追記して
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
:PlugInstall
します。
今回は python の language server が欲しいです。
現在、 vim-lsp-settings がサポートしている python の language server は下記の 4 種類あります (ref)。
- pyls-all: (pyls with dependencies)
- pyls: (pyls without dependencies)
- pyls-ms (Microsoft Version)
- jedi-language-server
現在、一番 github star の多い pyls を使ってみることにします。
pyls は内部で、下記のツールを利用しています (ref)。
- Rope for Completions and renaming
- Pyflakes linter to detect various errors
- McCabe linter for complexity checking
- pycodestyle linter for style checking
- pydocstyle linter for docstring style checking (disabled by - default)
- autopep8 for code formatting
- YAPF for code formatting (preferred over autopep8)
pyls-all では上記すべての依存ツールも同時にインストールされます。
vim で下記コマンドを打って、インストール。
:LspInstallServer pyls-all
MacOS/Linux だと下記の箇所に language server がインストールされます (ref)。
$HOME/.local/share/vim-lsp-settings/servers
早速 install した pyls-all の中身を確認してみましょう。
$ ls $HOME/.local/share/vim-lsp-settings/servers/pyls-all/venv/bin/
activate activate.fish easy_install epylint isort pip3 pycodestyle pyflakes pyls python symilar
activate.csh autopep8 easy_install-3.7 flake8 pip pip3.7 pydocstyle pylint pyreverse python3 yapf
色々インストールされています。
lint の実行
:LspDocumentDiagnostics
で実行できます。
下記は、たくさん空行を作って怒られている例です。
status line に linter のメッセージを表示する
.vimrc に下記を設定しておくと、警告がステータスラインに表示されるようになります。
let g:lsp_diagnostics_echo_cursor = 1
linter の設定
デフォルトの configuration source は、pycodestyle が使われます。
下記のように設定することで、flake8 の設定値を使うように設定できます。
let g:lsp_settings = {
\ 'pyls-all': {
\ 'workspace_config': {
\ 'pyls': {
\ 'configurationSources': ['flake8']
\ }
\ }
\ },
\}
こうすることで、flake8 の設定値を使って pycodestyle と pyflakes を動かすようになるようです (直接 flake8 は使われない) (ref)。
フォーマットを行う
下記のコマンドで、開いているファイルを format (整形) できます。
:LspDocumentFormat
format 実行後、たくさんあった blank lines が削除されています。
ファイル保存時に自動で format を行う
以下を .vimrc に記載しておけばよいです。
autocmd BufWritePre <buffer> LspDocumentFormatSync
format が走るので vim が遅くなるかもしれないとドキュメントに記載あり (ref)。
その他 vim-lsp の機能
vim-lsp コマンド一覧 に記載されているように、定義ジャンプ、関数名の一括変更など他にも色々できます。
よく使うコマンドには、key mapping を設定すると便利です。
下記のプラグインを追加で導入することで、自動補完を使うことも可能です。
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
vim-sonictemplate で定形コードを瞬時に書く
vim-sonictemplate を使うことで、main 関数とか、unittest とか、定形のコードのテンプレート/スニペットを瞬時に出すことができます。
.vimrc に下記のように追加して
Plug 'mattn/vim-sonictemplate'
:PlugInstall
しましょう。
python の場合、5つのテンプレートが標準で用意されています (ref)。
新規ファイルを vim で開いて :Template <tab>
を打つと下記のように、class、main、test の候補が表示されます。
ここでは test を選んで enter します。
名前を入力して enter すると、下記のように unittest のテンプレートが出現します。
もっと詳細な使い方を知りたい方は下記を御覧ください。
その他 snippet ツール
いくつか snippet ツールを調べて試した上で vim-sonictemplate を採用したので、せっかくなので他の snippet ツールに関しても記載しておきます。
筆者は vim-sonictemplate が一番シンプルで使いやすいと感じました。
ultisnips
スニペット関連の vim plugin で、おそらく一番使われているのが、ultisnips です。
高機能みたいですが、python 依存があり、vim 本体が python 3 support enabled でないと使えません。
(今回は ultisnips は試していないので使用感はわからないです。)
xptemplate
xptemplate を試してみました。
<C-\>
の key-binding で自動補完の感覚で snippet を出してくれます。
全然関係ないですが、おそらく iterm の key 設定が原因で <C-\>
を打つと vertical line |
が出てくる現象に悩まされ、該当の設定箇所が全然見つからずハマっています (mac 標準の terminal により一時回避)。
まとめ
Vim で Python 書きましょう!