X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=completion%2Fnotmuch-completion.bash;h=cc5839247c6cd0a044db8def1c7ada02f23355c8;hp=7bd7745fdfd2214d8bd10cde97b1feb214fb6639;hb=4cff5a9f98f3c7bdb58f8929dca83fa2d3af9c75;hpb=2302fd7925ab624d2fd17ba6bceabf656e6ad741 diff --git a/completion/notmuch-completion.bash b/completion/notmuch-completion.bash index 7bd7745f..cc583924 100644 --- a/completion/notmuch-completion.bash +++ b/completion/notmuch-completion.bash @@ -27,10 +27,35 @@ # on completion. # -_notmuch_user_emails() +_notmuch_shared_options="--help --uuid= --version" + +# $1: current input of the form prefix:partialinput, where prefix is +# to or from. +_notmuch_email() { - notmuch config get user.primary_email - notmuch config get user.other_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_search_terms() @@ -44,13 +69,24 @@ _notmuch_search_terms() COMPREPLY=( $(compgen -P "tag:" -W "`notmuch search --output=tags \*`" -- ${cur##tag:}) ) ;; to:*) - COMPREPLY=( $(compgen -P "to:" -W "`_notmuch_user_emails`" -- ${cur##to:}) ) + COMPREPLY=( $(compgen -P "to:" -W "`_notmuch_email ${cur}`" -- ${cur##to:}) ) ;; from:*) - COMPREPLY=( $(compgen -P "from:" -W "`_notmuch_user_emails`" -- ${cur##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\)$" ) ) ;; *) - local search_terms="from: to: subject: attachment: tag: id: thread: folder: date:" + local search_terms="from: to: subject: attachment: mimetype: tag: id: thread: folder: path: date: lastmod:" compopt -o nospace COMPREPLY=( $(compgen -W "${search_terms}" -- ${cur}) ) ;; @@ -59,6 +95,29 @@ _notmuch_search_terms() __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 @@ -73,7 +132,7 @@ _notmuch_config() ;; # these will also complete on config get, but we don't care database.path) - _filedir + _filedir -d ;; maildir.synchronize_flags) COMPREPLY=( $(compgen -W "true false" -- ${cur}) ) @@ -89,19 +148,23 @@ _notmuch_count() $split && case "${prev}" in --output) - COMPREPLY=( $( compgen -W "messages threads" -- "${cur}" ) ) + 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=" + local options="--output= --exclude= --batch --input= --lastmod ${_notmuch_shared_options}" compopt -o nospace COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) ;; @@ -131,7 +194,7 @@ _notmuch_dump() ! $split && case "${cur}" in -*) - local options="--format= --output=" + local options="--gzip --format= --output= ${_notmuch_shared_options}" compopt -o nospace COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) ;; @@ -141,6 +204,42 @@ _notmuch_dump() 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 + ;; + esac + + ! $split && + case "${cur}" in + --*) + local options="--create-folder --folder= --keep --no-hooks ${_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 @@ -148,7 +247,8 @@ _notmuch_new() case "${cur}" in -*) - local options="--no-hooks" + local options="--no-hooks --quiet ${_notmuch_shared_options}" + compopt -o nospace COMPREPLY=( $(compgen -W "${options}" -- ${cur}) ) ;; esac @@ -174,7 +274,7 @@ _notmuch_reply() ! $split && case "${cur}" in -*) - local options="--format= --format-version= --reply-to= --decrypt" + local options="--format= --format-version= --reply-to= --decrypt ${_notmuch_shared_options}" compopt -o nospace COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) ;; @@ -204,7 +304,7 @@ _notmuch_restore() ! $split && case "${cur}" in -*) - local options="--format= --accumulate --input=" + local options="--format= --accumulate --input= ${_notmuch_shared_options}" compopt -o nospace COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) ;; @@ -231,7 +331,49 @@ _notmuch_search() return ;; --exclude) - COMPREPLY=( $( compgen -W "true false flag" -- "${cur}" ) ) + 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_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" -- "${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 @@ -239,7 +381,7 @@ _notmuch_search() ! $split && case "${cur}" in -*) - local options="--format= --output= --sort= --offset= --limit= --exclude=" + local options="--format= --output= --sort= --exclude= --deduplicate= ${_notmuch_shared_options}" compopt -o nospace COMPREPLY=( $(compgen -W "$options" -- ${cur}) ) ;; @@ -273,7 +415,7 @@ _notmuch_show() ! $split && case "${cur}" in -*) - local options="--entire-thread= --format= --exclude= --body= --format-version= --part= --verify --decrypt" + 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}) ) ;; @@ -287,9 +429,24 @@ _notmuch_tag() { local cur prev words cword split # handle tags with colons and equal signs - _init_completion -n := || return + _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##+}) ) ;; @@ -307,8 +464,12 @@ _notmuch_tag() _notmuch() { - local _notmuch_commands="config count dump help new reply restore search setup show tag" + local _notmuch_commands="compact config count dump help insert new reply restore search address setup show tag" 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=() @@ -323,10 +484,15 @@ _notmuch() if [ -z "${arg}" ]; then # top level completion - local top_options="--help --version" case "${cur}" in - -*) COMPREPLY=( $(compgen -W "${top_options}" -- ${cur}) ) ;; - *) COMPREPLY=( $(compgen -W "${_notmuch_commands}" -- ${cur}) ) ;; + -*) + # 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