Emacs の Python 開発環境見直し

EmacsPython 開発環境を見直した。これまでは python-mode で pycomplete は動かすの諦めていたので、補完が動けばいいなと。

試行した結果、編集は python.el + ac-python で行い ropemacs もリファクタリングツールとして入れておく形に落ち着いた。Windows 8 + Cygwin 環境だが Emacs からは Windows 用の Python 2.7 系を使用。

以下インストール手順。インストール先は全部 ~/.emacs.d の下。gnupack の Emacs 24 にパスが通っている状態で作業。

auto-complete をインストール。http://cx4a.org/software/auto-complete/index.ja.html よりパッケージをダウンロード。

$ cd auto-complete-1.3.1
$ mkdir ~/.emacs.d/site-lisp/auto-complete-1.3.1
$ make install DIR='c:/opt/cygwin/home/lpubsppop01/.emacs.d/site-lisp/auto-complete-1.3.1'

Pymacs をインストール。

$ git clone https://github.com/pinard/Pymacs.git
$ cd Pymacs
$ make PYTHON="/cygdrive/c/Program\ Files/Python27/python.exe"
$ PYTHONPATH=c:/opt/cygwin/home/lpubsppop01/.emacs.d/lib/python/ \
/cygdrive/c/Program\ Files/Python27/python.exe setup.py install --home=~/.emacs.d

rope をインストール。

$ hg clone http://bitbucket.org/agr/rope/
$ cd rope
$ PYTHONPATH=c:/opt/cygwin/home/lpubsppop01/.emacs.d/lib/python/ \
/cygdrive/c/Program\ Files/Python27/python.exe setup.py install --home=~/.emacs.d

ropemacs をインストール。

$ hg clone http://bitbucket.org/agr/ropemacs/
$ cd ropemacs
$ PYTHONPATH=c:/opt/cygwin/home/lpubsppop01/.emacs.d/lib/python/ \
/cygdrive/c/Program\ Files/Python27/python.exe setup.py install --home=~/.emacs.d

ropemode をインストール。

$ hg clone http://bitbucket.org/agr/ropemode/
$ cd ropemode
$ PYTHONPATH=c:/opt/cygwin/home/lpubsppop01/.emacs.d/lib/python/ \
/cygdrive/c/Program\ Files/Python27/python.exe setup.py install --home=~/.emacs.d

yasnippet をインストール。

$ cd ~/.emacs.d/site-lisp
$ git clone https://github.com/capitaomorte/yasnippet

ac-python.el を http://chrispoole.com/project/ac-python/ からダウンロードして ~/.emacs.d/site-lisp に配置。

~/.emacs.d/init.el を以下のような感じに。

;; ------------------------------------------------------------------------
;; パス

;; (略)

;; exec-path に Windows 版 Python のインストールフォルダパスを追加
;; Cygwin の /bin よりも先に検索される必要あり
(when (and windows-nt-p (file-exists-p "C:/Program Files/Python27/python.exe"))
  (setq exec-path (cons "C:/Program Files/Python27" exec-path)))

;; (略)

;; exec-path を環境変数 PATH に反映
(setenv "PATH" (mapconcat 'identity exec-path ";"))

;; (略)

;; 環境変数 PYTHONPATH に ~/.emacs.d/lib/python を追加
;; Windows 環境では Windows 版を利用する想定(not Cygwin 版)
(let ((pythonpath (getenv "PYTHONPATH"))
      (additinal-directory (expand-file-name "~/.emacs.d/lib/python")))
  (setenv "PYTHONPATH" (if pythonpath (concat additinal-directory ":" pythonpath) additinal-directory)))

;; (略)

;; ------------------------------------------------------------------------
;; auto-complete

(require 'auto-complete-config)
(ac-config-default)
(setq ac-use-menu-map t) ; 補完ウィンドウで C-p, C-n で候補選択

;; ------------------------------------------------------------------------
;; Pymacs

(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-exec "pymacs" nil t)
(autoload 'pymacs-load "pymacs" nil t)
(eval-after-load "pymacs"
  '(add-to-list 'pymacs-load-path "~/.emacs.d/my-pymacs"))

;; Cygwin 版 Python の python は Cygwin スタイルのシンボリックリンクのため
;; NTEmacs からは実行できない。
;; 参照先の python2.6.exe を使用するようにする。
;; (when windows-p
;;   ;; (setq pymacs-python-command "python2.6") ; 環境変数 PYMACS_PYTHON がないとき使用
;;   (setenv "PYMACS_PYTHON" "python2.6"))

;; ------------------------------------------------------------------------
;; yasnippet

(require 'yasnippet)
(yas-global-mode 1)

;; ------------------------------------------------------------------------
;; ac-python

(require 'ac-python)

;; ------------------------------------------------------------------------
;; roopemacs

;; auto-complete による補完
;; (ac-ropemacs-initialize)
;; (add-hook 'python-mode-hook
;;           '(lambda ()
;;              (add-to-list 'ac-sources 'ac-source-ropemacs)))

;; ac-ropemacs-initialize を呼び出す場合はこちらは不要
;; 補完は ac-python で行う場合はこちらで
(add-hook 'python-mode-hook
          '(lambda () (ac-ropemacs-require)))

;; python-mode 開始時点でプロジェクトファイルが存在すれば開く
(add-hook 'python-mode-hook
          '(lambda ()
             ;; ロードのタイミングがいまいちわからないため単に存在チェック
             (when (fboundp 'rope-open-project)
               (cond ((file-exists-p ".ropeproject")
                      (rope-open-project "."))
                      ((file-exists-p "../.ropeproject")
                       (rope-open-project ".."))))))

試行錯誤中に気づいた点など。

  • CygwinPython でも補完までは何とかうまくいった(python-mode + pycomplete, python-mode + ropemacs で確認)が、ropemacs の rope-rename を試したら WindowsCygwin の混ざったパスを表示してファイルがない!とか怒られて折れた。/bin/pythonCygwin 方式のシンボリックリンクなのが今後も引っかかりそうなのもあり、諦めた。
  • python-mode だと ac-python がうまく動作しなかった。python-symbol-completions がない、というエラーは py-symbol-completions へのラッパーを定義すれば回避できた?が、妙に補完の動きがにぶく実用できそうになかった。
  • ropemacs の補完も上記のコメントアウトしてある設定で動きはしたが、補完の開始がスムーズでなかったり、ドットの後に補完が始まらなかったり。正しく動いているのかよくわからないが、ac-python がたいへん快適なのでそちらを使うようにした。
  • rope はファイルの先頭の coding 表記を読むようだが、それをそのまま Pythonunicode.encode に渡すため、utf-8 は OK だが utf-8-unix だとエラーになる。base/fscommands.py を確認したところ 2 行目までしか見てないようなので今後は 3 行目に書くようにして回避Python の処理系も 2 行目までしか見ないみたい。やりづらい。
  • PySmel と py-mode-ext というのもあるようだけど試していない。
  • flymake + pyflakes は試してみたい。

参考 URL: