Diary?

2007-08-31
Fri

(22:59)

ちょっとした思いつきでコマンドラインインターフェースのオーディオプレイヤー (といっても flac123 や mpg321 のラッパーフロントエンド) を作ろうと思ってコードを弄っていたんだけど、ちょっと Python の readline モジュールではまってしまった。

readline ではタブ補完機能が提供されていて、補完関数を定義することで bash とかのような補完機能が使えるようになる。今回でっち上げたプレイヤーで使っている cmd モジュール では readline を使ってコマンド名の自動補完なんかをやっていたりする。

で、この readline モジュール、実は補完するにあたって補完対象に含まれていると問題のある文字列が存在する。readline の get_completer_delims 関数で取得できる文字列はタブ補完の際に区切り文字として使われるので、これに含まれる文字が補完対象に入っている場合、そこから先の文字列は補完の対象にならなくなってしまう。

get_completer_delims の戻り値を調べてみると、デフォルトでは

>>> import readline
>>> readline.get_completer_delims()
' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>/?'

という結果が得られた。なので例えば

  • black_sabbath-black_sabbath_remastered.m3u
  • black_sabbath-paranoid.m3u
  • black_sabbath-master_of_reality.m3u

などというファイルに対して補完を行おうとすると、「black_sabbath-」までは補完されるものの、その後もう一回補完キーを叩くとまた「black_sabbath-」が挿入され……というループになってしまう。

これを解消するには readline モジュールの set_completer_delims で新しい区切り文字を指定すれば良く、例えばさっきの場合だと「-」を削除すれば一応どうにかなる。

とりあえずソースは http://return0.dyndns.org/log/2007/08/audioshell.py より。まったくもって適当きわまりないソースの上、テストの類は一切書いていないのでまったくもって動作は保証しかねます。あと著しく機能性が低いので、あんまり期待しないように。ってかそもそも Unix 系 OS じゃねえと動かないしな (readline は Windows 版にはなかったはず)。まあいいか、知ったこっちゃねえ。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。