79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/zsh
 | 
						|
#cache=~/.cache/dmenu_run
 | 
						|
freq="$HOME/.cache/dmenu_history_test"
 | 
						|
alias_file="$HOME/.config/aliasrc"
 | 
						|
dmenucmd='dmenu -i '
 | 
						|
 | 
						|
source $alias_file
 | 
						|
 | 
						|
#pull our previously run commands in
 | 
						|
history=$(<$freq)
 | 
						|
#for ones that have arguments, condense them down to an asterisk
 | 
						|
history=$(sed "s/[[:space:]].*/*/" <<< "$history")
 | 
						|
 | 
						|
#generate list of commands including functions and alias'
 | 
						|
#tail command gets rid of a few of the weird bash builtins
 | 
						|
#at the beginning of the list
 | 
						|
cache=$(compgen -a; compgen -c | grep -vxF "$(compgen -a)" | sort | tail -n +10)
 | 
						|
 | 
						|
# sort history by frequency of use
 | 
						|
sorted=$(sort <<< "$history" | uniq -c | sort -hr | colrm 1 8)
 | 
						|
filter=$(sed 's/[*;]*$//' <<< "$sorted")
 | 
						|
 | 
						|
echo "$filter"
 | 
						|
# grep removes the duplicates from the unsorted list
 | 
						|
cache_deduped=$(grep -vxF "$filter" <<< "$cache")
 | 
						|
 | 
						|
# run the actual dmenu and let the user choose a command
 | 
						|
cmd="$(echo "$sorted"$'\n'"$cache_deduped" | $dmenucmd)"
 | 
						|
 | 
						|
# To remove a file from history:
 | 
						|
# Trail the selected item with ;remove
 | 
						|
if [[ $cmd == *";remove" ]]; then
 | 
						|
    cmd=${cmd/;remove/}
 | 
						|
    grep -vx "$cmd" $freq > temp
 | 
						|
    mv temp $freq
 | 
						|
    exit 0
 | 
						|
fi
 | 
						|
 | 
						|
# expand an asterisked command to include argument history
 | 
						|
regex='.+[*]$'
 | 
						|
if [[ "$cmd" =~ $regex ]]; then
 | 
						|
    history=$(grep "${cmd/[*]/}" $freq)
 | 
						|
    sorted=$(sort <<< "$history" | uniq -c | sort -hr | colrm 1 8)
 | 
						|
    # remove trailing whitespace and asterisks from arguments
 | 
						|
    cmd=$(sed 's/[[:space:]*]*$//' <<< "$@")
 | 
						|
    dmenucmd+=' -l 17'
 | 
						|
    (sleep .1; xdotool key Tab) &
 | 
						|
    cmd="$(echo "$sorted"$'\n'"$cache" | $dmenucmd)"
 | 
						|
    if [[ $cmd == *";remove" ]]; then
 | 
						|
        cmd=${cmd/;remove/}
 | 
						|
        egrep -vx "$cmd" $freq > temp
 | 
						|
        mv temp $freq
 | 
						|
        exit 0
 | 
						|
    fi
 | 
						|
fi
 | 
						|
 | 
						|
if ! [ "$cmd" == "" ]; then
 | 
						|
    # remember which commands have been run
 | 
						|
    echo "$cmd" >> $freq
 | 
						|
    cmdexec=$(alias | grep "${cmd/;/}=" | cut -f2 -d "'" | tr -d "'")
 | 
						|
    if [ -z "$cmdexec" ]; then
 | 
						|
        cmdexec=${cmd/;/}
 | 
						|
    fi
 | 
						|
 | 
						|
    # open a command up in a terminal
 | 
						|
    # a second semicolon holds the xterm open
 | 
						|
    if [[ $cmd == *";;" ]]; then
 | 
						|
        cmdexec="xterm -hold -e $cmdexec"
 | 
						|
    elif [[ $cmd == *";" ]]; then
 | 
						|
        cmdexec="xterm -e $cmdexec"
 | 
						|
    fi
 | 
						|
 | 
						|
    # Workaround to run functions...
 | 
						|
    echo "$cmdexec" | compgen -F "$cmdexec" | zsh -i
 | 
						|
    # ...and aliases
 | 
						|
    echo "$cmdexec" | zsh -i
 | 
						|
fi
 | 
						|
 |