EmacsのPython環境周りを最近整えたので自分のためのメモ。似たような情報は色々とネットに転がっているのだが、古いEmacs向けだったり、いろいろとやりすぎだったりというのもあったので、自分なりにシンプルにまとめてみた。
以下、Ubuntuでemacs24を使ってることを前提とする(Linuxならばそんなに変わらないかなと思うが)。python-modeとpackage.elはすでに入っているとする。python-pipがインストールされてて、~/.local/binにパスが通っていることも前提とする。
以下の順で説明する。
- 準備:package.elの設定
- 自動インデントの設定
- yasnippetのインストール
- py-autopep8のインストール
- auto-completeのインストール
- elpyインストール
- flymake関連のインストール
- 動作デモ(動画)
それぞれ独立なので、機能を理解して自分がほしい物を入れればいいと思う。
準備:package.elの設定
まず前提としてpackage.elで使うため、~/.emacs.d/init.elに以下を加える。
(require 'package) (setq package-archives (append '(("marmalade" . "http://marmalade-repo.org/packages/") ("melpa" . "http://melpa.milkbox.net/packages/")) package-archives)) (package-initialize)
自動インデントの設定
python-modeのときにEnterキー(またはC-h)を押すと、自動でいい感じにインデントしてくれるように設定する。
.emacs.d/init.elに以下の行を挿入する。
(add-hook 'python-mode-hook (lambda () (define-key python-mode-map (kbd "\C-m") 'newline-and-indent) (define-key python-mode-map (kbd "RET") 'newline-and-indent)))
自動インデントにすると、余計な空白が入ったままになることがよくあるが、後述するpy-autopep8で保存時に変換してくれるようにすると、そういう余計な空白は消えてくれる。
yasnippetのインストール
典型的なコードスニペットを入力しやすくするモジュール。これを入れると、例えば「ifm」と入力して[tab]を押すと、
if __name__=='__main__': main()
に自動的に変換してくれる。
インストールは、emacsから「M-x package-install」と入力して、次にパッケージを聞かれたら「yasnippet」と入力。
.emacs.d/init.elに以下を加える。
(yas-global-mode t)
py-autopep8のインストール
Pythonのプログラムを保存するときに自動的にPEP8準拠の形式に変換してくれるように設定する。
まずはシェルからautopep8をインストールする。
pip install --user autopep8
次にemacsを起動して「M-x package-install」と入力して、次にパッケージを聞かれたら「py-autopep8」と入力。
.emacs.d/init.elに以下を加える。
(add-hook 'python-mode-hook 'py-autopep8-enable-on-save)
auto-completeのインストール
Pythonに限らない入力自動補完のモジュール。
次にemacsを起動して「M-x package-install」と入力して、次にパッケージを聞かれたら「auto-complete」と入力。
.emacs.d/init.elに以下を加える。
(require 'auto-complete-config) (ac-config-default)
elpyのインストール
Pythonのオートコンプリートをしてくれるモジュールのインストール。くれる。
まずはPythonにropeとjediを入れる。
pip install --user rope jedi
次にemacsを起動して「M-x package-install」と入力して、次にパッケージを聞かれたら「elpy」と入力。
flymake関連のインストール
入力中にpyflakesを実行して、エラーを指摘するようにする。
まずはpyflakesをインストールする
pip install --user pyflakes
次に、emacsに「M-x list-packages」を使って、flymake, flymake-cursor, flymake-easy, flymake-python-pyflakesの4つのパッケージをインストールする。
最後に.emacs.d/init.elに以下を追加
(require 'tramp-cmds) (when (load "flymake" t) (defun flymake-pyflakes-init () ; Make sure it's not a remote buffer or flymake would not work (when (not (subsetp (list (current-buffer)) (tramp-list-remote-buffers))) (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "pyflakes" (list local-file))))) (add-to-list 'flymake-allowed-file-name-masks '("\\.py\\'" flymake-pyflakes-init))) (add-hook 'python-mode-hook (lambda () (flymake-mode t)))
動作デモ(動画)
上記モジュールをすべて入れた状態で、実際に動かしたときの動作の動画を公開する。(みんな大好き)フィボナッチ数列を出力するプログラムを書いてから実行するまでの様子を示している。
参考サイト
EmacsWiki: Programming Python in Emacs
更新履歴
2015/7/29 py-autopep8についての記述が古くなったので、一部変更した(こちら参照)