summaryrefslogtreecommitdiff
path: root/contrib/mutt
blob: 62540bde54f5109bb29da36900d15d61046a9883 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# 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 && {
_muttaddr()
{
    _muttaliases
    _muttquery

    cur=`_get_cword`
    COMPREPLY=( "${COMPREPLY[@]}" $( compgen -u -- "$cur" ) )

    return 0
}

_muttconffiles()
{
    local file sofar
    local -a newconffiles

    sofar=" $1 "
    shift
    while [[ "$1" ]]; do
        newconffiles=( $(sed -rn 's|^source[[:space:]]+([^[:space:]]+).*$|\1|p' $(eval echo $1) ) )
        for file in "${newconffiles[@]}"; do
        [[ ! "$file" ]] || [[ "${sofar/ ${file} / }" != "$sofar" ]] &&
            continue
        sofar="$sofar $file"
        sofar=" $(eval _muttconffiles \"$sofar\" $file) "
        done
        shift
    done
    echo $sofar
}

_muttaliases()
{
    local cur muttrc muttcmd=${COMP_WORDS[0]}
    local -a conffiles aliases
    cur=`_get_cword =`

    [ -f ~/.${muttcmd}/${muttcmd}rc ] && muttrc="~/.${muttcmd}/${muttcmd}rc"
    [ -f ~/.${muttcmd}rc ] && muttrc="~/.${muttcmd}rc"
    [ -z "$muttrc" ] && return 0

    conffiles=( $(eval _muttconffiles $muttrc $muttrc) )
    aliases=( $( sed -rn 's|^alias[[:space:]]+([^[:space:]]+).*$|\1|p' \
        $(eval echo "${conffiles[@]}") ) )
    COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "${aliases[*]}" -- "$cur" ) )

    return 0
}

_muttquery()
{
    local cur querycmd muttcmd=${COMP_WORDS[0]}
    local -a queryresults
    cur=`_get_cword`

    querycmd="$( $muttcmd -Q query_command  | sed -r 's|^query_command=\"(.*)\"$|\1|; s|%s|'$cur'|' )"
    if [ -z "$cur" -o -z "$querycmd" ]; then
        queryresults=()
    else
        queryresults=( $( $querycmd | sed -nr '2,$s|^([^[:space:]]+).*|\1|p' ) )
    fi

    COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "${queryresults[*]}" \
        -- "$cur" ) )

    return 0
}

_muttfiledir()
{
    local cur folder spoolfile muttcmd=${COMP_WORDS[0]}
    cur=`_get_cword`

    # This is currently not working so well. Perhaps this function should
    # just call _filedir() for the moment.
    if [[ $cur == [=+]* ]]; then
        folder="$( $muttcmd -Q folder | sed -r 's|^folder=\"(.*)\"$|\1|' )"
        : folder:=~/Mail

        # Match any file in $folder beginning with $cur
        # (minus the leading '=' sign).
        COMPREPLY=( $( compgen -f -- "$folder/${cur:1}" ) )
        COMPREPLY=( ${COMPREPLY[@]#$folder/} )
        return 0
    elif [ "$cur" == !* ]; then
        spoolfile="$( $muttcmd -Q spoolfile | \
            sed -r 's|^spoolfile=\"(.*)\"$|\1|' )"
        [ ! -z "$spoolfile" ] && eval cur="${cur/^!/$spoolfile}";
    fi
    _filedir

    return 0
}

_mutt()
{
    local cur prev
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    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
            return 0
            ;;
        -A)
            _muttaliases
            return 0
            ;;
        -@(e|m|Q|s|h|p|R|v|y|z|Z))
            return 0
            ;;
        *)
            _muttaddr
            return 0
            ;;
        esac
        ;;
    esac

}
complete -F _mutt $default $filenames mutt muttng
}

# 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