Python の Flake8 と Mypy のプラグイン作った

tl;dr
Flake8 と Mypy のチェックが動く Vim プラグイン作った。


Flake8 のプラグインは何個あるんだって感じだが、GitHub - kevinw/pyflakes-vim: on the fly Python checking in Vim with PyFlakespyflakes-vim はとっくに deprecated だし、Python3 の type-hint な文法は解釈できないし、既存の Flake8 なプラグイン(Syntactic, neomake) は保存をしないとチェックが走らないし、Syntactic に至っては遅いし、khuno.vim は保存しなくてもリアルタイムにチェックしてくれるが、QuickFix 使わず独自のバッファでエラーリスト管理してるし、どれも気に入らないから結局自分で作った。
GitHub - heavenshell/vim-snowflake: An asynchronous Python source code checker for Vim.

特徴

例によって job と channel で動作している。
デフォルトは Flake8 だが、frostedpylama もパーサー書けば動く。
Flake8 は stdin から受け取るオプションがあるので、バッファをそのまま流し込んでるだけ。
そのため保存しなくてもチェックが走る。
InsertLeave や TextChange あたりに autocmd を設定すれば良い。
Python3 な venv で Flake8 を入れたら当然 type-hint なものもエラーではなくて、解釈してくれる。

MyPy

せっかく type-hint が正しく通るようになったから、型チェックもやらしたい。
現状 Mypy で Vim と言ったら @_achiku さんの以下のエントリにあるよう、Syntactic を使うしか無い模様。
https://akirachiku.com/post/2015-11-04-syntastic-mypy/


Mypy にはオプションに stdin はなく、Guido 御大も stdin オプションをつけたく無いと言われてるので、入ることはなさそう。
Feature request: checking files on stdin · Issue #2119 · python/mypy · GitHub
その代わりに `--shadow-file` というドキュメントに書いてない隠しオプションあるから、そっち使ってねとある。
Feature request: checking files on stdin · Issue #2119 · python/mypy · GitHub


`-shadow-file` の説明はソースコード内に書いてある。
mypy/main.py at master · python/mypy · GitHub

cp app.py tmp.py
mypy --incremental --silent-imports --show-column-numbers --shadow-file app.py tmp.py 

と動かすと、チェックされない。

mypy: error: Missing target module, package, files, or command.

正しく動かすには以下のようにする。

mypy --incremental --silent-imports --show-column-numbers --shadow-file app.py tmp.py app.py

チェックする対象のファイルが必要な模様。
app.py を指定してるんだからそれで良さそうなのに、コード読むと必要みたい。


tmp.py には Vim のバッファの内容を読み取って、 `tempname()` でテンポラリにファイルを作成したやつを指定する。


これで type-hint な Python コードも静的チェックができるようになった。
アンドキュメントなやつだし、使えなくなる可能性高いけど便利。


実際に Flake8 と Mypy を同時に job を使いつつ TextChange イベントとかでフックすると重そうだけど、実際のプロダクト書くときに使ってみてドッグフーディングしてみる。


こういうツールを作ってる人にはエディタからの連携が楽になるので是非 stdin をサポートしてほしい。