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
 | |
| 
 |