summaryrefslogtreecommitdiff
path: root/.local/bin/fgr
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/fgr')
-rwxr-xr-x.local/bin/fgr82
1 files changed, 82 insertions, 0 deletions
diff --git a/.local/bin/fgr b/.local/bin/fgr
new file mode 100755
index 0000000..34d69cc
--- /dev/null
+++ b/.local/bin/fgr
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+# https://junegunn.github.io/fzf/tips/ripgrep-integration/#6-bind-enter-to-become-action
+
+help() { echo "fgr - grep with fzf (fzf-grep)
+
+USAGE:
+ fgr [OPTION]... PATTERN
+
+OPTIONS:
+ -r real time grepping with fzf prompt
+ -h show this help message
+
+ENVIRONMENT VARIABLES:
+ FZF_GREP_COMMAND overrides the default grep command whose content is piped into fzf
+ FZF_GREP_OPENER overrides the default opener used to open selection on pressing 'enter'
+ "; }
+
+err() { printf '%s: %s\n' "$0" "$@" >&2; exit 1; }
+
+while getopts 'rh' o; do case "$o" in
+ r) rflag=1 ;;
+ h) help >&2; exit ;;
+ ?) err "invalid option passed" ;;
+esac done
+shift $((OPTIND - 1))
+
+[ -z "$FZF_HISTDIR" ] &&
+ export FZF_HISTDIR="${XDG_STATE_HOME:-$HOME/.local/state}/fzf"
+
+mkdir -pv "$FZF_HISTDIR"
+export FZF_HIST="$FZF_HISTDIR/grep_history"
+
+[ -z "$FZF_GREP_COMMAND" ] &&
+ if command -v rg >/dev/null; then
+ FZF_GREP_COMMAND="rg --smart-case --column --color=always"
+ elif command -v git >/dev/null; then
+ FZF_GREP_COMMAND="git grep -I --ignore-case --column --color=always"
+ else
+ FZF_GREP_COMMAND="grep -Rnsi --exclude-dir=.git --color=always"
+ fi
+
+[ -z "$FZF_GREP_RELOAD" ] &&
+ FZF_GREP_RELOAD="reload($FZF_GREP_COMMAND {q} || :)"
+
+[ -z "$FZF_GREP_OPENER" ] && FZF_GREP_OPENER='
+ if [[ $FZF_SELECT_COUNT -eq 0 ]]; then
+ $EDITOR {1} +{2} # No selection. Open the current line in Vim.
+ else
+ $EDITOR +cw -q {+f} # Build quickfix list for the selected items.
+ fi
+ '
+
+FZF_OPENER="
+ # update history
+ sed -i '\\|^{q}$|d' \"$FZF_HIST\"
+ echo {q} >> \"$FZF_HIST\"
+
+ $FZF_GREP_OPENER
+ "
+
+query="$*"
+
+fzf() { $FZF_GREP_COMMAND "$query" | command fzf "$@" \
+ --ansi --multi --exit-0 --header-first \
+ --history="$FZF_HIST" \
+ --bind "enter:execute($FZF_OPENER)" \
+ --bind "ctrl-o:become($FZF_OPENER)" \
+ --bind 'ctrl-v:toggle-preview,ctrl-space:toggle-preview' \
+ --bind "ctrl-r:reload($FZF_GREP_COMMAND '$query')" \
+ --bind 'alt-a:select-all,alt-d:deselect-all,ctrl-/:toggle-preview' \
+ --delimiter : \
+ --preview 'bat --style=full --color=always --highlight-line {2} {1}' \
+ --preview-window '~4,+{2}+4/3,<80(up)'; }
+
+if [ "$rflag" = 1 ]; then
+ fzf --disabled --query "$query" \
+ --header "COMMAND: $FZF_GREP_COMMAND <prompt-query>" \
+ --bind "change:$FZF_GREP_RELOAD"
+else
+ fzf --header "COMMAND: $FZF_GREP_COMMAND '$query'"
+fi