1
1

More than 3 years have passed since last update.

SpacemacsでPythonの自動補完やlinterなどを効かせる

Last updated at Posted at 2019-12-21

基本的には公式developブランチのドキュメントに従う感じで。

WSL2 Ubuntu18.04LTSでの下準備

たのんだ

cf. https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1

Windows10で直接やる場合の下準備

pyenv + pipenv

Pythonの仮想環境を使いたいので準備する。
pyenvでPythonバージョンを管理し、pipenvで依存ライブラリを管理する?

pyenvインストール

環境変数周りとか、詳しく解説されている。

pipenvインストール

使い方はこれとか良さそう (基本的にPipfile用意して pipenv installでよしなにやって頂ける)
https://qiita.com/subarunari/items/dcbdad68ba1809b721b9

依存ライブラリの準備

SpacemacsのPython Layerでは、主に以下のライブラリを使う (ので、諸々の機能を使うためには予めインストールしておく必要がある)

  • jedi: 自動補完の要
  • epc: emacs lispでjediと繋いでいるっぽい?
  • isort: 依存ライブラリを自動で並び替える
  • autoflake: 使われていないライブラリを検出する
  • flake8: pycodestyle + pyflakes + mccabe の動きをするらしい (参考 https://minus9d.hatenablog.com/entry/2018/10/22/235604)
    • pycodestyle: コードスタイルチェック
    • pyflakes: 静的解析 (未使用の変数を検出したり)
    • mccabe: 複雑製チェック
  • yapf: 自動フォーマッター
  • importmagic: 解決可能なライブラリの自動import
  • pytest: テストはこれ

開発用ライブラリなので、本番環境に適用したくない場合は pipenv install jedi -dのように -dオプションをつける。

もしPipfileに記載すらしたくない場合は、 pipenv shellで仮想環境のPythonに入ってから pip install jediのように直接インストールすればこっそり入る。

Spacemacsの設定

.spacemacs ( Space f e d)

諸々の機能を使う (フォーマットとかは保存時に実行される)。
python-backendはデフォルトだと anaconda、他に lspも選択できるらしい。

.spacemacs(抜粋)
dotspacemacs-configuration-layers
'(sql
  markdown
  ;; 上のsqlやmarkdownみたいな感じで以下を追記
  (python :variables
          python-backend 'lsp ; WSL2ならlsp, Winならanacondaのおきもち
          python-formatter 'yapf
          python-format-on-save t
          python-sort-imports-on-save t
          python-pipenv-activate t
          python-test-runner 'pytest)
 )

;; jedi追加
dotspacemacs-additional-packages '(jedi)

(defun dotspacemacs/user-config ()
  ;; python-modeで `jediによる自動補完`と `flake8`によるチェックを行う
  (add-hook 'python-mode-hook
            (lambda ()
              #'(flycheck-add-next-checker 'python-flake8)
              'jedi:setup))
)

もう1つ小話で、Spacemacs公式曰くデフォルトでflake8を使うみたいに書いてあるが、実際にはこちらで設定を加えないと機能しなかった :innocent:
(flycheck-add-next-checker 'python-flake8)でflycheckの設定に手を加える必要がある

cf. https://github.com/syl20bnr/spacemacs/issues/7568#issuecomment-451684259

Spacemacsでpython仮想環境を認識させる

python-pipenv-activate tについては、Macだとうまく動かなかったりして怪しい (仮想環境ではなくシステム側のPythonバージョンを見に行ってしまう)。
WSL2のUbuntu18.04LTSもダメだった :innocent: :innocent: :innocent:

Windows10では正常に動いているようで、謎。

jediで補完してくれたとしても、import文に対してflycheckが毎回 unresolved importエラーを吐くのはつらい。

直すためには、シンボリックリンクを張って .venvを生やせば良かったらしい。ありがたい。。。。。

~/でやる
ln -s .local/share/virtualenvs/ .virtualenvs
Pipfileがある作業ディレクトリでやる
echo "$(basename $(pipenv --venv))" > .venv

cf. SpacemacsのPython Layerにpipenvで構築した仮想環境を認識させる方法

pyrightのほうを使っても良さそう

cf. Spacemacsでpyrightを使う

Windows10: isortでdiffが使えなかったら

「Pythonファイルを上書き保存したのにisortが効かないな… *Messages*バッファを見たらdiffがないって言われるな…」な時。

Searching for program: No such file or directory, diff

「MSYS2 (またはCygwin)入れてるしGitではdiffが動いてるんだよなぁ」であれば、MSYS2から直に diffutilsを入れる。

c.f. diff を入れる。

そして、 .spacemacsの設定で diffがインストールされたディレクトリをパスに追加してあるか確認する。

パスが追加されていない場合、こういう問題が起こる (パスの追加方法も載せてある)

c.f. Windows10上のSpacemacsでunzipを使う(外部ライブラリへ定義ジャンプしたい)

Spacemacs側では C:\msys64\mingw64\binのほう (Hunspellとかが入っていた)を実行パスに加えていたので、 No such file or directoryと言われていた。

これを解決するため、Spacemacsに実行パス C:\msys64\usr\binも指定する。

.spacemacs ( Space f e d)の user-init()内に追記する。

おまけ

ipythonを使う場合

replでipython使いたいなってなったら、Spacemacsの設定に加える。
(デフォルトだと普通のpythonを使ってしまうので)

.spacemacs(抜粋)
(defun dotspacemacs/user-config ()
  ;; シェルを開く時pythonの代わりにipythonを使う
  (setq python-shell-interpreter "ipython")
)

参考 https://stackoverflow.com/questions/17817019/how-to-open-ipython-interpreter-in-emacs

Python Layerの設定だけでいい感じにやってほしいな。。。と思ったが、似たような問題で議論中の模様。
https://github.com/syl20bnr/spacemacs/issues/9321

1
1
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
1
1