diff options
| author | David Bremner <bremner@debian.org> | 2019-02-17 07:30:33 -0400 |
|---|---|---|
| committer | David Bremner <bremner@debian.org> | 2019-02-17 07:30:33 -0400 |
| commit | f7130468d27c4f37d45e6aa60baacfc3329ccff4 (patch) | |
| tree | f26a901f6e28185d60200c9111de30e1c15b4996 /completion | |
Import notmuch_0.28.2.orig.tar.gz
[dgit import orig notmuch_0.28.2.orig.tar.gz]
Diffstat (limited to 'completion')
| -rw-r--r-- | completion/Makefile | 7 | ||||
| -rw-r--r-- | completion/Makefile.local | 22 | ||||
| -rw-r--r-- | completion/README | 16 | ||||
| -rw-r--r-- | completion/notmuch-completion.bash | 622 | ||||
| -rw-r--r-- | completion/zsh/_email-notmuch | 9 | ||||
| -rw-r--r-- | completion/zsh/_notmuch | 293 |
6 files changed, 969 insertions, 0 deletions
diff --git a/completion/Makefile b/completion/Makefile new file mode 100644 index 00000000..de492a7c --- /dev/null +++ b/completion/Makefile @@ -0,0 +1,7 @@ +# See Makefile.local for the list of files to be compiled in this +# directory. +all: + $(MAKE) -C .. all + +.DEFAULT: + $(MAKE) -C .. $@ diff --git a/completion/Makefile.local b/completion/Makefile.local new file mode 100644 index 00000000..8e86c9d2 --- /dev/null +++ b/completion/Makefile.local @@ -0,0 +1,22 @@ +# -*- makefile -*- + +dir := completion + +# The dir variable will be re-assigned to later, so we can't use it +# directly in any shell commands. Instead we save its value in other, +# private variables that we can use in the commands. +bash_script := $(srcdir)/$(dir)/notmuch-completion.bash +zsh_scripts := $(srcdir)/$(dir)/zsh/_notmuch $(srcdir)/$(dir)/zsh/_email-notmuch + +install: install-$(dir) + +install-$(dir): + @echo $@ +ifeq ($(WITH_BASH),1) + mkdir -p "$(DESTDIR)$(bash_completion_dir)" + install -m0644 $(bash_script) "$(DESTDIR)$(bash_completion_dir)/notmuch" +endif +ifeq ($(WITH_ZSH),1) + mkdir -p "$(DESTDIR)$(zsh_completion_dir)" + install -m0644 $(zsh_scripts) "$(DESTDIR)$(zsh_completion_dir)" +endif diff --git a/completion/README b/completion/README new file mode 100644 index 00000000..900e1c98 --- /dev/null +++ b/completion/README @@ -0,0 +1,16 @@ +notmuch completion + +This directory contains support for various shells to automatically +complete partially entered notmuch command lines. + +notmuch-completion.bash + + Command-line completion for the bash shell. This depends on + bash-completion package [1] version 2.0, which depends on bash + version 3.2 or later. + + [1] https://github.com/scop/bash-completion + +zsh + + Command-line completions for the zsh shell. diff --git a/completion/notmuch-completion.bash b/completion/notmuch-completion.bash new file mode 100644 index 00000000..15425697 --- /dev/null +++ b/completion/notmuch-completion.bash @@ -0,0 +1,622 @@ +# bash completion for notmuch -*- shell-script -*- +# +# Copyright © 2013 Jani Nikula +# +# Based on the bash-completion package: +# https://github.com/scop/bash-completion +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see https://www.gnu.org/licenses/ . +# +# Author: Jani Nikula <jani@nikula.org> +# +# +# BUGS: +# +# Add space after an --option without parameter (e.g. reply --decrypt) +# on completion. +# + +_notmuch_shared_options="--help --uuid= --version" + +# $1: current input of the form prefix:partialinput, where prefix is +# to or from. +_notmuch_email() +{ + local output prefix cur + + prefix="${1%%:*}" + cur="${1#*:}" + + # Cut the input to be completed at punctuation because + # (apparently) Xapian does not support the trailing wildcard '*' + # operator for input with punctuation. We let compgen handle the + # extra filtering required. + cur="${cur%%[^a-zA-Z0-9]*}" + + case "$prefix" in + # Note: It would be more accurate and less surprising to have + # output=recipients here for to: addresses, but as gathering + # the recipient addresses requires disk access for each + # matching message, this becomes prohibitively slow. + to|from) output=sender;; + *) return;; + esac + + # Only emit plain, lower case, unique addresses. + notmuch address --output=$output $prefix:"${cur}*" | \ + sed 's/[^<]*<\([^>]*\)>/\1/' | tr "[:upper:]" "[:lower:]" | sort -u +} + +_notmuch_mimetype() +{ + # use mime types from mime-support package if available, and fall + # back to a handful of common ones otherwise + if [ -r "/etc/mime.types" ]; then + sed -n '/^[[:alpha:]]/{s/[[:space:]].*//;p;}' /etc/mime.types + else + cat <<EOF +application/gzip +application/msword +application/pdf +application/zip +audio/mpeg +audio/ogg +image/gif +image/jpeg +image/png +message/rfc822 +text/calendar +text/html +text/plain +text/vcard +text/x-diff +text/x-vcalendar +EOF + fi +} + +_notmuch_search_terms() +{ + local cur prev words cword split + # handle search prefixes and tags with colons and equal signs + _init_completion -n := || return + + case "${cur}" in + tag:*) + COMPREPLY=( $(compgen -P "tag:" -W "`notmuch search --output=tags \*`" -- ${cur##tag:}) ) + ;; + to:*) + COMPREPLY=( $(compgen -P "to:" -W "`_notmuch_email ${cur}`" -- ${cur##to:}) ) + ;; + from:*) + COMPREPLY=( $(compgen -P "from:" -W "`_notmuch_email ${cur}`" -- ${cur##from:}) ) + ;; + path:*) + local path=`notmuch config get database.path` + compopt -o nospace + COMPREPLY=( $(compgen -d "$path/${cur##path:}" | sed "s|^$path/||" ) ) + ;; + folder:*) + local path=`notmuch config get database.path` + compopt -o nospace + COMPREPLY=( $(compgen -d "$path/${cur##folder:}" | \ + sed "s|^$path/||" | grep -v "\(^\|/\)\(cur\|new\|tmp\)$" ) ) + ;; + mimetype:*) + compopt -o nospace + COMPREPLY=( $(compgen -P "mimetype:" -W "`_notmuch_mimetype ${cur}`" -- ${cur##mimetype:}) ) + ;; + query:*) + compopt -o nospace + COMPREPLY=( $(compgen -P "query:" -W "`notmuch config list | sed -n '/^query\./s/^query\.\([^=]*\)=.*/\1/p'`" -- ${cur##query:}) ) + ;; + *) + local search_terms="from: to: subject: attachment: mimetype: tag: id: thread: folder: path: date: lastmod: query: property:" + compopt -o nospace + COMPREPLY=( $(compgen -W "${search_terms}" -- ${cur}) ) + ;; + esac + # handle search prefixes and tags with colons + __ltrim_colon_completions "${cur}" +} + +_notmuch_compact() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --backup) + _filedir -d + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--backup= --quiet ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + esac +} + +_notmuch_config() +{ + local cur prev words cword split + _init_completion || return + + case "${prev}" in + config) + COMPREPLY=( $(compgen -W "get set list" -- ${cur}) ) + ;; + get|set) + COMPREPLY=( $(compgen -W "`notmuch config list | sed 's/=.*\$//'`" -- ${cur}) ) + ;; + # these will also complete on config get, but we don't care + database.path) + _filedir -d + ;; + maildir.synchronize_flags) + COMPREPLY=( $(compgen -W "true false" -- ${cur}) ) + ;; + esac +} + +_notmuch_count() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --output) + COMPREPLY=( $( compgen -W "messages threads files" -- "${cur}" ) ) + return + ;; + --exclude) + COMPREPLY=( $( compgen -W "true false" -- "${cur}" ) ) + return + ;; + --input) + _filedir + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--output= --exclude= --batch --input= --lastmod ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + *) + _notmuch_search_terms + ;; + esac +} + +_notmuch_dump() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --format) + COMPREPLY=( $( compgen -W "sup batch-tag" -- "${cur}" ) ) + return + ;; + --output) + _filedir + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--gzip --format= --output= ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + *) + _notmuch_search_terms + ;; + esac +} + +_notmuch_emacs_mua() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --to|--cc|--bcc) + COMPREPLY=( $(compgen -W "`_notmuch_email to:${cur}`" -- ${cur}) ) + return + ;; + --body) + _filedir + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--subject= --to= --cc= --bcc= --body= --no-window-system --client --auto-daemon --create-frame --print --help --hello" + + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + *) + COMPREPLY=( $(compgen -W "`_notmuch_email to:${cur}`" -- ${cur}) ) + return + ;; + esac +} + +_notmuch_insert() +{ + local cur prev words cword split + # handle tags with colons and equal signs + _init_completion -s -n := || return + + $split && + case "${prev}" in + --folder) + local path=`notmuch config get database.path` + compopt -o nospace + COMPREPLY=( $(compgen -d "$path/${cur}" | \ + sed "s|^$path/||" | grep -v "\(^\|/\)\(cur\|new\|tmp\)$" ) ) + return + ;; + --decrypt) + COMPREPLY=( $( compgen -W "true false auto nostash" -- "${cur}" ) ) + return + ;; + esac + + ! $split && + case "${cur}" in + --*) + local options="--create-folder --folder= --keep --no-hooks --decrypt= ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + return + ;; + +*) + COMPREPLY=( $(compgen -P "+" -W "`notmuch search --output=tags \*`" -- ${cur##+}) ) + ;; + -*) + COMPREPLY=( $(compgen -P "-" -W "`notmuch search --output=tags \*`" -- ${cur##-}) ) + ;; + esac + # handle tags with colons + __ltrim_colon_completions "${cur}" +} + +_notmuch_new() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --decrypt) + COMPREPLY=( $( compgen -W "true false auto nostash" -- "${cur}" ) ) + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--no-hooks --decrypt= --quiet ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "${options}" -- ${cur}) ) + ;; + esac +} + +_notmuch_reply() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --format) + COMPREPLY=( $( compgen -W "default json sexp headers-only" -- "${cur}" ) ) + return + ;; + --reply-to) + COMPREPLY=( $( compgen -W "all sender" -- "${cur}" ) ) + return + ;; + --decrypt) + COMPREPLY=( $( compgen -W "true auto false" -- "${cur}" ) ) + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--format= --format-version= --reply-to= --decrypt= ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + *) + _notmuch_search_terms + ;; + esac +} + +_notmuch_restore() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --format) + COMPREPLY=( $( compgen -W "sup batch-tag auto" -- "${cur}" ) ) + return + ;; + --input) + _filedir + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--format= --accumulate --input= ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + esac +} + +_notmuch_search() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --format) + COMPREPLY=( $( compgen -W "json sexp text text0" -- "${cur}" ) ) + return + ;; + --output) + COMPREPLY=( $( compgen -W "summary threads messages files tags" -- "${cur}" ) ) + return + ;; + --sort) + COMPREPLY=( $( compgen -W "newest-first oldest-first" -- "${cur}" ) ) + return + ;; + --exclude) + COMPREPLY=( $( compgen -W "true false flag all" -- "${cur}" ) ) + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--format= --output= --sort= --offset= --limit= --exclude= --duplicate= ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + *) + _notmuch_search_terms + ;; + esac +} + +_notmuch_reindex() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --decrypt) + COMPREPLY=( $( compgen -W "true false auto nostash" -- "${cur}" ) ) + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--decrypt= ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + *) + _notmuch_search_terms + ;; + esac +} + +_notmuch_address() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --format) + COMPREPLY=( $( compgen -W "json sexp text text0" -- "${cur}" ) ) + return + ;; + --output) + COMPREPLY=( $( compgen -W "sender recipients count address" -- "${cur}" ) ) + return + ;; + --sort) + COMPREPLY=( $( compgen -W "newest-first oldest-first" -- "${cur}" ) ) + return + ;; + --exclude) + COMPREPLY=( $( compgen -W "true false flag all" -- "${cur}" ) ) + return + ;; + --deduplicate) + COMPREPLY=( $( compgen -W "no mailbox address" -- "${cur}" ) ) + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--format= --output= --sort= --exclude= --deduplicate= ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + *) + _notmuch_search_terms + ;; + esac +} + +_notmuch_show() +{ + local cur prev words cword split + _init_completion -s || return + + $split && + case "${prev}" in + --entire-thread) + COMPREPLY=( $( compgen -W "true false" -- "${cur}" ) ) + return + ;; + --format) + COMPREPLY=( $( compgen -W "text json sexp mbox raw" -- "${cur}" ) ) + return + ;; + --exclude|--body) + COMPREPLY=( $( compgen -W "true false" -- "${cur}" ) ) + return + ;; + --decrypt) + COMPREPLY=( $( compgen -W "true auto false stash" -- "${cur}" ) ) + return + ;; + esac + + ! $split && + case "${cur}" in + -*) + local options="--entire-thread= --format= --exclude= --body= --format-version= --part= --verify --decrypt= --include-html ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + ;; + *) + _notmuch_search_terms + ;; + esac +} + +_notmuch_tag() +{ + local cur prev words cword split + # handle tags with colons and equal signs + _init_completion -s -n := || return + + $split && + case "${prev}" in + --input) + _filedir + return + ;; + esac + + ! $split && + case "${cur}" in + --*) + local options="--batch --input= --remove-all ${_notmuch_shared_options}" + compopt -o nospace + COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) + return + ;; + +*) + COMPREPLY=( $(compgen -P "+" -W "`notmuch search --output=tags \*`" -- ${cur##+}) ) + ;; + -*) + COMPREPLY=( $(compgen -P "-" -W "`notmuch search --output=tags \*`" -- ${cur##-}) ) + ;; + *) + _notmuch_search_terms + return + ;; + esac + # handle tags with colons + __ltrim_colon_completions "${cur}" +} + +_notmuch() +{ + local _notmuch_commands="compact config count dump help insert new reply restore reindex search address setup show tag emacs-mua" + local arg cur prev words cword split + + # require bash-completion with _init_completion + type -t _init_completion >/dev/null 2>&1 || return + + _init_completion || return + + COMPREPLY=() + + # subcommand + _get_first_arg + + # complete --help option like the subcommand + if [ -z "${arg}" -a "${prev}" = "--help" ]; then + arg="help" + fi + + if [ -z "${arg}" ]; then + # top level completion + case "${cur}" in + -*) + # XXX: handle ${_notmuch_shared_options} and --config= + local options="--help --version" + COMPREPLY=( $(compgen -W "${options}" -- ${cur}) ) + ;; + *) + COMPREPLY=( $(compgen -W "${_notmuch_commands}" -- ${cur}) ) + ;; + esac + elif [ "${arg}" = "help" ]; then + # handle help command specially due to _notmuch_commands usage + local help_topics="$_notmuch_commands hooks search-terms properties" + COMPREPLY=( $(compgen -W "${help_topics}" -- ${cur}) ) + else + # complete using _notmuch_subcommand if one exist + local completion_func="_notmuch_${arg//-/_}" + declare -f $completion_func >/dev/null && $completion_func + fi +} && +complete -F _notmuch notmuch diff --git a/completion/zsh/_email-notmuch b/completion/zsh/_email-notmuch new file mode 100644 index 00000000..1cd0d78f --- /dev/null +++ b/completion/zsh/_email-notmuch @@ -0,0 +1,9 @@ +#autoload + +local expl +local -a notmuch_addr + +notmuch_addr=( ${(f)"$(notmuch address --deduplicate=address --output=address -- from:/$PREFIX/)"} ) + +_description notmuch-addr expl 'email address (notmuch)' +compadd "$expl[@]" -a notmuch_addr diff --git a/completion/zsh/_notmuch b/completion/zsh/_notmuch new file mode 100644 index 00000000..e920f10b --- /dev/null +++ b/completion/zsh/_notmuch @@ -0,0 +1,293 @@ +#compdef notmuch -p notmuch-* + +# ZSH completion for `notmuch` +# Copyright © 2018 Vincent Breitmoser <look@my.amazin.horse> + +_notmuch_command() { + local -a notmuch_commands + notmuch_commands=( + 'help:display documentation for a subcommand' + 'setup:interactively configure notmuch' + + 'address:output addresses from matching messages' + 'compact:compact the notmuch database' + 'config:access notmuch configuration file' + 'count:count messages matching the given search terms' + 'dump:creates a plain-text dump of the tags of each message' + 'insert:add a message to the maildir and notmuch database' + 'new:incorporate new mail into the notmuch database' + 'reindex:re-index a set of messages' + 'reply:constructs a reply template for a set of messages' + 'restore:restores the tags from the given file (see notmuch dump)' + 'search:search for messages matching the given search terms' + 'show:show messages matching the given search terms' + 'tag:add/remove tags for all messages matching the search terms' + ) + + if ((CURRENT == 1)); then + _describe -t commands 'notmuch command' notmuch_commands + else + local curcontext="$curcontext" + cmd=$words[1] + if (( $+functions[_notmuch_$cmd] )); then + _notmuch_$cmd + else + _message -e "unknown command $cmd" + fi + fi +} + +_notmuch_term_tag _notmuch_term_is () { + local ret=1 expl + local -a notmuch_tags + + notmuch_tags=( ${(f)"$(notmuch search --output=tags '*')"} ) + + _description notmuch-tag expl 'tag' + compadd "$expl[@]" -a notmuch_tags && ret=0 + return $ret +} + +_notmuch_term_to _notmuch_term_from() { + _email_addresses -c +} + +_notmuch_term_mimetype() { + local ret=1 expl + local -a commontypes + commontypes=( + 'text/plain' + 'text/html' + 'application/pdf' + ) + _description typical-mimetypes expl 'common types' + compadd "$expl[@]" -a commontypes && ret=0 + + _mime_types && ret=0 + return $ret +} + +_notmuch_term_path() { + local ret=1 expl + local maildir="$(notmuch config get database.path)" + [[ -d $maildir ]] || { _message -e "database.path not found" ; return $ret } + + _description notmuch-folder expl 'maildir folder' + _files "$expl[@]" -W $maildir -/ && ret=0 + return $ret +} + +_notmuch_term_folder() { + local ret=1 expl + local maildir="$(notmuch config get database.path)" + [[ -d $maildir ]] || { _message -e "database.path not found" ; return $ret } + + _description notmuch-folder expl 'maildir folder' + local ignoredfolders=( '*/(cur|new|tmp)' ) + _files "$expl[@]" -W $maildir -F ignoredfolders -/ && ret=0 + return $ret +} + +_notmuch_term_query() { + local ret=1 + local line query_name + local -a query_names query_content + for line in ${(f)"$(notmuch config list | grep '^query.')"}; do + query_name=${${line%%=*}#query.} + query_names+=( $query_name ) + query_content+=( "$query_name = ${line#*=}" ) + done + + _description notmuch-named-query expl 'named query' + compadd "$expl[@]" -d query_content -a query_names && ret=0 + return $ret +} + +_notmuch_search_term() { + local ret=1 expl match + setopt localoptions extendedglob + + typeset -a notmuch_search_terms + notmuch_search_terms=( + 'from' 'to' 'subject' 'attachment' 'mimetype' 'tag' 'id' 'thread' 'path' 'folder' 'date' 'lastmod' 'query' 'property' + ) + + if compset -P '(#b)([^:]#):'; then + if (( $+functions[_notmuch_term_$match[1]] )); then + _notmuch_term_$match[1] && ret=0 + return $ret + elif (( $+notmuch_search_terms[(r)$match[1]] )); then + _message "search term '$match[1]'" && ret=0 + return $ret + else + _message -e "unknown search term '$match[1]'" + return $ret + fi + fi + + _description notmuch-term expl 'search term' + compadd "$expl[@]" -S ':' -a notmuch_search_terms && ret=0 + + if [[ $CURRENT -gt 1 && $words[CURRENT-1] != '--' ]]; then + _description notmuch-op expl 'boolean operator' + compadd "$expl[@]" -- and or not xor && ret=0 + fi + + return $ret +} + +_notmuch_tagging_or_search() { + setopt localoptions extendedglob + local ret=1 expl + local -a notmuch_tags + + # first arg that is a search term, or $#words+1 + integer searchtermarg=$(( $words[(I)--] != 0 ? $words[(i)--] : $words[(i)^(-|+)*] )) + + if (( CURRENT > 1 )); then + () { + local -a words=( $argv ) + local CURRENT=$(( CURRENT - searchtermarg + 1 )) + _notmuch_search_term && ret=0 + } $words[searchtermarg,$] + fi + + # only complete +/- tags if we're before the first search term + if (( searchtermarg >= CURRENT )); then + if compset -P '+'; then + notmuch_tags=( ${(f)"$(notmuch search --output=tags '*')"} ) + _description notmuch-tag expl 'add tag' + compadd "$expl[@]" -a notmuch_tags + return 0 + elif compset -P '-'; then + notmuch_tags=( ${(f)"$(notmuch search --output=tags '*')"} ) + _description notmuch-tag expl 'remove tag' + compadd "$expl[@]" -a notmuch_tags + return 0 + else + _description notmuch-tag expl 'add or remove tags' + compadd "$expl[@]" -S '' -- '+' '-' && ret=0 + fi + fi + + return $ret +} + +_notmuch_address() { + _arguments -S \ + '--format=[set output format]:output format:(json sexp text text0)' \ + '--format-version=[set output format version]:format version: ' \ + '--sort=[sort results]:sorting:((newest-first\:"reverse chronological order" oldest-first\:"chronological order"))' \ + '--output=[select output format]:output format:(sender recipients count address)' \ + '--deduplicate=[deduplicate results]:deduplication mode:(no mailbox address)' \ + '--exclude=[respect excluded tags setting]:exclude tags:(true false)' \ + '*::search term:_notmuch_search_term' +} + +_notmuch_compact() { + _arguments \ + '--backup=[save a backup before compacting]:backup directory:_files -/' \ + '--quiet[do not print progress or results]' +} + +_notmuch_count() { + _arguments \ + - normal \ + '--lastmod[append lastmod and uuid to output]' \ + '--exclude=[respect excluded tags setting]:exclude tags:(true false)' \ + '--output=[select what to count]:output format:(messages threads files)' \ + '*::search term:_notmuch_search_term' \ + - batch \ + '--batch[operate in batch mode]' \ + '(--batch)--input=[read batch operations from file]:batch file:_files' +} + +_notmuch_dump() { + _arguments -S \ + '--gzip[compress output with gzip]' \ + '--format=[specify output format]:output format:(batch-tag sup)' \ + '*--include=[configure metadata to output (default all)]:metadata type:(config properties tags)' \ + '--output=[write output to file]:output file:_files' \ + '*::search term:_notmuch_search_term' +} + +_notmuch_new() { + _arguments \ + '--no-hooks[prevent hooks from being run]' \ + '--quiet[do not print progress or results]' \ + '--full-scan[don''t rely on directory modification times for scan]' \ + '--decrypt=[decrypt messages]:decryption setting:((false\:"never decrypt" auto\:"decrypt if session key is known (default)" true\:"decrypt using secret keys" stash\:"decrypt, and store session keys"))' +} + +_notmuch_reindex() { + _arguments \ + '--decrypt=[decrypt messages]:decryption setting:((false\:"never decrypt" auto\:"decrypt if session key is known (default)" true\:"decrypt using secret keys" stash\:"decrypt, and store session keys"))' \ + '*::search term:_notmuch_search_term' +} + +_notmuch_search() { + _arguments -S \ + '--max-threads=[display only the first x threads from the search results]:number of threads to show: ' \ + '--first=[omit the first x threads from the search results]:number of threads to omit: ' \ + '--sort=[sort results]:sorting:((newest-first\:"reverse chronological order" oldest-first\:"chronological order"))' \ + '--output=[select what to output]:output:(summary threads messages files tags)' \ + '*::search term:_notmuch_search_term' +} + +_notmuch_show() { + _arguments -S \ + '--entire-thread=[output entire threads]:show thread:(true false)' \ + '--format=[set output format]:output format:(text json sexp mbox raw)' \ + '--format-version=[set output format version]:format version: ' \ + '--part=[output a single decoded mime part]:part number: ' \ + '--verify[verify signed MIME parts]' \ + '--decrypt=[decrypt messages]:decryption setting:((false\:"never decrypt" auto\:"decrypt if session key is known (default)" true\:"decrypt using secret keys" stash\:"decrypt, and store session keys"))' \ + '--exclude=[respect excluded tags setting]:exclude tags:(true false)' \ + '--body=[output body]:output body content:(true false)' \ + '--include-html[include text/html parts in the output]' \ + '*::search term:_notmuch_search_term' +} + +_notmuch_reply() { + _arguments \ + '--format=[set output format]:output format:(default json sexp headers-only)' \ + '--format-version=[set output format version]:output format version: ' \ + '--reply-to=[specify recipient types]:recipient types:(all sender)' \ + '--decrypt=[decrypt messages]:decryption setting:((false\:"never decrypt" auto\:"decrypt if session key is known (default)" true\:"decrypt using secret keys"))' \ + '*::search term:_notmuch_search_term' +} + +_notmuch_restore() { + _arguments \ + '--acumulate[add data to db instead of replacing]' \ + '--format=[specify input format]:input format:(auto batch-tag sup)' \ + '*--include=[configure metadata to import (default all)]:metadata type:(config properties tags)' \ + '--input=[read from file]:notmuch dump file:_files' +} + +_notmuch_tag() { + _arguments \ + - normal \ + '--remove-all[remove all tags from matching messages]:*:search term:_notmuch_search_term' \ + '*::tag or search:_notmuch_tagging_or_search' \ + - batch \ + '--batch[operate in batch mode]' \ + '(--batch)--input=[read batch operations from file]:batch file:_files' +} + +_notmuch() { + if [[ $service == notmuch-* ]]; then + local compfunc=_${service//-/_} + (( $+functions[$compfunc] )) || return 1 + $compfunc "$@" + else + _arguments \ + '(* -)--help[show help]' \ + '(* -)--version[show version]' \ + '--config=-[specify config file]:config file:_files' \ + '--uuid=-[check against database uuid or exit]:uuid: ' \ + '*::notmuch commands:_notmuch_command' + fi +} + +_notmuch "$@" |
