finder (2637B)
1 #!/usr/bin/env bash 2 3 # Description: Run custom search and list results in smart context 4 # 5 # Note: This plugin retains search history 6 # 7 # Usage: 8 # Run plugin and enter e.g. "-size +10M" to list files in current 9 # directory larger than 10M. By default entered expressions are 10 # interpreted as arguments to find. Results have to be NUL 11 # terminated which is done by default for find. Alternatively one 12 # can prepend a '$' to run a custom search program such as fd or 13 # ripgrep. Entered expressions will be saved in history file to 14 # be listed as bookmarks and and can be entered by index and edited. 15 # 16 # Shell: Bash 17 # Author: Arun Prakash Jana, Luuk van Baal 18 TMPDIR="${TMPDIR:-/tmp}" 19 NNN_FINDHIST="${NNN_FINDHIST:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/finderbms}" 20 NNN_FINDHISTLEN="${NNN_FINDHISTLEN:-10000}" 21 22 printexamples() { 23 printf -- "-maxdepth 1 -name pattern 24 -maxdepth 1 -size +100M 25 \$fd -0 pattern 26 \$fd -0 -d 2 -S +100M 27 \$grep -rlZ pattern 28 \$rg -l0 pattern 29 \$fzf -m | tr '\\\n' '\\\0'\n" 30 } 31 32 printexprs() { 33 for ((i = "$1"; i < ${#fexprs[@]}; i++)); do 34 printf '%s\t%s\n' "$((i + 1))" "${fexprs[$i]}" 35 done 36 } 37 38 mapexpr() { 39 if [ "$fexpr" -eq "$fexpr" ] 2>/dev/null; then 40 fexpr=${fexprs[$((fexpr - 1))]} 41 read -r -e -p "Search expression: " -i "$fexpr" fexpr 42 else 43 return 1 44 fi 45 } 46 47 readexpr() { 48 case "$fexpr" in 49 h) clear 50 printf "Examples:\n" 51 mapfile -t fexprs < <(printexamples) 52 printexprs 0 53 read -r -p "Search expression or index: " fexpr 54 mapexpr 55 [ -n "$fexpr" ] && readexpr ;; 56 \$*) cmd="${fexpr:1}" ;; 57 *) mapexpr && readexpr 58 cmd="find $fexpr -print0" ;; 59 esac 60 } 61 62 clear 63 [ -f "$NNN_FINDHIST" ] || printexamples > "$NNN_FINDHIST" 64 65 mapfile -t fexprs < <(sort "$NNN_FINDHIST" | uniq -c | sort -nr | head -n5 |\ 66 awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}') 67 printf "Most used search expressions:\n" 68 printexprs 0 69 70 mapfile -t -O"$i" fexprs < <(tac "$NNN_FINDHIST" | awk '!a[$0]++' | head -n5) 71 printf "Most recently used search expressions:\n" 72 printexprs "$i" 73 read -r -p "Search expression or index (h for help): " fexpr 74 75 mapexpr 76 77 if [ -n "$fexpr" ]; then 78 printf "+l" > "$NNN_PIPE" 79 while :; do 80 readexpr 81 eval "$cmd" > "$NNN_PIPE" && break 82 read -r -e -p "Search expression: " -i "$fexpr" fexpr 83 done 84 if [ -n "$fexpr" ]; then 85 tail -n"$NNN_FINDHISTLEN" "$NNN_FINDHIST" > "$TMPDIR/finderbms" 86 printf "%s\n" "$fexpr" >> "$TMPDIR/finderbms" 87 mv "$TMPDIR/finderbms" "$NNN_FINDHIST" 88 fi 89 fi