@@ -44,27 +44,44 @@ _muttrc()
4444}
4545
4646# Recursively build list of sourced config files
47- # @param $1 List of config files found so far
48- # @param $2 Config file to process
49- # @output List of config files
50- _muttconffiles ()
47+ # @param $1... Config file to process
48+ # @var[out] ret List of config files
49+ _comp_cmd_mutt__get_conffiles ()
5150{
52- local file sofar
53- local -a newconffiles
54-
55- sofar=" $1 "
56- shift
57- while [[ ${1-} ]]; do
58- newconffiles=($( command sed -n ' s|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' " $( eval printf %s $1 ) " ) )
59- for file in ${newconffiles+" ${newconffiles[@]} " } ; do
60- __expand_tilde_by_ref file
61- [[ ! -f $file || $sofar == * \ $file \ * ]] && continue
62- sofar+=" $file "
63- sofar=" $( eval _muttconffiles \" $sofar \" $file ) "
64- done
65- shift
51+ local -a conffiles=()
52+ local -A visited=()
53+ local file
54+ for file; do
55+ _comp_dequote " $file "
56+ _comp_cmd_mutt__get_conffiles__visit " $ret "
57+ done
58+ ret=(" ${conffiles[@]} " )
59+ }
60+ # Recursion function for _comp_cmd_mutt__get_conffiles
61+ # @var[ref] conffiles List of config files found so far
62+ # @var[ref] visited Dictionary of config files already visited
63+ _comp_cmd_mutt__get_conffiles__visit ()
64+ {
65+ [[ -f $1 && ${visited[$1]-} != yes ]] || return
66+ visited[$1 ]=yes
67+ conffiles+=(" $1 " )
68+
69+ local -a newconffiles=($( command sed -n ' s|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' " $1 " ) )
70+ local file
71+ for file in " ${newconffiles[@]} " ; do
72+ __expand_tilde_by_ref file
73+ _comp_cmd_mutt__get_conffiles__visit " $file "
6674 done
67- printf ' %s\n' $sofar
75+ }
76+
77+ # Recursively build list of sourced config files
78+ # @param $1... Config file to process
79+ # @output List of config files
80+ _muttconffiles ()
81+ {
82+ local ret
83+ _comp_cmd_mutt__get_conffiles " $@ "
84+ printf ' %s\n' " ${ret[@]} "
6885}
6986
7087# @param $1 (cur) Current word to complete
@@ -76,7 +93,9 @@ _muttaliases()
7693 muttrc=$( _muttrc)
7794 [[ -z $muttrc ]] && return
7895
79- conffiles=($( eval _muttconffiles $muttrc $muttrc ) )
96+ local ret
97+ _comp_cmd_mutt__get_conffiles " $muttrc "
98+ conffiles=(" ${ret[@]} " )
8099 # shellcheck disable=SC2046
81100 aliases=(" $( command sed -n ' s|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \
82101 " ${conffiles[@]} " ) " )
0 commit comments