59 lines
1.0 KiB
Plaintext
59 lines
1.0 KiB
Plaintext
|
#!/bin/sh
|
||
|
aliases=$HOME/.config/aliasrc
|
||
|
|
||
|
source $aliases
|
||
|
termcmd="st -e"
|
||
|
cachedir=${XDG_CACHE_HOME:-"$HOME/.cache"}
|
||
|
if [ -d "$cachedir" ]; then
|
||
|
cache=$cachedir/dmenu_run
|
||
|
historyfile=$cachedir/dmenu_history
|
||
|
else # if no xdg dir, fall back to dotfiles in ~
|
||
|
cache=$HOME/.dmenu_cache
|
||
|
historyfile=$HOME/.dmenu_history
|
||
|
fi
|
||
|
|
||
|
IFS=:
|
||
|
if stest -dqr -n "$cache" $PATH; then
|
||
|
stest -flx $PATH | sort -u > "$cache"
|
||
|
fi
|
||
|
unset IFS
|
||
|
|
||
|
cmd=$(awk -v histfile=$historyfile '
|
||
|
BEGIN {
|
||
|
while( (getline < histfile) > 0 ) {
|
||
|
sub("^[0-9]+\t","")
|
||
|
print
|
||
|
x[$0]=1
|
||
|
}
|
||
|
} !x[$0]++ ' "$cache" \
|
||
|
| dmenu "$@" \
|
||
|
| awk -v histfile=$historyfile '
|
||
|
BEGIN {
|
||
|
FS=OFS="\t"
|
||
|
while ( (getline < histfile) > 0 ) {
|
||
|
count=$1
|
||
|
sub("^[0-9]+\t","")
|
||
|
fname=$0
|
||
|
history[fname]=count
|
||
|
}
|
||
|
close(histfile)
|
||
|
}
|
||
|
|
||
|
{
|
||
|
history[$0]++
|
||
|
print
|
||
|
}
|
||
|
|
||
|
END {
|
||
|
if(!NR) exit
|
||
|
for (f in history)
|
||
|
print history[f],f | "sort -t '\t' -k1rn >" histfile
|
||
|
}
|
||
|
' )
|
||
|
|
||
|
case $cmd in
|
||
|
*\! ) ${termcmd} "$(printf "%s" "${cmd}" | cut -d'!' -f1)";;
|
||
|
* ) ${cmd} ;;
|
||
|
esac
|
||
|
exit
|