59 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 |