python-mode + yasnippet + ropemacsで補完入力

前々からauto-completeの設定は他人任せというか、ほぼデフォルトで使っていたのだけれど、今日いじってやっとyasnippetとropemacsで大分いい感じになったので忘れない様にメモ

環境はubuntu 10.04 32bit + emacs 23.1.1

ただし、最初Ropeが読み込めなくてapt-getとeasy_installの両方でインストールしてるのであとでちゃんと確かめます。

とりあえずyasnippetは適当にインストールしてメニューバーに"YASnippet"がでてればauto-completeのユーザーマニュアル
http://cx4a.org/software/auto-complete/manual.ja.html
の6章を参考にしてac-sourcesにac-source-yasnippetを加えるコードをpython-mode-hookに引っ掛ければOK

(add-hook 'python-mode-hook
    (lambda ()
        (add-to-list 'ac-sources 'ac-source-yasnippet)))

問題はropemacsが提供してくれる補完候補で、この候補のリストをうまいこと貰えればac-source-yasnippet同様にac-sourcesに加えてやればいいんだけどここが最初あんまりうまくいきませんでした。

以下ちょっとつまづいたところ

もともと今のauto-compile-config.elにはropemacsとの協力の為のコードがちょっと書いてあるのです。(396行目(?)あたり)

それでEmacs-wikiにも
http://www.emacswiki.org/emacs/AutoCompleteSources
こんな記事があって”じゃあこのまんまやればいけんじゃん”と思ったのですがいけませんでした。この時点でpymacsやropeなどは一通りapt-getでインストールしていたと思います。

なので少し昔の記事なのですが
http://09-f9-11-02-9d-74-e3-5b-d8-41-56-c5-63-56-88-c0.com/2009/01/21/autocompleteel-python-code-completion-in-emacs/
を参考にして、現在はもう廃止された部分なんかを削りながらこちゃこちゃいじってたらなんとか動いたってのが以下です。

pymacs等のインストールも(元のやつをアンインストールせずに)この記事にそってインストールしちゃったのはまずかったと思っているので後日確認の記事を書きたいと思います。

とりあえず以下が.emacspython関連の部分です。

;;python-mode
(require 'python-mode)
(setq auto-mode-alist (cons '("\\.py$" . python-mode) auto-mode-alist))
(setq interpreter-mode-alist (cons '("python" . python-mode) interpreter-mode-alist))
(autoload 'python-mode "python-mode" "Python editing mode." t)


(add-to-list 'load-path "~/.emacs.d/vendor")
(progn (cd "~/.emacs.d/vendor")
       (normal-top-level-add-subdirs-to-load-path))

(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs")
(autoload 'pymacs-exec "pymacs")
(autoload 'pymacs-load "pymacs")

(pymacs-load "ropemacs" "rope-")
(setq ropemacs-enable-autoimport t)

(defun prefix-list-elements (list prefix)
  (let (value)
    (nreverse
     (dolist (element list value)
       (setq value (cons (format "%s%s" prefix element) value))))))
(defvar ac-source-rope 
  '((candidates
     . (lambda ()
	 (prefix-list-elements (rope-completions) ac-target)))))

(add-hook 'python-mode-hook
	  (lambda ()
	    (add-to-list 'ac-sources 'ac-source-rope)
	    (add-to-list 'ac-sources 'ac-source-yasnippet)))

いつだって無責任な記事ばかりですが今回はいつもより胡散臭いので万が一参考になさる方は重々注意して自己責任でおねがいします。

なんしか今日は現実逃避のためになんかソフトを作ろうとしてたんですが途中でつまったりしてるうちに適当にしてたpythonの環境をちゃんとしようとすることに逃げるという二重の逃亡の末こんなことになりました。