summaryrefslogtreecommitdiffstats
path: root/completions/mutt
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--completions/mutt160
1 files changed, 160 insertions, 0 deletions
diff --git a/completions/mutt b/completions/mutt
new file mode 100644
index 0000000..1161487
--- /dev/null
+++ b/completions/mutt
@@ -0,0 +1,160 @@
+# 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
+_muttaddr()
+{
+ _muttaliases "$1"
+ _muttquery "$1"
+
+ COMPREPLY+=($(compgen -u -- "$1"))
+}
+
+# Find muttrc to use
+# @output muttrc filename
+_muttrc()
+{
+ # Search COMP_WORDS for '-F muttrc' or '-Fmuttrc' argument
+ set -- "${words[@]}"
+ while (($# > 0)); do
+ if [[ $1 == -F* ]]; then
+ if ((${#1} > 2)); then
+ muttrc="$(dequote "${1:2}")"
+ else
+ shift
+ [[ $1 ]] && muttrc="$(dequote "$1")"
+ fi
+ break
+ fi
+ shift
+ done
+
+ if [[ ! -v 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-}"
+}
+
+# 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=($(command sed -n 's|^source[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' "$(eval printf %s $1)"))
+ for file in ${newconffiles+"${newconffiles[@]}"}; do
+ __expand_tilde_by_ref file
+ [[ ! -f $file || $sofar == *\ $file\ * ]] && continue
+ sofar+=" $file"
+ sofar=" $(eval _muttconffiles \"$sofar\" $file) "
+ done
+ shift
+ done
+ printf '%s\n' $sofar
+}
+
+# @param $1 (cur) Current word to complete
+_muttaliases()
+{
+ local cur=$1 muttrc muttcmd=${words[0]}
+ local -a conffiles aliases
+
+ muttrc=$(_muttrc)
+ [[ -z $muttrc ]] && return
+
+ conffiles=($(eval _muttconffiles $muttrc $muttrc))
+ # shellcheck disable=SC2046
+ aliases=("$(command sed -n 's|^alias[[:space:]]\{1,\}\([^[:space:]]\{1,\}\).*$|\1|p' \
+ $(eval echo "${conffiles[@]}"))")
+ COMPREPLY+=($(compgen -W "${aliases[*]}" -- "$cur"))
+}
+
+# @param $1 (cur) Current word to complete
+_muttquery()
+{
+ local cur=$1 querycmd muttcmd=${words[0]}
+ local -a queryresults
+
+ querycmd="$($muttcmd -Q query_command 2>/dev/null | command sed -e 's|^query_command=\"\(.*\)\"$|\1|' -e 's|%s|'$cur'|')"
+ if [[ -z $cur || -z $querycmd ]]; then
+ queryresults=()
+ else
+ __expand_tilde_by_ref querycmd
+ queryresults=($($querycmd |
+ command sed -n '2,$s|^\([^[:space:]]\{1,\}\).*|\1|p'))
+ fi
+
+ COMPREPLY+=($(compgen -W "${queryresults[*]}" -- "$cur"))
+}
+
+# @param $1 (cur) Current word to complete
+_muttfiledir()
+{
+ local cur=$1 folder muttrc spoolfile muttcmd=${words[0]}
+
+ muttrc=$(_muttrc)
+ if [[ $cur == [=+]* ]]; then
+ folder="$($muttcmd -F "$muttrc" -Q folder 2>/dev/null | command 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
+ elif [[ $cur == !* ]]; then
+ spoolfile="$($muttcmd -F "$muttrc" -Q spoolfile 2>/dev/null |
+ command sed -e 's|^spoolfile=\"\(.*\)\"$|\1|')"
+ [[ -n $spoolfile ]] && eval cur="${cur/^!/$spoolfile}"
+ fi
+ _filedir
+}
+
+_mutt()
+{
+ local cur prev words cword
+ _init_completion -n =+! || return
+
+ 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
+ ;;
+ *)
+ case $prev in
+ -*[afFHi])
+ _muttfiledir "$cur"
+ return
+ ;;
+ -*A)
+ _muttaliases "$cur"
+ return
+ ;;
+ -*[emQshpRvyzZ])
+ return
+ ;;
+ *)
+ _muttaddr "$cur"
+ return
+ ;;
+ esac
+ ;;
+ esac
+} &&
+ complete -F _mutt -o default mutt muttng
+
+# ex: filetype=sh