diff --git a/install b/install index ef400c2e00b..c1163821b89 100755 --- a/install +++ b/install @@ -270,6 +270,10 @@ EOF else echo "eval \"\$(fzf --$shell)\"" >> "$src" fi + if [[ "$shell" = bash ]]; then + bash_override=shell/bash-override + [ -f "$bash_override" ] && echo >> "$src" && cat "$bash_override" >> "$src" + fi else cat >> "$src" << EOF # Auto-completion diff --git a/shell/bash-override b/shell/bash-override new file mode 100644 index 00000000000..65f1515b603 --- /dev/null +++ b/shell/bash-override @@ -0,0 +1,48 @@ +# Override defaults for improved ctrl-t experience +__fzf_find() { + command ls -1t $1; + command find -L $1 -mindepth 2 \( -path '*/\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \) -prune \ + -o -type f -printf '%P\n' \ + -o -type d -printf '%P\n' \ + -o -type l -printf '%P\n' 2> /dev/null +} + +__fzf_select__() { + local cmd opts + local dir=$1 + shift + cmd="${FZF_CTRL_T_COMMAND:-"__fzf_find $dir"}" + opts="--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore --reverse $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS -m" + eval "$cmd" | + FZF_DEFAULT_OPTS="$opts" $(__fzfcmd) "$@" | + while read -r item; do + if [ "$dir" == "." ]; then + printf '%q ' "$item" # escape special chars + else + printf '%q/%q ' "$dir" "$item" + fi + done +} + +fzf-file-widget() { + local trailing_spaces=$(echo -n "${READLINE_LINE:0:$READLINE_POINT}" | sed "s/^.*\S//") + local word=$(echo -n "${READLINE_LINE:0:$READLINE_POINT}" | sed "s/\s*$//"| awk '{print $NF}') + local dir=$(echo "${word/#\~/$HOME}" | sed "s#/\+#/#g; s#/\$##") + if [[ $READLINE_POINT -eq 0 || -n "$trailing_spaces" || ! -d "$dir" ]]; then + local maybe_space="" + [[ $READLINE_POINT -gt 0 && -z "$trailing_spaces" ]] && maybe_space=" " + local selected="$(__fzf_select__ . "$@")" + if [ -n "$selected" ]; then + READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$maybe_space$selected${READLINE_LINE:$READLINE_POINT}" + READLINE_POINT=$((READLINE_POINT + ${#maybe_space} + ${#selected})) + fi + else + local selected="$(__fzf_select__ "$dir" "$@")" + if [ -n "$selected" ]; then + local pre_word=$((READLINE_POINT - ${#word})) + READLINE_LINE="${READLINE_LINE:0:$pre_word}$selected${READLINE_LINE:$READLINE_POINT}" + READLINE_POINT=$((pre_word + ${#selected})) + fi + fi +} +# end of non default section