個人的な Python 用の Emacs の設定

本も書き終わって一段落ということで、個人的な Emacs の Python 開発環境についてまとめます。
環境は Ubuntu15.04 64bit、Emacs は 24.5 です。

Python のインストール

Python のインストールには Anaconda を使うのが楽です。
最小のセットだけでいいなら、代わりに Miniconda を使います。

Anaconda は 公式ページ からインストーラをダウンロードしてインストールします。

以下のようなコマンドで仮想環境を作っておきます。

$ conda create -n py35 python=3.5 anaconda

次に、作った環境を有効化し、

$ source activate py35

以下のパッケージを追加でインストールしておきます。

$ pip install flake8 importmagic yapf autopep8 ipdb

yapfatuopep8 はコードを PEP8 に準拠するように自動整形してくれるモジュールです。
ypaf の方がきれいにコードを整形するので、autopep8 はインストールしなくてもいいです。

importmagic はコードから必要なモジュールを判別し、import 文を追加・整理してくれます。
個人的には使いこなせていません…

ipdb モジュールは IPython でデバッグする際に使っています。
これでブレークポイントなどを設定することができます。

Emacs の設定

自分の Emacs の設定から、特に Python に関係あるところを抜粋します。

Elpy

Python 用の拡張には Elpy を使っています。
他の拡張と比較したことはありませんが、使用感は良好です。

インストールと基本設定

Elpy は Melpa からインストールできます。

M-x package-refresh-contents RET
M-x package-install RET elpy RET

Elpy を使うために、init.el には次のように記述しています。

;;; Elpy を有効化
(elpy-enable)
;;; 使用する Anaconda の仮想環境を設定
(defvar venv-default "~/anaconda3/envs/py35")
;;; virtualenv を使っているなら次のようなパス
;; (defvar venv-default "~/.virtualenvs/hoge")
;;; デフォルト環境を有効化
(pyvenv-activate venv-default)
;;; REPL 環境に IPython を使う
(elpy-use-ipython)
;;; 自動補完のバックエンドとして Rope か Jedi を選択
(setq elpy-rpc-backend "jedi")

Elpy の設定は M-x elpy-config で確認できます。
インストールし忘れたモジュールがないかなども確認できます。

基本的な使い方

Elpy の 公式ドキュメント からいくつか基本的な使い方について抜粋します

.py 拡張子のファイルを開けば、自動的にマイナーモードで Elpy が有効になります。

C-c C-c (elpy-shell-send-region-or-buffer) でバッファ(またはリージョン) のコードが IPython で実行されます。
C-<RET> (elpy-shell-send-current-statement) でカーソル位置のステートメントを評価します。

C-c C-d (elpy-doc) でカーソル位置のシンボル(が指すオブジェクト) のドキュメンテーション文字列が別ウィンドウに表示されます。
q や C-g でバッファを閉じられます。

また、M-. (elpy-goto-definition) でカーソル位置のオブジェクトの定義箇所にジャンプします。

Elpy はデフォルトでは company-mode での自動補完が有効になります。
コードの入力途中で自動で候補が表示されますが、M-C-i(M-<TAB>)で手動で候補を表示させることもできます。
M-n や M-p で候補を選び、C-m で決定します。
候補の選択中に f1 か C-d で候補のオブジェクトのドキュメンテーション文字列が別ウィンドウに表示されます。
また、C-w で候補のオブジェクトの定義箇所が表示されます。
company-mode の設定などについては Qiita の記事 emacs の補完用パッケージ company-mode などが参考になります。

C-c C-e (elpy-multiedit-python-symbol-at-point) でカーソル上のシンボルについて、複数ファイルに渡って同時に編集することができます。
M-x elpy-refactor-commit で変更を反映させます。
なお、バッファ内だけのシンボルの同時編集の場合には multiple-cursors を使用しています。

Flycheck

Elpy では構文、コーディングスタイルのチェックには Flymake か Flycheck を使用します。
デフォルトでは Flymake が使われますが、Flycheck を使用する場合は次のように設定しておきます。
(Flycheck を使用するなら Melpa からインストールしておきます。)

(when (require 'flycheck nil t)
  (remove-hook 'elpy-modules 'elpy-module-flymake)
  (add-hook 'elpy-mode-hook 'flycheck-mode))

個人的に Flycheck のキーバインドは次のようにしています。
(helm-flychecksmartrep も Melpa からインストールしておきます。)

(define-key elpy-mode-map (kbd "C-c C-v") 'helm-flycheck)
(require 'smartrep)   
(smartrep-define-key elpy-mode-map "C-c"
  '(("C-n" . flycheck-next-error)
    ("C-p" . flycheck-previous-error)))

C-c C-n (flycheck-next-error) や C-c C-p (flycheck-previous-error) でエラー箇所にカーソルが移動します。
smatrep のおかげで C-n や C-p で連続でジャンプできて便利です。

コードの自動整形

C-c C-r f (M-x elpy-format-code) でバッファ(またはリージョン) のコードを yapf を使って自動整形できます。
また、M-x elpy-autopep8-fix-code で同様に autopep8 によってコードを自動整形できます。
以下のように、yapf の方がきれいに整形されます。

  • 元のコード
x = {  'a':37,'b':42,

'c':927}

y = 'hello ''world'
class foo  (     object  ):
  def f    (self   ):
    return       37*-+2
def f  (   a ) :
  return      37+-+a[42-x :  y**3]
  • yapf で自動整形したコード
x = {'a': 37, 'b': 42, 'c': 927}

y = 'hello ' 'world'


class foo(object):
    def f(self):
	return 37 * -+2


def f(a):
    return 37 + -+a[42 - x:y**3]
  • autopep8 で自動整形したコード
x = {'a': 37, 'b': 42,

     'c': 927}

y = 'hello ''world'


class foo  (object):

    def f(self):
	return 37 * -+2


def f(a):
    return 37 + -+a[42 - x:  y**3]

個人的には使っていませんが、保存と同時にコードを整形したい場合は、Melpa から py-yapf か py-autopep8 を使用します。
例えば py-yapf を Melpa からインストールし、init.el に次の設定をしておきます。

(add-hook 'elpy-mode-hook 'py-yapf-enable-on-save)

インデントのハイライト

highlight-indentation でインデント(字下げ)をハイライトさせています。
ただ、全部のインデントがハイライトされていると見辛いので、カーソル位置のブロックのインデントだけ見えるようにしています。

(set-face-background 'highlight-indentation-face "#313131")
(set-face-background 'highlight-indentation-current-column-face "#777777")
(add-hook 'elpy-mode-hook 'highlight-indentation-current-column-mode)

その他

デバッグには ipdb をインポートし、ipdb を起動させたい箇所で set_trace 関数を呼び出します。

import ipdb
ipdb.set_trace()

最後に、なぜか Anaconda に含まれる curl で twittering-mode が使えなかったので、とりあえず以下のようにして対処しています。

(setq twittering-curl-program "/usr/bin/curl")

コメント

Comments powered by Disqus
書籍更新情報
2016-10-21
Pythonによる科学技術計算 基礎編
PDF版の販売を開始しました。
販売ページはこちら

2016-09-09
Pythonによる科学技術計算 基礎編
1.2版への更新が可能になりました。
サポートページはこちら
電子書籍
Pythonによる科学技術計算 基礎編
Kindle ストア、Leanpubで販売中です
Pythonによる科学技術計算 基礎編
PDF版の販売はこちら
同人誌
技術書典(2016/6/25)
Emacs/org-modeのPDF作成術
電子版をBOOTHで販売中です
Emacs/org-modeのPDF作成術
Share