fv (1844B)
1#!/bin/env sh 2# 3# fuzzy finder based File Viewer 4# 5: "${progname:="${0##*/}"}" 6: "${WRKDIR:=./}" 7 8which sk bat fd >/dev/null || exit 1 9 10fuzzy_git() { 11 local HEADER="[ENTER] Print [TAB] Toggle [ALT-F] View [ALT-H] Log [ALT-L] Log 1L" 12 local REPO=$(git -C "$WRKDIR" rev-parse --show-toplevel 2>/dev/null) #|| { echo "${WRKDIR} is not a git repo"; exit 1; } 13 git -C "$REPO" ls-tree --full-tree -r --name-only HEAD \ 14 | GREP_COLORS="sl=0;34;49:ms=0;37;49" grep --color=always '^\|[^/]*$' \ 15 | sk --ansi \ 16 --header="${HEADER} | $REPO" \ 17 --prompt "[git] > " \ 18 --layout=reverse-list \ 19 --preview="git -C \"${WRKDIR}\" show master:{1} | bat --color=always -p" \ 20 --preview-window=up:40% \ 21 -m \ 22 --bind "alt-f:execute[ git -C \"${REPO}\" show master:{} | bat -p --color=always --paging=always ]" \ 23 --bind "alt-l:execute[ git -C \"${REPO}\" log --oneline -- {} ]" \ 24 --bind "alt-h:execute[ git -C \"${REPO}\" log -p -- {} ]" \ 25 ${1:+--query "$@"} 26} 27 28fuzzy_find() { 29 [ -d "$WRKDIR" ] || exit 0 30 fd --type file --color=always . "$WRKDIR" \ 31 | sk \ 32 --ansi \ 33 --layout=reverse-list \ 34 --preview="bat --color=always --paging=always {}" \ 35 --preview-window=up \ 36 --prompt "$WRKDIR > " \ 37 --bind "alt-f:execute[ bat --color=always --paging=always {} ]" \ 38 ${1:+--query "$@"} 39} 40 41usage() { 42 cat <<_EOF 43Usage: $progname [options] 44 45Options: 46 -d <repo-dir> Set git repository to this directory 47 -f Force to use find instead of git 48 -h Show this page 49_EOF 50 exit 0 51} 52 53while getopts "d:fh" opt; do 54 case $opt in 55 d) WRKDIR="$OPTARG";; 56 f) readonly FORCE_DIR=1;; 57 h) usage;; 58 *) usage;; 59 esac 60done 61shift $((OPTIND - 1)) 62 63 64[ -d "$WRKDIR" ] || { echo "$WRKDIR: no such directory"; return 0; } 65if [ "$FORCE_DIR" = 1 ]; then 66 fuzzy_find 67elif git -C "$WRKDIR" rev-parse 2>/dev/null; then 68 fuzzy_git "$@" 69else 70 fuzzy_find 71fi