とてもliteなpython用のemacsの設定

前書き(飛ばし読み推奨)

最近、ようやく、pythonで小さなコードを書くようになってきた。そして少し考え方が変わってきた。以前は、repl*1との連携を重要視してきたのだけれど、日常的なコードを書くのなら、もっと手軽な環境で十分なような気がしている。replと連携できることで得られるメリットは以下の2つだった(個人的)。

環境が保持できるメリットは、あまり考えずに書けること。方針が立たない内に必要そうな関数を書き殴る。replのインターフェイスに少しずつ式を食わせていく。書いた関数に値を渡して、結果を確認してみる。この繰り返しをしている内に、小さな関数の断片を組み合わせてある程度の規模のコード片を作り上げることができる。。

また、後者については、pythonのプロンプトを立ち上げて"dir({})"などと入力してみれば分かると思う。{}はdictオブジェクトで、dir()に渡すことで、{}が持っている関数(機能)が何なのか把握することができる。これをエディタ上から使うことができれば、現在書いているコードの環境の中で利用できる機能が何なのか調べることができるようになる。単純に言えば「今カーソルの上にあるシンボルが意味するものは何か?」という質問をエディタに投げかけることができる環境が手に入る。

以前までは、これらの機能がどうしても必要でなければ作る必要があると感じていた。そしてpython-ex.elというelispの拡張を書いていた。ただ、真面目にこれをつくろうとすると、最終的には複雑な実装になりやすく*2、保守が結構面倒くさい。(また、他人が使えるような品質を維持するのはとても面倒くさい)もっと軽い環境があっても良いのかもしれないと思った。

もっとliteなemacsの設定で十分なのかも?(python-ex -> python-lite)

単純に、pythonを使おうと思った時に必要になりそうなものをあげてみる。ここでの対象者は、「文法は把握しているが、どのようなモジュールを使えば良いのかよく分かっていない人」
少なくとも、ライブラリについての情報へアクセスする機能が必要だろう。その他必要そうな機能をリストアップしてみる。

  • import fooの補完(モジュールの補完)
  • pydocコマンドの利用(モジュールの補完)
  • 標準ライブラリに関してはpythonのonline-documentを引きたい。(モジュール補完)
  • 実行時のエラー箇所に飛ぶ。

実際の所、ほとんどの機能は、利用できるモジュールの補完機能さえあれば十分だということが分かった。また、最後の要求は"M-x compile"でpythonを実行すれば自然と手に入る。なので、compile関数のラッパーを書けば良いだろう。

モジュールのリストアップ

これは単にワンライナーで書ける。辞書順へのソートもsortコマンドに丸投げすれば問題ない。

python -c 'import pydoc; import sys; pydoc.ModuleScanner().run(lambda path,modname,desc : sys.stdout.write("%s\n" % modname))' 2>/dev/null | sort -u

code

一部、マクロを外部から持ってきたので行数が膨らんでしまったが、それでも100行足らず。これくらいの設定で十分なのかもしれない。
init.elの内容を.emacsに書き、python-lite.elはどこか読み込める場所に置いておけば良い。

使い方
  • f1でモジュールを選択してpydocを開く
  • f2でモジュールを選択してonline documentを引く
  • C-c C-uでモジュールを選択して"import "という行を挿入する。

これらの関数は、現在のカーソル位置にある文字列を認識する。例えば、以下のように動作する。

coll| ##"|"はカーソル。この位置でC-c C-u

import collections #左のように補完される

モジュールの選択時には、tabキーがshellと同様に機能する。

また、C-c C-@で現在開いているバッファの内容を実行できる。エラー発生時には、C-x `でエラー箇所に飛ぶことができる。

code

*1:ipythonなどのinteractive shell

*2:実際、まだまだ足りない機能や不便なところが多い