#!/usr/bin/env sh # Description: Fuzzy find a command from history, # edit in $EDITOR and run as a command # # Note: Supports only bash, zsh and fish history # # TODO: For zsh there's also $ZDOTDIR which might need to be checked as well for the -z $HISTFILE && -n $ZDOTDIR case. # # Shell: POSIX compliant # Author: Arun Prakash Jana if type fzf >/dev/null 2>&1; then fuzzy=fzf else exit 1 fi shellname="$(basename "$SHELL")" if [ "$shellname" = "bash" ]; then if [ -f "$HISTFILE" ]; then hist_file="$HISTFILE" else hist_file="$HOME/.bash_history" fi entry="$("$fuzzy" < "$hist_file")" elif [ "$shellname" = "zsh" ]; then if [ -f "$HISTFILE" ]; then hist_file="$HISTFILE" else hist_file="$HOME/.zsh_history" fi entry="$("$fuzzy" < "$hist_file")" elif [ "$shellname" = "fish" ]; then hist_file="$HOME/.local/share/fish/fish_history" entry="$(grep "\- cmd: " "$hist_file" | cut -c 8- | "$fuzzy")" fi if [ -n "$entry" ]; then tmpfile=$(mktemp) echo "$entry" >> "$tmpfile" $EDITOR "$tmpfile" if [ -s "$tmpfile" ]; then $SHELL -c "$(cat "$tmpfile")" fi rm -- "$tmpfile" printf "Press any key to exit" read -r _ fi