dotfiles/bash/.bashrc.d/fzfind.rc
2024-01-14 19:08:57 +01:00

99 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
#
# Plugin: fzfing
# Description: fzf based file fuzzy finder for Bash
# Author: Anon
# Date: 2024
# Version: 1.0
# Source:
# mirror 1: http://bis64wqhh3louusbd45iyj76kmn4rzw5ysawyan5bkxwyzihj67c5lid.onion/anon/fzfind
# mirror 2: https://github.com/agvxov/fzfind
[ -z "$CTRLFMODE" ] && CTRLFMODE="path"
[ -z "$CTRLFMETHOD" ] && CTRLFMETHOD="find"
#CTRLCACHE="/home/anon/Desktop/"
function ctrl_f_mode(){
read -n 1 M
case $M in
p) CTRLFMODE="path";;
u) CTRLFMODE="user";;
o) CTRLFMODE="opt";;
c) CTRLFMODE="cmd" ;;
v) CTRLFMODE="var" ;;
*) CTRLFMODE="path";;
esac
env echo -e "\033[1mctrl-f mode: \"\033[0m${CTRLFMODE}\""
}
function echo_readline_line(){
PS1_CLEANED="${PS1//\\\[/}"
PS1_CLEANED="${PS1_CLEANED//\\\]/}"
env echo -e "${PS1_CLEANED}${1:0:${2}}\033[45m \033[0m${1:${2}}"
#env echo -e "${PS1}${1:0:${2}}\033[45m \033[0m${1:${2}}"
}
function ctrl_f(){
# Show command and substitution position
echo_readline_line "${READLINE_LINE}" "${READLINE_POINT}"
# Get narrowing substring
OPX=""
if [ "${READLINE_LINE:$(expr $READLINE_POINT - 1):1}" != " " ]; then
OPX=$(lastWord "${READLINE_LINE:0:${READLINE_POINT}}")
fi
#echo "'$PX'"
# Decide possible completions and use fzf for selection
case $CTRLFMODE in
"path")
if [ $CTRLFMETHOD == "find" ]; then
PX="$OPX"
STR=$(eval find ./"$PX/" 2> /dev/null | fzf --multi=1)
elif [ $CTRLFMETHOD == "locate" ]; then
PX="$(realpath $PWD/$OPX)"
STR=$(eval locate --existing --regex $PX/'.*' 2> /dev/null | fzf --multi=1)
else
echo -e "\033[31;1mNonsensical \033[34;1m\${CTRLFMETHOD} \033[31;1mvalue.\033[0m"
fi
;;
"opt")
#get command
#check catche
#parse
;;
"user")
if [ "$PX" != "" ]; then
STR="$(compgen -u ${PX} | fzf --multi=1)"
else
STR="$(compgen -u | fzf --multi=1)"
fi
;;
"cmd")
if [ "$PX" != "" ]; then
STR="$(compgen -c ${PX} | uniq | fzf --multi=1)"
else
STR="$(compgen -c | uniq | fzf --multi=1)"
fi
;;
"var")
if [ "$PX" != "" ]; then
STR="$(compgen -v ${PX} | fzf --multi=1)"
else
STR="$(compgen -v | fzf --multi=1)"
fi
;;
esac
# Remove ${PX}
STR="${STR/${PX}/}"
# Write $READLINE_LINE
[ -z "$STR" ] && return
if [ "$CTRLFMODE" == "path" ]; then # quote paths
READLINE_LINE="${READLINE_LINE:0:$(expr ${READLINE_POINT} - ${#OPX})}\"${OPX}${STR}\"${READLINE_LINE:${READLINE_POINT}}" # start_til_px + '"' + px + str '"' + rest
READLINE_POINT=$(expr ${READLINE_POINT} + ${#OPX} + ${#STR} + 2) # +2 for the '"'s
else
READLINE_LINE="${READLINE_LINE:0:$(expr ${READLINE_POINT} - ${#OPX})}${OPX}${STR}${READLINE_LINE:${READLINE_POINT}}" # start_til_px + px + str + rest
READLINE_POINT=$(expr ${READLINE_POINT} + ${#OPX} + ${#STR})
fi
}
bind -x '"\C-e": ctrl_f_mode'
bind -x '"\C-f": ctrl_f'