@@ -44,27 +44,48 @@ _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+ # @return 0 if any conffiles are generated, 1 if none is generated.
50+ _comp_cmd_mutt__get_conffiles ()
5151{
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
52+ local -a conffiles=()
53+ local -A visited=()
54+ local file
55+ for file; do
56+ _comp_dequote " $file "
57+ _comp_cmd_mutt__get_conffiles__visit " $ret "
58+ done
59+ (( ${# conffiles[@]} )) || return 1
60+ ret=(" ${conffiles[@]} " )
61+ }
62+ # Recursion function for _comp_cmd_mutt__get_conffiles
63+ # @var[ref] conffiles List of config files found so far
64+ # @var[ref] visited Dictionary of config files already visited
65+ _comp_cmd_mutt__get_conffiles__visit ()
66+ {
67+ [[ -f $1 && ${visited[$1]-} != yes ]] || return 0
68+ visited[$1 ]=yes
69+ conffiles+=(" $1 " )
70+
71+ local -a newconffiles=($( command sed -n ' s|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' " $1 " ) )
72+ (( ${# newconffiles[@]} )) || return 0
73+
74+ local file
75+ for file in " ${newconffiles[@]} " ; do
76+ __expand_tilde_by_ref file
77+ _comp_cmd_mutt__get_conffiles__visit " $file "
6678 done
67- printf ' %s\n' $sofar
79+ }
80+
81+ # Recursively build list of sourced config files
82+ # @param $1... Config file to process
83+ # @output List of config files
84+ _muttconffiles ()
85+ {
86+ local ret
87+ _comp_cmd_mutt__get_conffiles " $@ " &&
88+ printf ' %s\n' " ${ret[@]} "
6889}
6990
7091# @param $1 (cur) Current word to complete
@@ -76,7 +97,9 @@ _muttaliases()
7697 muttrc=$( _muttrc)
7798 [[ ! $muttrc ]] && return
7899
79- conffiles=($( eval _muttconffiles $muttrc $muttrc ) )
100+ local ret
101+ _comp_cmd_mutt__get_conffiles " $muttrc " || return 0
102+ conffiles=(" ${ret[@]} " )
80103 # shellcheck disable=SC2046
81104 aliases=(" $( command sed -n ' s|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \
82105 " ${conffiles[@]} " ) " )
0 commit comments