# mutt completion -*- shell-script -*- # # Mutt doesn't have an "addressbook" like Pine, but it has aliases and # a "query" function to retrieve addresses, so that's what we use here. # @param $1 (cur) Current word to complete proc _muttaddr { _muttaliases $1 _muttquery $1 setglobal COMPREPLY = '( '$( compgen -u -- "$1" ) ) return 0 } # Find muttrc to use # @output muttrc filename proc _muttrc { # Search COMP_WORDS for '-F muttrc' or '-Fmuttrc' argument set -- $(words[@]) { if [[ $1 == -F* ]] { if [[ ${#1} -gt 2 ]] { setglobal muttrc = $[dequote $(1:2)] } else { shift [[ $1 ]] && setglobal muttrc = $[dequote $1] } break } shift } if [[ -z $muttrc ]] { if [[ -f ~/.${muttcmd}rc ]] { setglobal muttrc = ""~/.$(muttcmd)rc"" } elif [[ -f ~/.${muttcmd}/${muttcmd}rc ]] { setglobal muttrc = ""~/.$(muttcmd)/$(muttcmd)rc"" } } printf "%s" $muttrc } # Recursively build list of sourced config files # @param $1 List of config files found so far # @param $2 Config file to process # @output List of config files proc _muttconffiles { var file = '', sofar = '' var -a newconffiles = '' set sofar = "" $1 "" shift { set newconffiles = '( '$(sed -n 's|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' $(eval printf %s $1) ) ) for file in [$(newconffiles[@])] { __expand_tilde_by_ref file [[ ! -f "$file" || $sofar == *\ $file\ * ]] && continue set sofar = "" $file"" set sofar = "" $[eval _muttconffiles '"'$sofar'"' $file] "" } shift } printf '%s\n' $sofar } # @param $1 (cur) Current word to complete proc _muttaliases { var cur = $1, muttrc = '', muttcmd = $(words[0]) var -a conffiles = '', aliases = '' set muttrc = $[_muttrc] [[ -z $muttrc ]] && return 0 set conffiles = '( '$(eval _muttconffiles $muttrc $muttrc) ) set aliases = '( '$( sed -n 's|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \ $(eval echo "${conffiles[@]}") ) ) setglobal COMPREPLY = '( '$( compgen -W "${aliases[*]}" -- "$cur" ) ) return 0 } # @param $1 (cur) Current word to complete proc _muttquery { var cur = $1, querycmd = '', muttcmd = $(words[0]) var -a queryresults = '' set querycmd = $[ $muttcmd -Q query_command !2 >/dev/null | sed -e 's|^query_command=\"\(.*\)\"$|\1|' -e 's|%s|'$cur'|] if [[ -z "$cur" || -z "$querycmd" ]] { set queryresults = ''() } else { __expand_tilde_by_ref querycmd set queryresults = '( '$( $querycmd | \ sed -n '2,$s|^\([^[:space:]]\{1,\}\).*|\1|p' ) ) } setglobal COMPREPLY = '( '$( compgen -W "${queryresults[*]}" -- "$cur" ) ) return 0 } # @param $1 (cur) Current word to complete proc _muttfiledir { var cur = $1, folder = '', muttrc = '', spoolfile = '', muttcmd = $(words[0]) set muttrc = $[_muttrc] if [[ $cur == [=+]* ]] { set folder = $[ $muttcmd -F $muttrc -Q folder !2 >/dev/null | sed -e 's|^folder=\"\(.*\)\"$|\1|] : folder:=~/Mail # Match any file in $folder beginning with $cur # (minus the leading '=' sign). compopt -o filenames setglobal COMPREPLY = '( '$( compgen -f -- "$folder/${cur:1}" ) ) setglobal COMPREPLY = '( '${COMPREPLY[@]#$folder/} ) return 0 } elif [[ $cur == !* ]] { set spoolfile = $[ $muttcmd -F $muttrc -Q spoolfile !2 >/dev/null | \ sed -e 's|^spoolfile=\"\(.*\)\"$|\1|] [[ ! -z $spoolfile ]] && eval cur="$(cur/^!/$spoolfile)" } _filedir return 0 } proc _mutt { var cur = '', prev = '', words = '', cword = '' _init_completion -n =+! || return match $cur { with -* setglobal COMPREPLY = '( '$( compgen -W '-A -a -b -c -e -f -F -H -i -m -n -p -Q -R -s -v -x -y -z -Z -h' -- "$cur" ) ) return 0 with * match $prev { with -a|-f|-F|-H|-i _muttfiledir $cur return 0 with -A _muttaliases $cur return 0 with -e|-m|-Q|-s|-h|-p|-R|-v|-y|-z|-Z return 0 with * _muttaddr $cur return 0 } } } && complete -F _mutt -o default mutt muttng # ex: ts=4 sw=4 et filetype=sh