diff --git a/bash/fzf b/bash/fzf new file mode 100644 index 0000000..ec8b8fd --- /dev/null +++ b/bash/fzf @@ -0,0 +1,56 @@ +# shellcheck shell=bash +# vim: ft=sh + +__fzf_select__() { + local cmd="${FZF_CTRL_T_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ + -o -type f -print \ + -o -type d -print \ + -o -type l -print 2> /dev/null | cut -b3-"}" + eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS" fzf -m "$@" | while read -r item; do + printf '%q ' "$item" + done + echo +} + +__fzfcmd() { + echo "fzf" +} + +fzf-file-widget() { + local selected="$(__fzf_select__)" + READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}" + READLINE_POINT=$(( READLINE_POINT + ${#selected} )) +} + +__fzf_cd__() { + local cmd dir + cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ + -o -type d -print 2> /dev/null | cut -b3-"}" + dir=$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m) && printf 'cd %q' "$dir" +} + +__fzf_history__() ( + local line + shopt -u nocaseglob nocasematch + line=$( + HISTTIMEFORMAT= history | + FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS --tac -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS +m" $(__fzfcmd) | + command grep '^ *[0-9]') && + if [[ $- =~ H ]]; then + sed 's/^ *\([0-9]*\)\** .*/!\1/' <<< "$line" + else + sed 's/^ *\([0-9]*\)\** *//' <<< "$line" + fi +) + +bind '"\er": redraw-current-line' +bind '"\e^": history-expand-line' + +if [[ ${BASH_VERSINFO[0]} -gt 3 ]]; then + bind -x '"\C-t": "fzf-file-widget"' +else + bind '"\C-t": " \C-u \C-a\C-k`__fzf_select__`\e\C-e\C-y\C-a\C-y\ey\C-h\er"' +fi + +bind '"\C-r": " \C-e\C-u`__fzf_history__`\e\C-e\e^\er"' +bind '"\ec": " \C-e\C-u`__fzf_cd__`\e\C-e\er\C-m"' diff --git a/bash/rc b/bash/rc index f7c3870..9369360 100644 --- a/bash/rc +++ b/bash/rc @@ -10,6 +10,7 @@ source $DOTFILES_BASH_DIR/history source $DOTFILES_BASH_DIR/term_title source $DOTFILES_BASH_DIR/completion source $DOTFILES_SHELL_DIR/go +source $DOTFILES_BASH_DIR/fzf source $DOTFILES_SHELL_DIR/git_prompt_info GIT_PS1_SHOWDIRTYSTATE=1 diff --git a/shell/fzf b/shell/fzf index ede0047..c87bfe7 100755 --- a/shell/fzf +++ b/shell/fzf @@ -1,3 +1,3 @@ -export FZF_DEFAULT_COMMAND='rg --files --glob "!.git/*"' +export FZF_DEFAULT_COMMAND='rg --files --no-ignore --hidden --follow --glob "!{.git,node_modules}/*"' export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" -bind -x '"\C-p": vim $(fzf);' +bind -x '"\C-p": vim $(fzf -m);'