[PATCH] completion: complete addresses in from:/to: search terms

Jani Nikula jani at nikula.org
Sat Mar 7 04:44:42 PST 2015


Use the new notmuch address command to do completion for addresses in
from: and to:. Use --output=sender for both for efficiency, even
though --output=recipients would be more accurate for to: prefix
completion.

---

This is v2 of id:1422388098-16333-5-git-send-email-jani at nikula.org
opting for --output=sender for both to: and from:. Added a comment to
point this out.
---
 completion/notmuch-completion.bash | 33 ++++++++++++++++++++++++++++-----
 1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/completion/notmuch-completion.bash b/completion/notmuch-completion.bash
index e0498903f22f..960275d1f672 100644
--- a/completion/notmuch-completion.bash
+++ b/completion/notmuch-completion.bash
@@ -27,10 +27,33 @@
 # on completion.
 #
 
-_notmuch_user_emails()
+# $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,10 +67,10 @@ _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`
-- 
2.1.4



More information about the notmuch mailing list