python-mode on emacs 環境向上計画

Pythonソースコードを書く際、最近はめっきり X11 gnome + emacs + python-mode + pycomplete + cedet + ecb な開発環境でのですが、このpython-modeの使用感に微妙な違和感があるのでカスタマイズしてみました。

ちなみに、Eclipse + PyDEV plugin + WTP plugin という開発環境もありだと思いますが、いろいろトータルで見るとこっちの方がプログラムを書いてて楽しげです。

問題

py-help-at-point および python-execute-* 関数を呼んだときに以下の問題がある

  • カーソルのフォーカスが*Help*や*Python Output*バッファの方に飛んでしまう
    • ヘルプ表示やコードを実行した後、すぐにコーディングに戻れない(C-x oが必要)ので、ストレスがたまる
  • 実行した結果のデータサイズがどんなに小さくても、新規windowはフレームの半分のサイズで開いてしまう
    • 直前のコーディングしていたウィンドウが半分のサイズになるので見づらくなる、最小限の大きさで開いて欲しい

解決方法

.emacs に以下のコードを追加します。

(defadvice py-execute-region (around my-py-execute-region)
  "back to the original buffer when py-execute-region finished."
  (if (get-buffer "*Python Output*")
	  (kill-buffer "*Python Output*") 
	nil)
  ad-do-it
  (shrink-window-if-larger-than-buffer)
  (other-window -1)
)

(ad-enable-advice 'py-execute-region 'around 'my-py-execute-region) 
(ad-activate 'py-execute-region)

結果

  • コマンドを実行した結果の出力のデータに合わせて、新しく開くWindowのサイズを自動調節します
  • ヘルプを表示した後や、ソースコードを実行した後でも、カーソルのフォーカスはちゃんとソースコード側にあります

感想

これを実装するにあたって、Emacs Lispをちょっと勉強して感じたのですが、Emacs Lispでの関数のアドバイス機能(http://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp_17.html)は、プログラムにすばらしい柔軟性をもたらしますね。関数型言語が注目されてきている理由が少し理解できた気がします。こういった処理をオブジェクト指向言語で実装するとしたら、スマートにやる方法はちょっと思い浮かびません。

備考

sourceforge.netで開発されているpython-mode.elはなぜかpy-help-at-pointが動かないので、私はpython.orgで配布しているPython 2.4.3に付属してくるpython-mode.el (Revision: 34960)を使ってます。

今後の展望

py-complete, senator-complete-symbol, dabbrevの統合とか。
emacs上でPythonソースコードの補完入力をやるには上記3つのアプローチがあるのですが、これらはそれぞれ一長一短です。

  • senator-complete-symbolは基本的に編集中のソースコードの静的解析なので クラスのインスタンス変数などは補完が不可能。また、sys.path以下の標準モジュールなどの補完も不可能
  • py-completeは逆に、編集中のソースコードのように、sys.pathにないソースコードのコードの補完が不可能
  • dabbrevソースコード字句構造を解析しない単なる単語補完なので、精度が低め。でも上記2つの補完方式で駄目なときでもうまく補完できることもある。

なので、これらをシームレスに利用できたら便利なんじゃないかと。
要するに、ac-mode(http://www.taiyaki.org/elisp/ac-mode/)的なアプローチですね。