theniceboy/zsh/fzf/ffind
2020-03-04 22:48:38 -08:00

80 lines
1.7 KiB
Bash
Executable file

#!/usr/bin/env zsh
setopt localoptions
local s_path level
local only_dir
while getopts ':dl:s:' opt; do
case $opt in
d)
only_dir=1
;;
l)
level=$OPTARG
;;
s)
s_path=$OPTARG
;;
\?)
echo "Invalid option -$OPTARG." >&2
;;
esac
done
local cmd="command find -L ${s_path:-.} -mindepth 1 ${level:+-maxdepth $level} \
\\( -path '*/\\.git' \
-o -path '*/venv' \
-o -fstype 'sysfs' \
-o -fstype 'devfs' \
-o -fstype 'devtmpfs' \
-o -fstype 'proc' \\) -prune \
-o -type d -print"
if [[ -z $only_dir ]]; then
cmd="$cmd -o -type f -print -o -type l -print"
fi
cmd="$cmd 2>/dev/null"
if [[ -z $s_path || $s_path == '.' ]]; then
cmd="$cmd | cut -b3-"
fi
local fzf_opts="--height=50% --reverse -m --tiebreak=end \
--preview-window=right:60%:wrap \
--bind=ctrl-alt-u:preview-up,ctrl-alt-e:preview-down"
local fzf_preview_cmd='
t=${$(readlink {}):-{}}
if [[ $(file -i $t) =~ directory ]]; then
(exa --color=always -T -L 1 {} ||
tree -C -L 1 {} ||
echo {} is a directory.) 2>/dev/null
elif [[ $(file -i $t) =~ binary ]]; then
echo {} is a binary file.
else
ccat --color=always {} 2>/dev/null
fi
'
local -a ret_array
local ret=0
eval $cmd | fzf ${(z)fzf_opts} --preview $fzf_preview_cmd ${(z)EXTRA_OPTS} | {
while read item; do
printf "${(q)item} "
done
} | sed -E '$s/ $//'
ret_array=($pipestatus)
# ignore find command error code 1 such as loop detect or permission
if (( $ret_array[1] == 1 )); then
ret=0
fi
local p_ret
for p_ret in $ret_array[2,-1]; do
if (( p_ret )); then
ret=$p_ret
fi
done
return $ret