diff options
| author | Matěj Cepl <mcepl@cepl.eu> | 2025-01-05 18:55:14 +0100 |
|---|---|---|
| committer | Randy Palamar <randy@rnpnr.xyz> | 2025-01-06 07:38:01 -0700 |
| commit | 824a7d19ae5bdc8eb6b3d61a591dc26d33ab3a38 (patch) | |
| tree | f2e3f324011a852c04247e97caaf2110b7260611 /vis-complete | |
| parent | 75892aad7939b40354be7ea71bd55c651956b27c (diff) | |
| download | vis-824a7d19ae5bdc8eb6b3d61a591dc26d33ab3a38.tar.gz vis-824a7d19ae5bdc8eb6b3d61a591dc26d33ab3a38.tar.xz | |
scripts: fix shellcheck warnings and make scripts more uniform
Diffstat (limited to 'vis-complete')
| -rwxr-xr-x | vis-complete | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/vis-complete b/vis-complete index db925f6..50895b1 100755 --- a/vis-complete +++ b/vis-complete @@ -1,16 +1,28 @@ #!/bin/sh set -e +fatal() { + echo "$@" >&2 + exit 1 +} + usage() { - printf '%s\n' "usage: $(basename "$0") [--file|--word] pattern" \ - " $(basename "$0") -h|--help" + fatal "Usage: $(basename "$0") [--file|--word] [--] pattern + +Interactively complete file or word + +--file this passes pattern to obtain a list of matching + file names (this is the default). +--word this reads standard input to obtain a list of lines + matching pattern. +pattern pattern to be completed" } basic_regex_quote() { printf "%s" "$1" | sed 's|[\\.*^$[]|\\&|g'; } glob_quote () { printf "%s" "$1" | sed 's|[\\?*[]]|\\&|g'; } COMPLETE_WORD=0 -FIND_FILE_LIMIT=1000 +FIND_FILE_LIMIT="${FIND_FILE_LIMIT:-1000}" while [ $# -gt 0 ]; do case "$1" in @@ -26,13 +38,8 @@ while [ $# -gt 0 ]; do shift break ;; - -h|--help) - usage - exit 0 - ;; - -*) + -*|'') usage - exit 1 ;; *) break @@ -40,45 +47,44 @@ while [ $# -gt 0 ]; do esac done -if [ $# -ne 1 ]; then - usage - exit 1 -fi +[ "$#" -lt 1 ] && usage PATTERN="$1" if [ $COMPLETE_WORD = 1 ]; then + # shellcheck disable=SC1003 tr -s '\t {}()[],<>%^&.\\' '\n' | grep "^$(basic_regex_quote "$PATTERN")." | sort -u else # Expand to absolute path because of the -path option below. + # shellcheck disable=SC2088 case $PATTERN in /*) - XPATTERN=$PATTERN + XPATTERN="$PATTERN" ;; '~'|'~/'*) - XPATTERN=$HOME$(echo $PATTERN | tail -c +2) + XPATTERN="$HOME$(echo "$PATTERN" | tail -c +2)" ;; *) - XPATTERN=$PWD/$PATTERN + XPATTERN="$PWD/$PATTERN" ;; esac # The first path condition rules out paths that start with "." unless # they start with "..". That way, hidden paths should stay hidden, but # non-normalised paths should still show up. - find $(dirname "$XPATTERN") \ + find "$(dirname "$XPATTERN")" \ -name '.*' -prune \ -o \( \ ! -name '.*' \ -a -path "$(glob_quote "$XPATTERN")*" \ -print \ \) 2>/dev/null | - head -n $FIND_FILE_LIMIT | + head -n "$FIND_FILE_LIMIT" | sort | - sed "s|^$(dirname $XPATTERN)/||" + sed "s|^$(dirname "$XPATTERN")/||" fi | vis-menu -b | - sed "s|^$(basename $PATTERN)$(echo $PATTERN | tail -c 2 | grep -F /)||" | + sed "s|^$(basename "$PATTERN")$(echo "$PATTERN" | tail -c 2 | grep -F /)||" | tr -d '\n' |
