summaryrefslogtreecommitdiff
path: root/.local/bin/fgr
blob: 34d69cc6a659587a0e17aacfb866b817a355cb1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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