diff options
Diffstat (limited to 'completions/mutt')
-rw-r--r-- | completions/mutt | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/completions/mutt b/completions/mutt new file mode 100644 index 00000000..e5e9d289 --- /dev/null +++ b/completions/mutt @@ -0,0 +1,186 @@ +# mutt completion +# +# 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. + +have mutt || have muttng && { + +# @param $1 (cur) Current word to complete +_muttaddr() +{ + _muttaliases "$1" + _muttquery "$1" + + COMPREPLY=( "${COMPREPLY[@]}" $( compgen -u -- "$1" ) ) + + return 0 +} # _muttaddr() + + +# Find muttrc to use +# @output muttrc filename +_muttrc() +{ + # Search COMP_WORDS for '-F muttrc' or '-Fmuttrc' argument + set -- "${COMP_WORDS[@]}" + while [ $# -gt 0 ]; do + if [ "${1:0:2}" = -F ]; then + if [ ${#1} -gt 2 ]; then + muttrc="$(dequote "${1:2}")" + else + shift + [ "$1" ] && muttrc="$(dequote "$1")" + fi + break + fi + shift + done + + if [ -z "$muttrc" ]; then + if [ -f ~/.${muttcmd}rc ]; then + muttrc="~/.${muttcmd}rc" + elif [ -f ~/.${muttcmd}/${muttcmd}rc ]; then + muttrc="~/.${muttcmd}/${muttcmd}rc" + fi + fi + printf "%s" "$muttrc" +} # _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 +_muttconffiles() +{ + local file sofar + local -a newconffiles + + sofar=" $1 " + shift + while [[ "$1" ]]; do + newconffiles=( $(sed -n 's|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' $(eval echo $1) ) ) + for file in "${newconffiles[@]}"; do + [[ ! -f "$file" || "${sofar/ ${file} / }" != "$sofar" ]] && + continue + sofar="$sofar $file" + sofar=" $(eval _muttconffiles \"$sofar\" $file) " + done + shift + done + printf '%s\n' $sofar +} # _muttconffiles() + + +# @param $1 (cur) Current word to complete +_muttaliases() +{ + local cur=$1 muttrc muttcmd=${COMP_WORDS[0]} + local -a conffiles aliases + + muttrc=$(_muttrc) + [ -z "$muttrc" ] && return 0 + + conffiles=( $(eval _muttconffiles $muttrc $muttrc) ) + aliases=( $( sed -n 's|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \ + $(eval echo "${conffiles[@]}") ) ) + COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "${aliases[*]}" -- "$cur" ) ) + + return 0 +} + + +# @param $1 (cur) Current word to complete +_muttquery() +{ + local cur=$1 querycmd muttcmd=${COMP_WORDS[0]} + local -a queryresults + + querycmd="$( $muttcmd -Q query_command | sed -e 's|^query_command=\"\(.*\)\"$|\1|' -e 's|%s|'$cur'|' )" + if [[ -z "$cur" || -z "$querycmd" ]]; then + queryresults=() + else + queryresults=( $( $querycmd | \ + sed -n '2,$s|^\([^[:space:]]\{1,\}\).*|\1|p' ) ) + fi + + COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "${queryresults[*]}" \ + -- "$cur" ) ) + + return 0 +} + + +# @param $1 (cur) Current word to complete +_muttfiledir() +{ + local cur=$1 folder muttrc spoolfile muttcmd=${COMP_WORDS[0]} + + muttrc=$(_muttrc) + if [[ $cur == [=+]* ]]; then + folder="$( $muttcmd -F "$muttrc" -Q folder | sed -e 's|^folder=\"\(.*\)\"$|\1|' )" + : folder:=~/Mail + + # Match any file in $folder beginning with $cur + # (minus the leading '=' sign). + _compopt_o_filenames + COMPREPLY=( $( compgen -f -- "$folder/${cur:1}" ) ) + COMPREPLY=( ${COMPREPLY[@]#$folder/} ) + return 0 + elif [ "$cur" == !* ]; then + spoolfile="$( $muttcmd -F "$muttrc" -Q spoolfile | \ + sed -e 's|^spoolfile=\"\(.*\)\"$|\1|' )" + [ ! -z "$spoolfile" ] && eval cur="${cur/^!/$spoolfile}"; + fi + _filedir + + return 0 +} # _muttfiledir + + +_mutt() +{ + local cur prev + _get_comp_words_by_ref -n =+! cur prev + #cur=`_get_cword =+!` + #prev=`_get_pword =+!` + + COMPREPLY=() + + case $cur in + -*) + 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 + ;; + *) + case $prev in + -a|-f|-F|-H|-i) + _muttfiledir "$cur" + return 0 + ;; + -A) + _muttaliases "$cur" + return 0 + ;; + -e|-m|-Q|-s|-h|-p|-R|-v|-y|-z|-Z) + return 0 + ;; + *) + _muttaddr "$cur" + return 0 + ;; + esac + ;; + esac +} # _mutt() +complete -F _mutt -o default mutt muttng +} # have mutt + +# Local variables: +# mode: shell-script +# sh-basic-offset: 4 +# sh-indent-comment: t +# indent-tabs-mode: nil +# End: +# ex: ts=4 sw=4 et filetype=sh |