dmenuに学習っぽいことをしてもらう

dmenu。ご存知ですか、dmenu。 元々はdwmというウィンドウマネージャー用のキーボードランチャーです。 コレがね、便利なんだわ。めっちゃ便利なんだわ。 私なんかは便利さのあまりfluxboxでも使ってるほど。

んでも、んでもね? PATHに設定されているディレクトリにあるコマンドを候補にするんですが・・・何度同じの打っても学習とかしてくれないんすよ。 chromiumを起動したいのにchroまでchrootが表示されるというこの悲しさね。 いっそchあたりでもうchromiumって補完して欲しいじゃないか! なあ!

・・・まあ、長すぎる前置きはともかくとして。

dmenuってのはdmenuってコマンドとdmenu_runってシェルスクリプトの組み合わせで構成されておりまして。

dmenu_runというスクリプトが候補一覧を作成(or キャッシュから読み出し)して、dmenuコマンドに渡す。

候補一覧を渡されたdmenuはその中から選ばせて、そいつを標準出力で返す。

帰ってきたのをdmenu_runが起動する、という仕組みになっております。

この時のキャッシュ(普通にコマンドのリストが書いてあるだけ)を利用して、学習っぽいことをしてもらおう、というお話。

お話っていうか、普通に書いたスクリプトを公開するだけだけどね。

#!/bin/sh
cachedir=${XDG_CACHE_HOME:-"$HOME/.cache"}
if [ -d "$cachedir" ]; then
	cache=$cachedir/dmenu_run
else
	cache=$HOME/.dmenu_cache # if no xdg dir, fall back to dotfile in ~
fi

IFS=:
if stest -dqr -n "$cache" $PATH; then
	lst=`stest -flx $PATH | sort -r | tee "$cache"`
else
	lst=`cat "$cache"`
fi

choice=`printf "$lst\n" | tac | dmenu "$@"`
if [ "$choice" != "" ];then
	lst=`printf "$lst" | grep -v "^$choice\$"`
	printf "$lst\n" > "$cache"
	echo $choice | tee -a "$cache" | tac | ${SHELL:-"/bin/sh"} &
fi

とりあえずこんな感じ。

こいつをコピー(もしくはこれをダウンロード)して、/usr/bin/dmenu_runに上書きしてください。(環境によっては違う場所かも) 勿論バックアップを忘れずに。

ほんでdmenuを使ってみると、学習するようになってる、はず。

表示の優先順位を上げてるだけなので、例えばlsusbって打っちゃうと、次にlsを使いたい時はlsって打ってから→キーで選ばないといけなくなります。 そのへんはまあ、どっちを取るかって事で。

オリジナルより処理が増えてるし、grepとか使っちゃったし、コマンドがめっちゃ多い環境とかでは起動が重くなっちゃうかもねー。 まあ、試してみてくださいな。くれぐれもバックアップはしておくように。