Skip to content

Commit 715d530

Browse files
authored
Merge pull request #2298 from convergedtarkus/doNotReplaceCompletions
2 parents d763b08 + c5caae0 commit 715d530

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

completion/available/aliases.completion.bash

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,24 @@ function _bash-it-component-completion-callback-on-init-aliases() {
4040
line="${line#alias -- }"
4141
line="${line#alias }"
4242
alias_name="${line%%=*}"
43+
44+
# Skip aliases not added by this script that already have completion functions.
45+
# This allows users to define their own alias completion functions.
46+
# For aliases added by this script, we do want to replace them in case the
47+
# alias getting the completion added has changed.
48+
if complete -p "$alias_name" &> /dev/null; then
49+
# Get the -F argument from the existing completion for this alias.
50+
aliasCommandFunction=$(complete -p "$alias_name" | rev | cut -d " " -f 2 | rev)
51+
# Check if aliasCommandFunction starts with our namespace.
52+
if [[ "$aliasCommandFunction" != "_${namespace}::"* ]]; then
53+
continue
54+
fi
55+
56+
# Remove existing completion. It will be replaced by the new one. We need to
57+
# delete it in case the new alias does not support having completion added.
58+
complete -r "$alias_name"
59+
fi
60+
4361
alias_defn="${line#*=\'}" # alias definition
4462
alias_defn="${alias_defn%\'}"
4563
alias_cmd="${alias_defn%%[[:space:]]*}" # first word of alias
@@ -71,15 +89,20 @@ function _bash-it-component-completion-callback-on-init-aliases() {
7189
fi
7290
new_completion="$(complete -p "$alias_cmd" 2> /dev/null)"
7391

74-
# create a wrapper inserting the alias arguments if any
75-
if [[ -n $alias_args ]]; then
76-
compl_func="${new_completion/#* -F /}"
77-
compl_func="${compl_func%% *}"
78-
# avoid recursive call loops by ignoring our own functions
79-
if [[ "${compl_func#_"$namespace"::}" == "$compl_func" ]]; then
80-
compl_wrapper="_${namespace}::${alias_name}"
92+
compl_func="${new_completion/#* -F /}"
93+
compl_func="${compl_func%% *}"
94+
# avoid recursive call loops by ignoring our own functions
95+
if [[ "${compl_func#_"$namespace"::}" == "$compl_func" ]]; then
96+
compl_wrapper="_${namespace}::${alias_name}"
8197

82-
# Create a wrapper function for the alias
98+
if [[ -z $alias_args ]]; then
99+
# Create a wrapper without arguments.
100+
# This allows identifying the completions added by this script on reload.
101+
echo "function $compl_wrapper {
102+
$compl_func \"\$@\"
103+
}" >> "$tmp_file"
104+
else
105+
# Create a wrapper inserting the alias arguments
83106
# The use of printf on alias_arg_words is needed to ensure each element of
84107
# the array is quoted. E.X. (one two three) -> ('one' 'two' 'three')
85108
echo "function $compl_wrapper {
@@ -99,8 +122,8 @@ function _bash-it-component-completion-callback-on-init-aliases() {
99122
(( COMP_POINT += \${#COMP_LINE} ))
100123
\"$compl_func\" \"$alias_cmd\" \"\$compl_word\" \"\$prec_word\"
101124
}" >> "$tmp_file"
102-
new_completion="${new_completion/ -F $compl_func / -F $compl_wrapper }"
103125
fi
126+
new_completion="${new_completion/ -F $compl_func / -F $compl_wrapper }"
104127
fi
105128

106129
# replace completion trigger by alias

0 commit comments

Comments
 (0)