From 739a4b1e7ca4e2f835cff78c12804f8445f38346 Mon Sep 17 00:00:00 2001 From: Martin Winkler Date: Wed, 16 Mar 2022 01:05:29 +0100 Subject: [PATCH] sqn-completion supports seqs with spaces in their names sqn-completion now shellcheck compliant and correctly indented --- .editorconfig | 2 +- sqn-completion.bash | 67 +++++++++++++++++++++++++-------------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/.editorconfig b/.editorconfig index 9a5a55d..e6bb828 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,6 @@ root = true -[*.{sh,cfg,example}] +[*.{sh,bash,cfg,example}] charset = utf-8 indent_style = space indent_size = 2 diff --git a/sqn-completion.bash b/sqn-completion.bash index 7c5210a..aeba6f8 100755 --- a/sqn-completion.bash +++ b/sqn-completion.bash @@ -1,37 +1,40 @@ -#/usr/bin/env bash +#!/usr/bin/env bash +# shellcheck disable=SC1090 # dynamically sourced file _sqn_completions() { # Current search string local cur=${COMP_WORDS[COMP_CWORD]} # Extract alias command with buildins same as: - # local curCmd="$(alias $1 | sed "s/^alias.*\" \(.*\)'$/\1/")" - local curCmd="$(alias "$1")" - curCmd="${curCmd##*\" }" - curCmd="${curCmd%\'*}" + # local curCmd="$(alias $1 | sed "s/^alias.*\" \"\(.*\)\"'$/\1/")" + local curCmd= + curCmd="$(alias "$1")" + curCmd="${curCmd##*\" \"}" + curCmd="${curCmd%\"\'*}" COMPREPLY=() case "$cur" in -*) - COMPREPLY=( $( compgen -W '\ - -- \ - -a --all \ - -c --config \ - -d --dry-run \ - -h --help \ - -ha --helpapi \ - -ls --liststeps \ - -p --profile \ - -pl \ - -q --quiet \ - -qq \ - -s --single \ - -v --verbose \ - --version' -- $cur ) );; + opts=( \ + -- \ + -a --all \ + -c --config \ + -d --dry-run \ + -h --help \ + -ha --helpapi \ + -ls --liststeps \ + -p --profile \ + -pl \ + -q --quiet \ + -qq \ + -s --single \ + -v --verbose \ + --version) + read -r -d '' -a COMPREPLY < <(compgen -W "${opts[*]}" -- "$cur");; *) # Stop after step selection (last argument which is not an option; starting with "-") (( COMP_CWORD > 1 )) && [[ ! "${COMP_WORDS[((COMP_CWORD - 1))]}" =~ ^- ]] && return # sequencer.sh provides creation of a step list with search functionality - COMPREPLY=( $( "$curCmd" -ls "$cur" ) );; + read -r -a COMPREPLY <<<"$( "$curCmd" -ls "$cur" )";; esac return 0 } @@ -39,26 +42,30 @@ _sqn_completions() installCompletion() { # Get script working directory # (when called from a different directory) - local WDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >>/dev/null 2>&1 && pwd)" - - . ${WDIR}/sequencer.cfg &>/dev/null + local script_dir= + script_dir="$(cd "$(dirname -- "${BASH_SOURCE[0]}")" >>/dev/null 2>&1 && pwd)" - local SEQBASE="${WDIR}/seqs" + . "${script_dir}/sequencer.cfg" >/dev/null 2>&1 + + local SEQBASE="${script_dir}/seqs" local SEQPREFIX="sqn_" local SEQSHORT=() - + # Check for user selected sequences [ -e "$SEQUENCER_USER_SEQS" ] && SEQBASE="$SEQUENCER_USER_SEQS" # Create aliases and command (alias) list for "complete" command" - SEQLIST=($(ls "$SEQBASE/$cur"*.sh)) + IFS=$'\n' read -r -d '' -a SEQLIST < <(ls -1 "$SEQBASE/${cur}"*.sh) + #SEQLIST=("$(ls "$SEQBASE/${cur}"*.sh)") for i in "${!SEQLIST[@]}"; do SEQLIST[$i]="${SEQLIST[$i]##*/}" SEQLIST[$i]="${SEQLIST[$i]%.*}" - SEQSHORT[$i]="${SEQPREFIX}${SEQLIST[$i]}" - alias ${SEQSHORT[$i]}="_SQN_ALIAS=\"${SEQSHORT[$i]}\" $SEQBASE/${SEQLIST[$i]}.sh" + SEQSHORT[$i]="${SEQPREFIX}${SEQLIST[$i]/[[:blank:]]/_}" + # shellcheck disable=SC2139,SC2086 + # alias should be expanded when defined + alias ${SEQSHORT[$i]}="_SQN_ALIAS=\"${SEQSHORT[$i]}\" \"$SEQBASE/${SEQLIST[$i]}.sh\"" done - complete -o nosort -o bashdefault -o default -F _sqn_completions ${SEQSHORT[@]} + complete -o nosort -o bashdefault -o default -F _sqn_completions "${SEQSHORT[@]}" } installCompletion