履歴付きdmenu

dmenuはそのままdmenu_runすると,
辞書式順で表示される.ここからキーを押して,候補を絞っていくことになる.

しかし,firefoxを起動させるには,おそらくfirまでキーを押さないといけない.
これは非常に面倒である.fを押した時点でfirefoxが選択されるのが望ましい.
(たかが,2キーストロークだと怒られるかもしれないが)
上を実現する1つの方法として,履歴を利用する方法がある.辞書式ではなく,
使用頻度順にならべてやれば,良く使うプログラムは前のほうに来る,そして,
少ないキーストロークで起動できるというわけだ.
履歴を利用してやれば,こんな風になる:

もともとのスクリプトはArchLinuxのForumで見たのだが,どこで見たかを忘れてしまった.
本来ならば,そこにリンクを貼るべきなのだろうが.

スクリプトは次.

#!/bin/bash
# ~/bin/dmenu_run
# Time-stamp:<2009-08-26 21:14:15>

# histroy setting
HIST="$HOME/.dmenu_history"
HIST_SIZE=99

CMD="mpdmenu"

# query from history
QUERY=$(sort $HIST | uniq -c | sort -rn | colrm 1 8)


RUN=$((echo "$QUERY"; (dmenu_path ; echo "$CMD") | grep -vxF "$QUERY") | \
    dmenu -i -fn '-*-terminus-*-*-*-*-*-200-*-*-*-*-*-*' -nb "#dddddd" -sb "#3366ff")

# if run is not empty then update history
[[ $RUN != "" ]] && (echo $RUN; head -n 99 $HIST) > $HIST.$$ && mv $HIST.$$ $HIST

case $RUN in
    # emacs may be daemon mode
    emacs) exec emacsclient -n -c -a emacs ;;
    mpdmenu) exec /home/toru/bin/mpdmenu ;;
    *) exec $RUN;;
esac

HIST_SIZEは保存する履歴の数.
100もあれば十分だと思われる.
実際

% cat .dmenu_history | sort | uniq | wc -l
16

だし.