coursera で Python をつかう講座を 2 つとった.

もちろん Emacs で開発環境をつくったので, 構築メモ.

入力支援

python.el は公式, python-mode.el は Python コミュニティによって作成されたもの.

python

Emacs にデフォルトではいっているやつ.

python-mode

Python コミュニティによって作成されたもの.

ショートカットがまとまっている.

インデント設定

4 で設定.

(add-hook 'python-mode-hook
                   '(lambda ()
                        (setq indent-tabs-mode nil)
                        (setq indent-level 4)
                        (setq python-indent 4)
                        (setq tab-width 4)))

コードリーディング

helm-etags-plus

ダグジャンプ. ctags を利用する. そして, ctags を Emacs から利用するために, 最近は helm-etags-plus なるものを使っていたりする.

(require 'helm-etags+)
$ ctags -o TAGS *.py

swoop

ctags はメソッドの定義にはジャンプできるけど, 変数の宣言にジャンプできない.

変数の宣言に飛びたいときは, swoop が最近は大のお気に入り.

(require 'swoop)
(global-set-key (kbd "M-o")   'swoop)
(global-set-key (kbd "C-M-o") 'swoop-multi)
;; (global-set-key (kbd "M-o")   'swoop-pcre-regexp)
(global-set-key (kbd "C-S-o") 'swoop-back-to-last-position)

(define-key isearch-mode-map (kbd "M-o") 'swoop-from-isearch)
(define-key swoop-map (kbd "M-o") 'swoop-multi-from-swoop)

;; サイズ変更禁止
(setq swoop-font-size-change: nil)

imenu

関数一覧を表示する. そのままだと動かなかったので, いかのリンクを参考にした.

(semantic-mode 1)
(add-hook 'python-mode-hook
  (lambda ()
    (setq imenu-create-index-function 'python-imenu-create-index)))

リファクタリング

主に名前変更の Elisp を導入.

参考リンク:

anzu

インタラクティブな補完.

iedit

C-;から気軽に同じキーワードを編集できる.

Ropemacs

Python 用のリファクタリングツール.

コーディング支援

jedi

Python のオムニ補完 (かしこい補完) をしてくれる.

ac-python

auto-complete の python 強化版.

 (require 'ac-python)
 (add-to-list 'ac-modes 'python-2-mode)

quickrun

quickrun を利用すれば, python コードを Emacs から実行可能.

システムの version が 3 で, Emacs からは 2 を利用したいときは, 以下のようにすれば実行コマンドをオーバライドできる.

(quickrun-add-command "python"
		      '((:command . "python2"))
		      :override t)

静的解析

flymake

flymake でエラーチェックを実施. エラーチェックのエンジンに pyflakes を利用する.

   $ sudo pip install pyflakes

Emacswiki を参考に設定.

(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)))

さいごに

Environment

  • ArchLinux
  • Emacs 24.4

Special Thanks