diff options
| author | David Bremner <bremner@debian.org> | 2018-06-12 22:39:33 -0300 |
|---|---|---|
| committer | David Bremner <bremner@debian.org> | 2018-06-12 22:39:33 -0300 |
| commit | 045f0e455ac94e2393d0d729c9bbdf3459a4860f (patch) | |
| tree | 8d8b46ecba2c3c128365f16ece54377b987dbe58 /completion | |
Import notmuch_0.27.orig.tar.gz
[dgit import orig notmuch_0.27.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/notmuch-completion.zsh | 88 |
5 files changed, 755 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..dfc12713 --- /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_script := $(srcdir)/$(dir)/notmuch-completion.zsh + +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_script) "$(DESTDIR)$(zsh_completion_dir)/_notmuch" +endif diff --git a/completion/README b/completion/README new file mode 100644 index 00000000..89805c72 --- /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 + +notmuch-completion.zsh + + Command-line completion 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/notmuch-completion.zsh b/completion/notmuch-completion.zsh new file mode 100644 index 00000000..208a5503 --- /dev/null +++ b/completion/notmuch-completion.zsh @@ -0,0 +1,88 @@ +#compdef notmuch + +# ZSH completion for `notmuch` +# Copyright © 2009 Ingmar Vanhassel <ingmar@exherbo.org> + +_notmuch_commands() +{ + 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' + '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' + ) + + _describe -t command 'command' notmuch_commands +} + +_notmuch_dump() +{ + _files +} + +_notmuch_help_topics() +{ + local -a notmuch_help_topics + notmuch_help_topics=( + 'search-terms:show common search-terms syntax' + ) + _describe -t notmuch-help-topics 'topic' notmuch_help_topics +} + +_notmuch_help() +{ + _alternative \ + _notmuch_commands \ + _notmuch_help_topics +} + +_notmuch_restore() +{ + _files +} + +_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))' +} + +_notmuch_address() +{ + _arguments -s : \ + '--sort=[sort results]:sorting:((newest-first\:"reverse chronological order" oldest-first\:"chronological order"))' \ + '--output=[select what to output]:output:((sender recipients count))' +} + +_notmuch() +{ + if (( CURRENT > 2 )) ; then + local cmd=${words[2]} + curcontext="${curcontext%:*:*}:notmuch-$cmd" + (( CURRENT-- )) + shift words + _call_function ret _notmuch_$cmd + return ret + else + _notmuch_commands + fi +} + +_notmuch "$@" + +# vim: set sw=2 sts=2 ts=2 et ft=zsh : |
