LoginSignup
21
17

More than 3 years have passed since last update.

Vim で Python の開発環境を構築する (with language server)

Last updated at Posted at 2020-12-10

普段は、ほぼバニラ 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 で実行できます。

下記は、たくさん空行を作って怒られている例です。

2020-12-06-23-47-04.png

status line に linter のメッセージを表示する

.vimrc に下記を設定しておくと、警告がステータスラインに表示されるようになります。

let g:lsp_diagnostics_echo_cursor = 1

2020-12-07-01-05-10.png

linter の設定

デフォルトの configuration source は、pycodestyle が使われます。

下記のように設定することで、flake8 の設定値を使うように設定できます。

let g:lsp_settings = {
\   'pyls-all': {
\     'workspace_config': {
\       'pyls': {
\         'configurationSources': ['flake8']
\       }
\     }
\   },
\}

こうすることで、flake8 の設定値を使って pycodestyle と pyflakes を動かすようになるようです (直接 flake8 は使われない) (ref)。

フォーマットを行う

下記のコマンドで、開いているファイルを format (整形) できます。

:LspDocumentFormat

2020-12-07-01-08-39.png

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 の候補が表示されます。

2020-12-07-01-29-50.png

ここでは test を選んで enter します。

名前を入力して enter すると、下記のように unittest のテンプレートが出現します。

2020-12-07-01-31-51.png

もっと詳細な使い方を知りたい方は下記を御覧ください。

その他 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 書きましょう!

21
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
17