Pythonの開発環境 on Emacs
前提
- Caskの使用をやめたので修正@2018/06/02
- 最低限として文法チェック、補完、REPLが使えれば良い。
- ipython notebook(Jupyter)は使わない。 (notebookはやっぱり慣れないのと、別にmarkdownは別ファイルに書けば良いし、図もEmacs内に埋め込み表示しなくてREPLでやれば良いように思う。)
- virtualenvを考慮してLintして欲しいのでelpyを使う。注意はpython3用にしておくこと、elpy自体だけで補完、lintする訳じゃないようなので,補間にはjedi, lintにはflycheck, flake8を入れる。
- 標準Yasnippetでもかなり使えるので、Yasnippetは絶対に使うべし。
補間のメモ
- flycheck(flymake)はLintツールをオンザフライで実行しているだけでLintツール自体は別に必要。flake8とかpylintがそれにあたる。
設定
- まず各種インストール
# aptで入れるもの $ sudo apt-get python3-pip ipython3 python3-tk virtualenv virtualenvwrapper $ sudo ln -s /usr/bin/ipython3 /usr/bin/ipython # pipで入れるもの $ pip3 install rope jedi autopep8 flake8 # Emacsで入れるもの $ (in Emacs) M-x package-install RET jedi RET $ (in Emacs) M-x jedi:install-server RET
- Emacsパッケージとして入れるものは,elpy, company(補完),company-jedi, flycheck(On-the-fly check)。
- Python用の.emacs設定を公開してくれているページを参考に.emacsを編集してEmacsを起動すると自動でインストールしてくれる(use-packageは別途入れておく)。
;; Python ;; Standard Jedi.el setting (add-hook 'python-mode-hook 'jedi:setup) (setq jedi:complete-on-dot t) ;; Use Company for auto-completion interface. (defun my/python-mode-hook () (add-to-list 'company-backends 'company-jedi)) (use-package company-jedi :ensure t :init (add-hook 'python-mode-hook 'my/python-mode-hook)) (use-package flycheck :ensure t :init (global-flycheck-mode t)) (use-package elpy :ensure t :defer 2 :config (progn ;; Use Flycheck instead of Flymake (when (require 'flycheck nil t) (remove-hook 'elpy-modules 'elpy-module-flymake) (remove-hook 'elpy-modules 'elpy-module-yasnippet) (remove-hook 'elpy-mode-hook 'elpy-module-highlight-indentation) (add-hook 'elpy-mode-hook 'flycheck-mode)) (elpy-enable) ;; jedi is great (setq elpy-rpc-backend "jedi")))
`
FLAKE8の特定の警告を無視する
- PEP8の警告は良いけど、一行80文字制限は逆に見難くなるので警告を止めたい。
- そんな場合に、~/.flake8ファイルに下記の様に書くと特定の警告を無視したり、一行の最大文字数などを設定できる。
[flake8] ignore = E226,E302,E41 max-line-length = 160 exclude = tests/* max-complexity = 10
最低限の使い方
# MISC M-x elpy-config : 設定の確認 # REPL C-c C-z : REPLバッファに移動 C-c C-c : バッファをREPLに送信 C-M-x : 現在のトップレベルのクラスまたは関数を送信 C-ENTER : カレントラインをREPLに送信 ;移動 M-. : 定義にジャンプ M-* : ジャンプ元に戻る M-, : M-*のジャンプ前に戻る C-x 4 M-. : 別ウィンドウ開いて定義にジャンプ