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
;; 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-. : 別ウィンドウ開いて定義にジャンプ