From d7695d5456b980190b6d1c4a4715b13d1b63c332 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Fri, 7 Jan 2022 21:04:50 -0800 Subject: [PATCH 1/5] completion/bash-it: `shfmt` --- clean_files.txt | 1 + completion/available/bash-it.completion.bash | 284 +++++++++---------- 2 files changed, 143 insertions(+), 142 deletions(-) diff --git a/clean_files.txt b/clean_files.txt index c18198eb18..635b2b328e 100644 --- a/clean_files.txt +++ b/clean_files.txt @@ -37,6 +37,7 @@ aliases/available/vim.aliases.bash # completion/available/apm.completion.bash completion/available/awless.completion.bash +completion/available/bash-it.completion.bash completion/available/brew.completion.bash completion/available/cargo.completion.bash completion/available/composer.completion.bash diff --git a/completion/available/bash-it.completion.bash b/completion/available/bash-it.completion.bash index 7a5f897de5..a5c0781a43 100644 --- a/completion/available/bash-it.completion.bash +++ b/completion/available/bash-it.completion.bash @@ -1,165 +1,165 @@ #!/usr/bin/env bash -_bash-it-comp-enable-disable() -{ - local enable_disable_args="alias completion plugin" - COMPREPLY=( $(compgen -W "${enable_disable_args}" -- "${cur}") ) +_bash-it-comp-enable-disable() { + local enable_disable_args="alias completion plugin" + COMPREPLY=($(compgen -W "${enable_disable_args}" -- "${cur}")) } -_bash-it-comp-list-available-not-enabled() -{ - local subdirectory="$1" - - local enabled_components all_things available_things - - all_things=( $(compgen -G "${BASH_IT}/$subdirectory/available/*.bash") ); all_things=( "${all_things[@]##*/}" ) - enabled_components=( $(command ls "${BASH_IT}"/{"$subdirectory"/,}enabled/*.bash 2>/dev/null) ) - enabled_components=( "${enabled_components[@]##*/}" ); enabled_components="${enabled_components[@]##*---}" - available_things=( $(sort -d <(for i in ${enabled_components} - do - all_things=( "${all_things[@]//$i}" ) - done - printf '%s\n' "${all_things[@]}")) ); available_things="${available_things[@]%.*.bash}" - - COMPREPLY=( $(compgen -W "all ${available_things}" -- "${cur}") ) +_bash-it-comp-list-available-not-enabled() { + local subdirectory="$1" + + local enabled_components all_things available_things + + all_things=($(compgen -G "${BASH_IT}/$subdirectory/available/*.bash")) + all_things=("${all_things[@]##*/}") + enabled_components=($(command ls "${BASH_IT}"/{"$subdirectory"/,}enabled/*.bash 2> /dev/null)) + enabled_components=("${enabled_components[@]##*/}") + enabled_components="${enabled_components[@]##*---}" + available_things=($(sort -d <( + for i in ${enabled_components}; do + all_things=("${all_things[@]//$i/}") + done + printf '%s\n' "${all_things[@]}" + ))) + available_things="${available_things[@]%.*.bash}" + + COMPREPLY=($(compgen -W "all ${available_things}" -- "${cur}")) } -_bash-it-comp-list-enabled() -{ - local subdirectory="$1" - local suffix enabled_things +_bash-it-comp-list-enabled() { + local subdirectory="$1" + local suffix enabled_things - suffix="${subdirectory/plugins/plugin}" + suffix="${subdirectory/plugins/plugin}" - enabled_things=( $(sort -d <(compgen -G "${BASH_IT}/$subdirectory/enabled/*.${suffix}.bash") <(compgen -G "${BASH_IT}/enabled/*.${suffix}.bash")) ) - enabled_things=( "${enabled_things[@]##*/}" ); enabled_things=( "${enabled_things[@]##*---}" ); enabled_things="${enabled_things[@]%.*.bash}" + enabled_things=($(sort -d <(compgen -G "${BASH_IT}/$subdirectory/enabled/*.${suffix}.bash") <(compgen -G "${BASH_IT}/enabled/*.${suffix}.bash"))) + enabled_things=("${enabled_things[@]##*/}") + enabled_things=("${enabled_things[@]##*---}") + enabled_things="${enabled_things[@]%.*.bash}" - COMPREPLY=( $(compgen -W "all ${enabled_things}" -- "${cur}") ) + COMPREPLY=($(compgen -W "all ${enabled_things}" -- "${cur}")) } -_bash-it-comp-list-available() -{ - local subdirectory="$1" +_bash-it-comp-list-available() { + local subdirectory="$1" - local enabled_things + local enabled_things - enabled_things=( $(sort -d <(compgen -G "${BASH_IT}/$subdirectory/available/*.bash")) ) - enabled_things=( "${enabled_things[@]##*/}" ); enabled_things="${enabled_things[@]%.*.bash}" + enabled_things=($(sort -d <(compgen -G "${BASH_IT}/$subdirectory/available/*.bash"))) + enabled_things=("${enabled_things[@]##*/}") + enabled_things="${enabled_things[@]%.*.bash}" - COMPREPLY=( $(compgen -W "${enabled_things}" -- "${cur}") ) + COMPREPLY=($(compgen -W "${enabled_things}" -- "${cur}")) } -_bash-it-comp-list-profiles() -{ - local profiles +_bash-it-comp-list-profiles() { + local profiles - profiles=$(for f in `compgen -G "${BASH_IT}/profiles/*.bash_it" | sort -d`; - do - basename $f | sed -e 's/.bash_it//g' - done) + profiles=$(for f in $(compgen -G "${BASH_IT}/profiles/*.bash_it" | sort -d); do + basename $f | sed -e 's/.bash_it//g' + done) - COMPREPLY=( $(compgen -W "${profiles}" -- ${cur}) ) + COMPREPLY=($(compgen -W "${profiles}" -- ${cur})) } -_bash-it-comp() -{ - local cur prev opts - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - chose_opt="${COMP_WORDS[1]}" - file_type="${COMP_WORDS[2]}" - opts="disable enable help migrate reload restart profile doctor search show update version" - case "${chose_opt}" in - show) - local show_args="aliases completions plugins" - COMPREPLY=( $(compgen -W "${show_args}" -- "${cur}") ) - return 0 - ;; - help) - if [ x"${prev}" == x"aliases" ]; then - _bash-it-comp-list-available aliases - return 0 - else - local help_args="aliases completions migrate plugins update" - COMPREPLY=( $(compgen -W "${help_args}" -- "${cur}") ) - return 0 - fi - ;; - profile) - case "${file_type}" in - load) - if [[ "load" == "$prev" ]]; then - _bash-it-comp-list-profiles - fi - return 0 - ;; - rm) - if [[ "rm" == "$prev" ]]; then - _bash-it-comp-list-profiles - fi - return 0 - ;; - save) - return 0 - ;; - list) - return 0 - ;; - *) - local profile_args="load save list rm" - COMPREPLY=( $(compgen -W "${profile_args}" -- ${cur}) ) - return 0 - ;; - esac - ;; - doctor) - local doctor_args="errors warnings all" - COMPREPLY=( $(compgen -W "${doctor_args}" -- "${cur}") ) - return 0 - ;; - update) - if [[ "${cur}" == -* ]];then - local update_args="-s --silent" - else - local update_args="stable dev" - fi - COMPREPLY=( $(compgen -W "${update_args}" -- "${cur}") ) - return 0 - ;; - migrate | reload | restart | search | version) - return 0 - ;; - enable | disable) - if [ x"${chose_opt}" == x"enable" ];then - suffix="available-not-enabled" - else - suffix="enabled" - fi - case "${file_type}" in - alias) - _bash-it-comp-list-"${suffix}" aliases - return 0 - ;; - plugin) - _bash-it-comp-list-"${suffix}" plugins - return 0 - ;; - completion) - _bash-it-comp-list-"${suffix}" completion - return 0 - ;; - *) - _bash-it-comp-enable-disable - return 0 - ;; - esac - ;; - esac - - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - - return 0 +_bash-it-comp() { + local cur prev opts + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD - 1]}" + chose_opt="${COMP_WORDS[1]}" + file_type="${COMP_WORDS[2]}" + opts="disable enable help migrate reload restart profile doctor search show update version" + case "${chose_opt}" in + show) + local show_args="aliases completions plugins" + COMPREPLY=($(compgen -W "${show_args}" -- "${cur}")) + return 0 + ;; + help) + if [ x"${prev}" == x"aliases" ]; then + _bash-it-comp-list-available aliases + return 0 + else + local help_args="aliases completions migrate plugins update" + COMPREPLY=($(compgen -W "${help_args}" -- "${cur}")) + return 0 + fi + ;; + profile) + case "${file_type}" in + load) + if [[ "load" == "$prev" ]]; then + _bash-it-comp-list-profiles + fi + return 0 + ;; + rm) + if [[ "rm" == "$prev" ]]; then + _bash-it-comp-list-profiles + fi + return 0 + ;; + save) + return 0 + ;; + list) + return 0 + ;; + *) + local profile_args="load save list rm" + COMPREPLY=($(compgen -W "${profile_args}" -- ${cur})) + return 0 + ;; + esac + ;; + doctor) + local doctor_args="errors warnings all" + COMPREPLY=($(compgen -W "${doctor_args}" -- "${cur}")) + return 0 + ;; + update) + if [[ "${cur}" == -* ]]; then + local update_args="-s --silent" + else + local update_args="stable dev" + fi + COMPREPLY=($(compgen -W "${update_args}" -- "${cur}")) + return 0 + ;; + migrate | reload | restart | search | version) + return 0 + ;; + enable | disable) + if [ x"${chose_opt}" == x"enable" ]; then + suffix="available-not-enabled" + else + suffix="enabled" + fi + case "${file_type}" in + alias) + _bash-it-comp-list-"${suffix}" aliases + return 0 + ;; + plugin) + _bash-it-comp-list-"${suffix}" plugins + return 0 + ;; + completion) + _bash-it-comp-list-"${suffix}" completion + return 0 + ;; + *) + _bash-it-comp-enable-disable + return 0 + ;; + esac + ;; + esac + + COMPREPLY=($(compgen -W "${opts}" -- "${cur}")) + + return 0 } # Activate completion for bash-it and its common misspellings From 3874ad85c28b7b195b493ee5f8450f39ce6c8b17 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Sun, 9 Jan 2022 00:58:08 -0800 Subject: [PATCH 2/5] completion/bash-it: use existing functions --- completion/available/bash-it.completion.bash | 85 +++++--------------- test/completion/bash-it.completion.bats | 8 +- 2 files changed, 25 insertions(+), 68 deletions(-) mode change 100644 => 100755 test/completion/bash-it.completion.bats diff --git a/completion/available/bash-it.completion.bash b/completion/available/bash-it.completion.bash index a5c0781a43..9a0c9611f5 100644 --- a/completion/available/bash-it.completion.bash +++ b/completion/available/bash-it.completion.bash @@ -1,74 +1,36 @@ -#!/usr/bin/env bash +# shellcheck shell=bash -_bash-it-comp-enable-disable() { - local enable_disable_args="alias completion plugin" - COMPREPLY=($(compgen -W "${enable_disable_args}" -- "${cur}")) -} - -_bash-it-comp-list-available-not-enabled() { +function _bash-it-comp-list-available-not-enabled() { local subdirectory="$1" - - local enabled_components all_things available_things - - all_things=($(compgen -G "${BASH_IT}/$subdirectory/available/*.bash")) - all_things=("${all_things[@]##*/}") - enabled_components=($(command ls "${BASH_IT}"/{"$subdirectory"/,}enabled/*.bash 2> /dev/null)) - enabled_components=("${enabled_components[@]##*/}") - enabled_components="${enabled_components[@]##*---}" - available_things=($(sort -d <( - for i in ${enabled_components}; do - all_things=("${all_things[@]//$i/}") - done - printf '%s\n' "${all_things[@]}" - ))) - available_things="${available_things[@]%.*.bash}" - - COMPREPLY=($(compgen -W "all ${available_things}" -- "${cur}")) + COMPREPLY=($(compgen -W "all $(_bash-it-component-list-disabled "${subdirectory}")" -- "${cur}")) } -_bash-it-comp-list-enabled() { +function _bash-it-comp-list-enabled() { local subdirectory="$1" - local suffix enabled_things - - suffix="${subdirectory/plugins/plugin}" - - enabled_things=($(sort -d <(compgen -G "${BASH_IT}/$subdirectory/enabled/*.${suffix}.bash") <(compgen -G "${BASH_IT}/enabled/*.${suffix}.bash"))) - enabled_things=("${enabled_things[@]##*/}") - enabled_things=("${enabled_things[@]##*---}") - enabled_things="${enabled_things[@]%.*.bash}" - - COMPREPLY=($(compgen -W "all ${enabled_things}" -- "${cur}")) + COMPREPLY=($(compgen -W "all $(_bash-it-component-list-enabled "${subdirectory}")" -- "${cur}")) } -_bash-it-comp-list-available() { +function _bash-it-comp-list-available() { local subdirectory="$1" - - local enabled_things - - enabled_things=($(sort -d <(compgen -G "${BASH_IT}/$subdirectory/available/*.bash"))) - enabled_things=("${enabled_things[@]##*/}") - enabled_things="${enabled_things[@]%.*.bash}" - - COMPREPLY=($(compgen -W "${enabled_things}" -- "${cur}")) + COMPREPLY=($(compgen -W "all $(_bash-it-component-list "${subdirectory}")" -- "${cur}")) } -_bash-it-comp-list-profiles() { +function _bash-it-comp-list-profiles() { local profiles - profiles=$(for f in $(compgen -G "${BASH_IT}/profiles/*.bash_it" | sort -d); do - basename $f | sed -e 's/.bash_it//g' - done) + profiles=("${BASH_IT}/profiles"/*.bash_it) + profiles=("${profiles[@]##*/}") - COMPREPLY=($(compgen -W "${profiles}" -- ${cur})) + COMPREPLY=($(compgen -W "${profiles[*]%%.bash_it}" -- "${cur}")) } -_bash-it-comp() { +function _bash-it-comp() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD - 1]}" chose_opt="${COMP_WORDS[1]}" - file_type="${COMP_WORDS[2]}" + file_type="${COMP_WORDS[2]:-}" opts="disable enable help migrate reload restart profile doctor search show update version" case "${chose_opt}" in show) @@ -77,7 +39,7 @@ _bash-it-comp() { return 0 ;; help) - if [ x"${prev}" == x"aliases" ]; then + if [[ "${prev}" == "aliases" ]]; then _bash-it-comp-list-available aliases return 0 else @@ -108,7 +70,7 @@ _bash-it-comp() { ;; *) local profile_args="load save list rm" - COMPREPLY=($(compgen -W "${profile_args}" -- ${cur})) + COMPREPLY=($(compgen -W "${profile_args}" -- "${cur}")) return 0 ;; esac @@ -131,26 +93,19 @@ _bash-it-comp() { return 0 ;; enable | disable) - if [ x"${chose_opt}" == x"enable" ]; then + if [[ "${chose_opt}" == "enable" ]]; then suffix="available-not-enabled" else suffix="enabled" fi case "${file_type}" in - alias) - _bash-it-comp-list-"${suffix}" aliases - return 0 - ;; - plugin) - _bash-it-comp-list-"${suffix}" plugins - return 0 - ;; - completion) - _bash-it-comp-list-"${suffix}" completion + alias | completion | plugin) + _bash-it-comp-list-"${suffix}" "${file_type}" return 0 ;; *) - _bash-it-comp-enable-disable + local enable_disable_args="alias completion plugin" + COMPREPLY=($(compgen -W "${enable_disable_args}" -- "${cur}")) return 0 ;; esac diff --git a/test/completion/bash-it.completion.bats b/test/completion/bash-it.completion.bats old mode 100644 new mode 100755 index cb1761bf64..8363b49ebf --- a/test/completion/bash-it.completion.bats +++ b/test/completion/bash-it.completion.bats @@ -1,6 +1,8 @@ #!/usr/bin/env bats load ../test_helper +load ../../lib/utilities +load ../../lib/helpers load ../../completion/available/bash-it.completion function local_setup { @@ -290,7 +292,7 @@ function __check_completion () { assert_link_exist "$BASH_IT/aliases/enabled/docker-compose.aliases.bash" run __check_completion 'bash-it enable plugin docker' - assert_line -n 0 "docker-compose docker-machine docker" + assert_line -n 0 "docker docker-compose docker-machine" } @test "completion bash-it: enable - provide the docker-* plugins when nothing is enabled with the old location and priority-based name" { @@ -298,7 +300,7 @@ function __check_completion () { assert_link_exist "$BASH_IT/aliases/enabled/150---docker-compose.aliases.bash" run __check_completion 'bash-it enable plugin docker' - assert_line -n 0 "docker-compose docker-machine docker" + assert_line -n 0 "docker docker-compose docker-machine" } @test "completion bash-it: enable - provide the docker-* plugins when nothing is enabled with the new location and priority-based name" { @@ -306,7 +308,7 @@ function __check_completion () { assert_link_exist "$BASH_IT/enabled/150---docker-compose.aliases.bash" run __check_completion 'bash-it enable plugin docker' - assert_line -n 0 "docker-compose docker-machine docker" + assert_line -n 0 "docker docker-compose docker-machine" } @test "completion bash-it: enable - provide the docker-* completions when nothing is enabled with the old location and name" { From e1e971c0eafd42fb58e170fbd448c2c4023cc250 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Fri, 7 Jan 2022 17:27:43 -0800 Subject: [PATCH 3/5] completion/bash-it: use `read -a` to populate `$COMPREPLY` This allows for spaces and special characters in file names, i.e. internaltional/unicode words. --- completion/available/bash-it.completion.bash | 30 +++++--- test/completion/bash-it.completion.bats | 72 ++++++++++---------- 2 files changed, 57 insertions(+), 45 deletions(-) diff --git a/completion/available/bash-it.completion.bash b/completion/available/bash-it.completion.bash index 9a0c9611f5..7975fab1a6 100644 --- a/completion/available/bash-it.completion.bash +++ b/completion/available/bash-it.completion.bash @@ -1,31 +1,43 @@ # shellcheck shell=bash function _bash-it-comp-list-available-not-enabled() { - local subdirectory="$1" - COMPREPLY=($(compgen -W "all $(_bash-it-component-list-disabled "${subdirectory}")" -- "${cur}")) + local subdirectory="$1" IFS=$'\n' REPL + COMPREPLY=('all') + while read -ra REPL; do + COMPREPLY+=("${REPL[@]}") + done < <(compgen -W "$(_bash-it-component-list-disabled "${subdirectory}")" -- "${cur}") } function _bash-it-comp-list-enabled() { - local subdirectory="$1" - COMPREPLY=($(compgen -W "all $(_bash-it-component-list-enabled "${subdirectory}")" -- "${cur}")) + local subdirectory="$1" IFS=$'\n' REPL + COMPREPLY=('all') + while read -ra REPL; do + COMPREPLY+=("${REPL[@]}") + done < <(compgen -W "$(_bash-it-component-list-enabled "${subdirectory}")" -- "${cur}") } function _bash-it-comp-list-available() { - local subdirectory="$1" - COMPREPLY=($(compgen -W "all $(_bash-it-component-list "${subdirectory}")" -- "${cur}")) + local subdirectory="$1" IFS=$'\n' REPL + COMPREPLY=('all') + while read -ra REPL; do + COMPREPLY+=("${REPL[@]}") + done < <(compgen -W "$(_bash-it-component-list "${subdirectory}")" -- "${cur}") } function _bash-it-comp-list-profiles() { - local profiles + local profiles IFS=$'\n' REPL + COMPREPLY=() profiles=("${BASH_IT}/profiles"/*.bash_it) profiles=("${profiles[@]##*/}") - COMPREPLY=($(compgen -W "${profiles[*]%%.bash_it}" -- "${cur}")) + while read -ra REPL; do + COMPREPLY+=("${REPL[@]}") + done < <(compgen -W "${profiles[*]%%.bash_it}" -- "${cur}") } function _bash-it-comp() { - local cur prev opts + local cur prev opts chose_opt file_type COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD - 1]}" diff --git a/test/completion/bash-it.completion.bats b/test/completion/bash-it.completion.bats index 8363b49ebf..ceabb1a914 100755 --- a/test/completion/bash-it.completion.bats +++ b/test/completion/bash-it.completion.bats @@ -155,10 +155,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the a* aliases when atom is enabled with the old location and name" { - ln -s $BASH_IT/aliases/available/atom.aliases.bash $BASH_IT/aliases/enabled/atom.aliases.bash + ln -s "$BASH_IT/aliases/available/atom.aliases.bash" "$BASH_IT/aliases/enabled/atom.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/atom.aliases.bash" - ln -s $BASH_IT/completion/available/apm.completion.bash $BASH_IT/completion/enabled/apm.completion.bash + ln -s "$BASH_IT/completion/available/apm.completion.bash" "$BASH_IT/completion/enabled/apm.completion.bash" assert_link_exist "$BASH_IT/completion/enabled/apm.completion.bash" run __check_completion 'bash-it disable alias a' @@ -166,10 +166,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the a* aliases when atom is enabled with the old location and priority-based name" { - ln -s $BASH_IT/aliases/available/atom.aliases.bash $BASH_IT/aliases/enabled/150---atom.aliases.bash + ln -s "$BASH_IT/aliases/available/atom.aliases.bash" "$BASH_IT/aliases/enabled/150---atom.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/150---atom.aliases.bash" - ln -s $BASH_IT/completion/available/apm.completion.bash $BASH_IT/completion/enabled/350---apm.completion.bash + ln -s "$BASH_IT/completion/available/apm.completion.bash" "$BASH_IT/completion/enabled/350---apm.completion.bash" assert_link_exist "$BASH_IT/completion/enabled/350---apm.completion.bash" run __check_completion 'bash-it disable alias a' @@ -177,10 +177,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the a* aliases when atom is enabled with the new location and priority-based name" { - ln -s $BASH_IT/aliases/available/atom.aliases.bash $BASH_IT/enabled/150---atom.aliases.bash + ln -s "$BASH_IT/aliases/available/atom.aliases.bash" "$BASH_IT/enabled/150---atom.aliases.bash" assert_link_exist "$BASH_IT/enabled/150---atom.aliases.bash" - ln -s $BASH_IT/completion/available/apm.completion.bash $BASH_IT/enabled/350---apm.completion.bash + ln -s "$BASH_IT/completion/available/apm.completion.bash" "$BASH_IT/enabled/350---apm.completion.bash" assert_link_exist "$BASH_IT/enabled/350---apm.completion.bash" run __check_completion 'bash-it disable alias a' @@ -188,10 +188,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the docker-machine plugin when docker-machine is enabled with the old location and name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/aliases/enabled/docker-compose.aliases.bash + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/aliases/enabled/docker-compose.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/docker-compose.aliases.bash" - ln -s $BASH_IT/plugins/available/docker-machine.plugin.bash $BASH_IT/plugins/enabled/docker-machine.plugin.bash + ln -s "$BASH_IT/plugins/available/docker-machine.plugin.bash" "$BASH_IT/plugins/enabled/docker-machine.plugin.bash" assert_link_exist "$BASH_IT/plugins/enabled/docker-machine.plugin.bash" run __check_completion 'bash-it disable plugin docker' @@ -199,10 +199,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the docker-machine plugin when docker-machine is enabled with the old location and priority-based name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/aliases/enabled/150---docker-compose.aliases.bash + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/aliases/enabled/150---docker-compose.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/150---docker-compose.aliases.bash" - ln -s $BASH_IT/plugins/available/docker-machine.plugin.bash $BASH_IT/plugins/enabled/350---docker-machine.plugin.bash + ln -s "$BASH_IT/plugins/available/docker-machine.plugin.bash" "$BASH_IT/plugins/enabled/350---docker-machine.plugin.bash" assert_link_exist "$BASH_IT/plugins/enabled/350---docker-machine.plugin.bash" run __check_completion 'bash-it disable plugin docker' @@ -210,10 +210,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the docker-machine plugin when docker-machine is enabled with the new location and priority-based name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/enabled/150---docker-compose.aliases.bash + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/enabled/150---docker-compose.aliases.bash" assert_link_exist "$BASH_IT/enabled/150---docker-compose.aliases.bash" - ln -s $BASH_IT/plugins/available/docker-machine.plugin.bash $BASH_IT/enabled/350---docker-machine.plugin.bash + ln -s "$BASH_IT/plugins/available/docker-machine.plugin.bash" "$BASH_IT/enabled/350---docker-machine.plugin.bash" assert_link_exist "$BASH_IT/enabled/350---docker-machine.plugin.bash" run __check_completion 'bash-it disable plugin docker' @@ -221,10 +221,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the todo.txt-cli aliases when todo plugin is enabled with the old location and name" { - ln -s $BASH_IT/aliases/available/todo.txt-cli.aliases.bash $BASH_IT/aliases/enabled/todo.txt-cli.aliases.bash + ln -s "$BASH_IT/aliases/available/todo.txt-cli.aliases.bash" "$BASH_IT/aliases/enabled/todo.txt-cli.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/todo.txt-cli.aliases.bash" - ln -s $BASH_IT/plugins/available/todo.plugin.bash $BASH_IT/plugins/enabled/todo.plugin.bash + ln -s "$BASH_IT/plugins/available/todo.plugin.bash" "$BASH_IT/plugins/enabled/todo.plugin.bash" assert_link_exist "$BASH_IT/plugins/enabled/todo.plugin.bash" run __check_completion 'bash-it disable alias to' @@ -232,10 +232,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the todo.txt-cli aliases when todo plugin is enabled with the old location and priority-based name" { - ln -s $BASH_IT/aliases/available/todo.txt-cli.aliases.bash $BASH_IT/aliases/enabled/150---todo.txt-cli.aliases.bash + ln -s "$BASH_IT/aliases/available/todo.txt-cli.aliases.bash" "$BASH_IT/aliases/enabled/150---todo.txt-cli.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/150---todo.txt-cli.aliases.bash" - ln -s $BASH_IT/plugins/available/todo.plugin.bash $BASH_IT/plugins/enabled/350---todo.plugin.bash + ln -s "$BASH_IT/plugins/available/todo.plugin.bash" "$BASH_IT/plugins/enabled/350---todo.plugin.bash" assert_link_exist "$BASH_IT/plugins/enabled/350---todo.plugin.bash" run __check_completion 'bash-it disable alias to' @@ -243,10 +243,10 @@ function __check_completion () { } @test "completion bash-it: disable - provide the todo.txt-cli aliases when todo plugin is enabled with the new location and priority-based name" { - ln -s $BASH_IT/aliases/available/todo.txt-cli.aliases.bash $BASH_IT/enabled/150---todo.txt-cli.aliases.bash + ln -s "$BASH_IT/aliases/available/todo.txt-cli.aliases.bash" "$BASH_IT/enabled/150---todo.txt-cli.aliases.bash" assert_link_exist "$BASH_IT/enabled/150---todo.txt-cli.aliases.bash" - ln -s $BASH_IT/plugins/available/todo.plugin.bash $BASH_IT/enabled/350---todo.plugin.bash + ln -s "$BASH_IT/plugins/available/todo.plugin.bash" "$BASH_IT/enabled/350---todo.plugin.bash" assert_link_exist "$BASH_IT/enabled/350---todo.plugin.bash" run __check_completion 'bash-it disable alias to' @@ -264,7 +264,7 @@ function __check_completion () { } @test "completion bash-it: enable - provide the a* aliases when atom is enabled with the old location and name" { - ln -s $BASH_IT/aliases/available/atom.aliases.bash $BASH_IT/aliases/enabled/atom.aliases.bash + ln -s "$BASH_IT/aliases/available/atom.aliases.bash" "$BASH_IT/aliases/enabled/atom.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/atom.aliases.bash" run __check_completion 'bash-it enable alias a' @@ -272,7 +272,7 @@ function __check_completion () { } @test "completion bash-it: enable - provide the a* aliases when atom is enabled with the old location and priority-based name" { - ln -s $BASH_IT/aliases/available/atom.aliases.bash $BASH_IT/aliases/enabled/150---atom.aliases.bash + ln -s "$BASH_IT/aliases/available/atom.aliases.bash" "$BASH_IT/aliases/enabled/150---atom.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/150---atom.aliases.bash" run __check_completion 'bash-it enable alias a' @@ -280,55 +280,55 @@ function __check_completion () { } @test "completion bash-it: enable - provide the a* aliases when atom is enabled with the new location and priority-based name" { - ln -s $BASH_IT/aliases/available/atom.aliases.bash $BASH_IT/enabled/150---atom.aliases.bash + ln -s "$BASH_IT/aliases/available/atom.aliases.bash" "$BASH_IT/enabled/150---atom.aliases.bash" assert_link_exist "$BASH_IT/enabled/150---atom.aliases.bash" run __check_completion 'bash-it enable alias a' assert_line -n 0 "all ag ansible apt" } -@test "completion bash-it: enable - provide the docker-* plugins when nothing is enabled with the old location and name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/aliases/enabled/docker-compose.aliases.bash +@test "completion bash-it: enable - provide the docker* plugins when docker-compose is enabled with the old location and name" { + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/aliases/enabled/docker-compose.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/docker-compose.aliases.bash" run __check_completion 'bash-it enable plugin docker' assert_line -n 0 "docker docker-compose docker-machine" } -@test "completion bash-it: enable - provide the docker-* plugins when nothing is enabled with the old location and priority-based name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/aliases/enabled/150---docker-compose.aliases.bash +@test "completion bash-it: enable - provide the docker-* plugins when docker-compose is enabled with the old location and priority-based name" { + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/aliases/enabled/150---docker-compose.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/150---docker-compose.aliases.bash" run __check_completion 'bash-it enable plugin docker' assert_line -n 0 "docker docker-compose docker-machine" } -@test "completion bash-it: enable - provide the docker-* plugins when nothing is enabled with the new location and priority-based name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/enabled/150---docker-compose.aliases.bash +@test "completion bash-it: enable - provide the docker-* plugins when docker-compose is enabled with the new location and priority-based name" { + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/enabled/150---docker-compose.aliases.bash" assert_link_exist "$BASH_IT/enabled/150---docker-compose.aliases.bash" run __check_completion 'bash-it enable plugin docker' assert_line -n 0 "docker docker-compose docker-machine" } -@test "completion bash-it: enable - provide the docker-* completions when nothing is enabled with the old location and name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/aliases/enabled/docker-compose.aliases.bash +@test "completion bash-it: enable - provide the docker* completions when docker-compose is enabled with the old location and name" { + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/aliases/enabled/docker-compose.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/docker-compose.aliases.bash" run __check_completion 'bash-it enable completion docker' assert_line -n 0 "docker docker-compose docker-machine" } -@test "completion bash-it: enable - provide the docker-* completions when nothing is enabled with the old location and priority-based name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/aliases/enabled/150---docker-compose.aliases.bash +@test "completion bash-it: enable - provide the docker* completions when docker-compose is enabled with the old location and priority-based name" { + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/aliases/enabled/150---docker-compose.aliases.bash" assert_link_exist "$BASH_IT/aliases/enabled/150---docker-compose.aliases.bash" run __check_completion 'bash-it enable completion docker' assert_line -n 0 "docker docker-compose docker-machine" } -@test "completion bash-it: enable - provide the docker-* completions when nothing is enabled with the new location and priority-based name" { - ln -s $BASH_IT/aliases/available/docker-compose.aliases.bash $BASH_IT/enabled/150---docker-compose.aliases.bash +@test "completion bash-it: enable - provide the docker* completions when docker-compose is enabled with the new location and priority-based name" { + ln -s "$BASH_IT/aliases/available/docker-compose.aliases.bash" "$BASH_IT/enabled/150---docker-compose.aliases.bash" assert_link_exist "$BASH_IT/enabled/150---docker-compose.aliases.bash" run __check_completion 'bash-it enable completion docker' @@ -336,7 +336,7 @@ function __check_completion () { } @test "completion bash-it: enable - provide the todo.txt-cli aliases when todo plugin is enabled with the old location and name" { - ln -s $BASH_IT/plugins/available/todo.plugin.bash $BASH_IT/plugins/enabled/todo.plugin.bash + ln -s "$BASH_IT/plugins/available/todo.plugin.bash" "$BASH_IT/plugins/enabled/todo.plugin.bash" assert_link_exist "$BASH_IT/plugins/enabled/todo.plugin.bash" run __check_completion 'bash-it enable alias to' @@ -344,7 +344,7 @@ function __check_completion () { } @test "completion bash-it: enable - provide the todo.txt-cli aliases when todo plugin is enabled with the old location and priority-based name" { - ln -s $BASH_IT/plugins/available/todo.plugin.bash $BASH_IT/plugins/enabled/350---todo.plugin.bash + ln -s "$BASH_IT/plugins/available/todo.plugin.bash" "$BASH_IT/plugins/enabled/350---todo.plugin.bash" assert_link_exist "$BASH_IT/plugins/enabled/350---todo.plugin.bash" run __check_completion 'bash-it enable alias to' @@ -352,7 +352,7 @@ function __check_completion () { } @test "completion bash-it: enable - provide the todo.txt-cli aliases when todo plugin is enabled with the new location and priority-based name" { - ln -s $BASH_IT/plugins/available/todo.plugin.bash $BASH_IT/enabled/350---todo.plugin.bash + ln -s "$BASH_IT/plugins/available/todo.plugin.bash" "$BASH_IT/enabled/350---todo.plugin.bash" assert_link_exist "$BASH_IT/enabled/350---todo.plugin.bash" run __check_completion 'bash-it enable alias to' From 2f4ed49a71166e0f82b2b8052ef47713ddc32d6e Mon Sep 17 00:00:00 2001 From: John D Pell Date: Fri, 7 Jan 2022 21:03:30 -0800 Subject: [PATCH 4/5] completion/bash-it: adopt `_compreply_candidates()` --- completion/available/bash-it.completion.bash | 123 ++++++------------- 1 file changed, 38 insertions(+), 85 deletions(-) diff --git a/completion/available/bash-it.completion.bash b/completion/available/bash-it.completion.bash index 7975fab1a6..7ebe9ccc88 100644 --- a/completion/available/bash-it.completion.bash +++ b/completion/available/bash-it.completion.bash @@ -1,132 +1,85 @@ # shellcheck shell=bash -function _bash-it-comp-list-available-not-enabled() { - local subdirectory="$1" IFS=$'\n' REPL - COMPREPLY=('all') - while read -ra REPL; do - COMPREPLY+=("${REPL[@]}") - done < <(compgen -W "$(_bash-it-component-list-disabled "${subdirectory}")" -- "${cur}") -} - -function _bash-it-comp-list-enabled() { - local subdirectory="$1" IFS=$'\n' REPL - COMPREPLY=('all') - while read -ra REPL; do - COMPREPLY+=("${REPL[@]}") - done < <(compgen -W "$(_bash-it-component-list-enabled "${subdirectory}")" -- "${cur}") -} +function _compreply_candidates() { + local IFS=$'\n' -function _bash-it-comp-list-available() { - local subdirectory="$1" IFS=$'\n' REPL - COMPREPLY=('all') - while read -ra REPL; do - COMPREPLY+=("${REPL[@]}") - done < <(compgen -W "$(_bash-it-component-list "${subdirectory}")" -- "${cur}") -} - -function _bash-it-comp-list-profiles() { - local profiles IFS=$'\n' REPL - COMPREPLY=() - - profiles=("${BASH_IT}/profiles"/*.bash_it) - profiles=("${profiles[@]##*/}") - - while read -ra REPL; do - COMPREPLY+=("${REPL[@]}") - done < <(compgen -W "${profiles[*]%%.bash_it}" -- "${cur}") + read -d '' -ra COMPREPLY < <(compgen -W "${candidates[*]}" -- "${cur}") } function _bash-it-comp() { - local cur prev opts chose_opt file_type + local cur prev verb file_type candidates suffix COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD - 1]}" - chose_opt="${COMP_WORDS[1]}" + verb="${COMP_WORDS[1]}" file_type="${COMP_WORDS[2]:-}" - opts="disable enable help migrate reload restart profile doctor search show update version" - case "${chose_opt}" in + candidates=('disable' 'enable' 'help' 'migrate' 'reload' 'restart' 'profile' 'doctor' 'search' 'show' 'update' 'version') + case "${verb}" in show) - local show_args="aliases completions plugins" - COMPREPLY=($(compgen -W "${show_args}" -- "${cur}")) - return 0 + candidates=('aliases' 'completions' 'plugins') + _compreply_candidates ;; help) if [[ "${prev}" == "aliases" ]]; then - _bash-it-comp-list-available aliases - return 0 + candidates=('all' "$(_bash-it-component-list "${file_type}")") + _compreply_candidates else - local help_args="aliases completions migrate plugins update" - COMPREPLY=($(compgen -W "${help_args}" -- "${cur}")) - return 0 + candidates=('aliases' 'completions' 'migrate' 'plugins' 'update') + _compreply_candidates fi ;; profile) case "${file_type}" in - load) - if [[ "load" == "$prev" ]]; then - _bash-it-comp-list-profiles - fi - return 0 - ;; - rm) - if [[ "rm" == "$prev" ]]; then - _bash-it-comp-list-profiles + load | rm) + if [[ "${file_type}" == "$prev" ]]; then + candidates=("${BASH_IT}/profiles"/*.bash_it) + candidates=("${candidates[@]##*/}") + candidates=("${candidates[@]%%.bash_it}") + + _compreply_candidates fi - return 0 - ;; - save) - return 0 - ;; - list) - return 0 ;; + save | list) ;; *) - local profile_args="load save list rm" - COMPREPLY=($(compgen -W "${profile_args}" -- "${cur}")) - return 0 + candidates=('load' 'save' 'list' 'rm') + _compreply_candidates ;; esac ;; doctor) - local doctor_args="errors warnings all" - COMPREPLY=($(compgen -W "${doctor_args}" -- "${cur}")) - return 0 + candidates=('errors' 'warnings' 'all') + _compreply_candidates ;; update) if [[ "${cur}" == -* ]]; then - local update_args="-s --silent" + candidates=('-s' '--silent') else - local update_args="stable dev" + candidates=('stable' 'dev') fi - COMPREPLY=($(compgen -W "${update_args}" -- "${cur}")) - return 0 - ;; - migrate | reload | restart | search | version) - return 0 + _compreply_candidates ;; + migrate | reload | restart | search | version) ;; enable | disable) - if [[ "${chose_opt}" == "enable" ]]; then - suffix="available-not-enabled" + if [[ "${verb}" == "enable" ]]; then + suffix="disabled" else suffix="enabled" fi case "${file_type}" in alias | completion | plugin) - _bash-it-comp-list-"${suffix}" "${file_type}" - return 0 + candidates=('all' "$("_bash-it-component-list-${suffix}" "${file_type}")") + _compreply_candidates ;; *) - local enable_disable_args="alias completion plugin" - COMPREPLY=($(compgen -W "${enable_disable_args}" -- "${cur}")) - return 0 + candidates=('alias' 'completion' 'plugin') + _compreply_candidates ;; esac ;; + *) + _compreply_candidates + ;; esac - - COMPREPLY=($(compgen -W "${opts}" -- "${cur}")) - - return 0 } # Activate completion for bash-it and its common misspellings From 5f9a3f143fb4d5259a1c10605e7fb22bcf7dbf45 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Sun, 9 Jan 2022 21:30:24 -0800 Subject: [PATCH 5/5] completion/bash-it: rename `_bash-it-comp()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...to `_bash-it()`. The norm is for the completion function for, e.g., `teh_cmd`. to be named with the same name and a prepended underscore, i.e. `_teh_cmd`. This alsö reduces namespace confusion, which will be relevant in a future patch. --- completion/available/bash-it.completion.bash | 14 +++++++------- test/completion/bash-it.completion.bats | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/completion/available/bash-it.completion.bash b/completion/available/bash-it.completion.bash index 7ebe9ccc88..1f83d5c8b7 100644 --- a/completion/available/bash-it.completion.bash +++ b/completion/available/bash-it.completion.bash @@ -6,7 +6,7 @@ function _compreply_candidates() { read -d '' -ra COMPREPLY < <(compgen -W "${candidates[*]}" -- "${cur}") } -function _bash-it-comp() { +function _bash-it() { local cur prev verb file_type candidates suffix COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" @@ -83,9 +83,9 @@ function _bash-it-comp() { } # Activate completion for bash-it and its common misspellings -complete -F _bash-it-comp bash-it -complete -F _bash-it-comp bash-ti -complete -F _bash-it-comp shit -complete -F _bash-it-comp bashit -complete -F _bash-it-comp batshit -complete -F _bash-it-comp bash_it +complete -F _bash-it bash-it +complete -F _bash-it bash-ti +complete -F _bash-it shit +complete -F _bash-it bashit +complete -F _bash-it batshit +complete -F _bash-it bash_it diff --git a/test/completion/bash-it.completion.bats b/test/completion/bash-it.completion.bats index ceabb1a914..f23361850e 100755 --- a/test/completion/bash-it.completion.bats +++ b/test/completion/bash-it.completion.bats @@ -9,8 +9,8 @@ function local_setup { setup_test_fixture } -@test "completion bash-it: ensure that the _bash-it-comp function is available" { - type -a _bash-it-comp &> /dev/null +@test "completion bash-it: ensure that the _bash-it function is available" { + type -a _bash-it &> /dev/null assert_success } @@ -38,7 +38,7 @@ function __check_completion () { COMP_CWORD=$(( ${#COMP_WORDS[@]} - 1 )) # Run the Bash-it completion function - _bash-it-comp + _bash-it # Return the completion output echo "${COMPREPLY[@]}"