82 lines
2.5 KiB
Plaintext
82 lines
2.5 KiB
Plaintext
|
#!/usr/bin/env zsh
|
||
|
#
|
||
|
# These options are intended to be user-customizable if needed; you can
|
||
|
# override them by exporting them from your ~/.zshrc. See README for more
|
||
|
# details.
|
||
|
|
||
|
FZF_BIN_PATH=${FZF_BIN_PATH:="fzf"}
|
||
|
FZFZ_EXCLUDE_PATTERN=${FZFZ_EXCLUDE_PATTERN:="\/.git"}
|
||
|
FZFZ_EXTRA_OPTS=${FZFZ_EXTRA_OPTS:=""}
|
||
|
FZFZ_UNIQUIFIER=${FZFZ_UNIQUIFIER:="awk '!seen[\$0]++' 2>&1"}
|
||
|
FZFZ_SUBDIR_LIMIT=${FZFZ_SUBDIR_LIMIT:=50}
|
||
|
|
||
|
if ! (( ${+FZFZ_PREVIEW_COMMAND} )); then
|
||
|
command -v exa >/dev/null 2>&1
|
||
|
if [ $? -eq 0 ]; then
|
||
|
FZFZ_PREVIEW_COMMAND='exa --level 2 --tree --color=always --group-directories-first {}'
|
||
|
else
|
||
|
command -v tree >/dev/null 2>&1
|
||
|
if [ $? -eq 0 ]; then
|
||
|
FZFZ_PREVIEW_COMMAND='tree -C -L 2 -x --noreport --dirsfirst {}'
|
||
|
else
|
||
|
FZFZ_PREVIEW_COMMAND='ls -1 -R {}'
|
||
|
fi
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
# *****
|
||
|
|
||
|
SCRIPT_PATH="${0:A:h}"
|
||
|
|
||
|
if [[ $OSTYPE == darwin* && -z $(whence tac) ]]; then
|
||
|
REVERSER='tail -r'
|
||
|
else
|
||
|
REVERSER='tac'
|
||
|
fi
|
||
|
|
||
|
if type fd &>/dev/null; then
|
||
|
FIND_PREFIX="fd --color=never --hidden . "
|
||
|
FIND_POSTFIX=" --type directory"
|
||
|
FIND_REMOVE_SURPLUS="cat"
|
||
|
else
|
||
|
FIND_PREFIX="find "
|
||
|
FIND_POSTFIX=" -type d"
|
||
|
# find includes the current directory, so we remove the first line from
|
||
|
# the output.
|
||
|
FIND_REMOVE_SURPLUS="tail -n +2"
|
||
|
fi
|
||
|
|
||
|
if (($+FZFZ_EXCLUDE_PATTERN)); then
|
||
|
if type gegrep &>/dev/null; then
|
||
|
EXCLUDER="gegrep -v '$FZFZ_EXCLUDE_PATTERN'"
|
||
|
else
|
||
|
EXCLUDER="egrep -v '$FZFZ_EXCLUDE_PATTERN'"
|
||
|
fi
|
||
|
else
|
||
|
EXCLUDER="cat"
|
||
|
fi
|
||
|
|
||
|
# EXCLUDER is applied directly only to searches that need it (i.e. not
|
||
|
# `z`). That improvements performance, and makes sure that the
|
||
|
# FZFZ_SUBDIR_LIMIT is applied on the post-excluded list.
|
||
|
|
||
|
if (($+FZFZ_EXTRA_DIRS)); then
|
||
|
EXTRA_DIRS="{ $FIND_PREFIX $FZFZ_EXTRA_DIRS $FIND_POSTFIX && $FIND_PID=${!} | ($EXCLUDER; kill -9 $FIND_PID) } 2> /dev/null"
|
||
|
else
|
||
|
EXTRA_DIRS="{ true }"
|
||
|
fi
|
||
|
|
||
|
if (($FZFZ_SUBDIR_LIMIT == 0)); then
|
||
|
SUBDIRS="{ true }"
|
||
|
else
|
||
|
SUBDIRS="{ $FIND_PREFIX '$PWD' $FIND_POSTFIX | $EXCLUDER | head -n $(($FZFZ_SUBDIR_LIMIT+1)) | $FIND_REMOVE_SURPLUS }"
|
||
|
fi
|
||
|
|
||
|
RECENT_DIRS="{ $SCRIPT_PATH/recentdirs.sh }"
|
||
|
RECENTLY_USED_DIRS="{ $RECENT_DIRS | $REVERSER | sed 's/^[[:digit:].]*[[:space:]]*//' }"
|
||
|
|
||
|
FZF_COMMAND="${FZF_BIN_PATH} --height ${FZF_TMUX_HEIGHT:-40%} ${FZFZ_EXTRA_OPTS} --no-sort --tiebreak=end,index -m --preview='$FZFZ_PREVIEW_COMMAND | head -\$LINES'"
|
||
|
|
||
|
COMMAND="{ $RECENTLY_USED_DIRS ; $SUBDIRS ; $EXTRA_DIRS; } | $FZFZ_UNIQUIFIER | $FZF_COMMAND"
|
||
|
eval $COMMAND
|