From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id /B5VE9qGomGWAAEAgWs5BA (envelope-from ) for ; Sat, 27 Nov 2021 20:28:26 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1 with LMTPS id MCZLDtqGomEXUQAAbx9fmQ (envelope-from ) for ; Sat, 27 Nov 2021 19:28:26 +0000 Received: from mail.notmuchmail.org (nmbug.tethera.net [144.217.243.247]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id CBFF73C6C1 for ; Sat, 27 Nov 2021 20:28:25 +0100 (CET) Received: from nmbug.tethera.net (localhost [127.0.0.1]) by mail.notmuchmail.org (Postfix) with ESMTP id 794F928E20; Sat, 27 Nov 2021 14:28:18 -0500 (EST) Received: from mail.kisara.moe (119.ip-51-38-65.eu [51.38.65.119]) by mail.notmuchmail.org (Postfix) with ESMTPS id 677F128D13 for ; Sat, 27 Nov 2021 14:28:14 -0500 (EST) Received: from mk-macbook (unknown [45.149.175.178]) by mail.kisara.moe (Postfix) with ESMTPSA id 9C961A5E32; Sat, 27 Nov 2021 20:28:12 +0100 (CET) From: Mohsin Kaleem To: David Bremner , notmuch@notmuchmail.org Subject: Re: notmuch-emacs: Add option to set -exclude=false in notmuch search/tree In-Reply-To: <87wnm1w2sx.fsf@tethera.net> References: <87ilxlxsng.fsf@kisara.moe> <87wnm1w2sx.fsf@tethera.net> Date: Sat, 27 Nov 2021 19:28:10 +0000 Message-ID: <87o865xut1.fsf@kisara.moe> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Message-ID-Hash: 4TR3PA6BS2K6JYY23P6ERBRAZRLWJ2BU X-Message-ID-Hash: 4TR3PA6BS2K6JYY23P6ERBRAZRLWJ2BU X-MailFrom: mohkale@kisara.moe X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-notmuch.notmuchmail.org-0 X-Mailman-Version: 3.3.3 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Migadu-Flow: FLOW_IN X-Migadu-Country: FR ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1638041306; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references:list-id:list-help: list-owner:list-unsubscribe:list-subscribe:list-post; bh=Lid4uK3EWtOY6uhAtVvjsf/3jw6w/9F9xN0zv9rMFMY=; b=oyiqhJe8yKKp4sXpLvj74kDI3plscqbY78CSjYl6koYGAV4MT0pj1gyogNiRMkjezlx4rV +HP/GpUoNoenvA/X6+TAgX7oiyx3zeJRjc7yqgIb/vxvvHkrsoYmDW9+rXNDeaYP+j/SWP Ly5SOfYikbja9m+O/Lsrnyt0YgLM51zlJyWY0w5eCou9R3Ns3A12h1r0SSBD8Bf0THhmeF YBiBE2kWHeGanTM66FGZ98oDWJmxtzXJ+OZw9zaVtGt5jh/10NOPvpCJjhDO21KbS9ICf/ NH4Uc/FgO870NsDrMTHKb4M94crQGJsOIcfISRSlOMNNxx0W6/M347mHo28mcA== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1638041306; a=rsa-sha256; cv=none; b=EI8OFDscSRf8e0NFN9l898kFgvWLbkSa7HZLRJ6egYMoR2wamnHXFjB570vEA0d5upgbUx IN/vmwW+ixwRziC1VybzTl4xwLDsOOMTcgEdYqy76LCdhP3b6WTRTU2z00MBxXxE7hXKZn ejLnDVaSBTD9LIVFyJa9LDC0gjjqf1CZuFxE93dx0GW8Md9VnkHzm0eIvnjgo1N3sUt5h4 GIA7l34OpsuF6gp8MRVWzLApcobWfsG10fQEL/GaNnuCgdIDY+MmGfCS8ylabjZlK5Ezqq WwOeW/sxM28oimBXS8/4V2ouoebjhOfzCVOG0oupRzOM93Z11NIrJUyCCTa8tw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=kisara.moe (policy=none); spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 144.217.243.247 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Spam-Score: 0.04 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=kisara.moe (policy=none); spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 144.217.243.247 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Queue-Id: CBFF73C6C1 X-Spam-Score: 0.04 X-Migadu-Scanner: scn0.migadu.com X-TUID: cP3XRKr8gAWy --=-=-= Content-Type: text/plain David Bremner writes: > Unfortunately that list seems to grow rather than shrink over time... Hopefully it won't grow any larger due to this issue :-). I've implemented this in the patch attached to this email. The new option is notmuch-search-exclude, it defaults to true. There are new commands to toggle the value of this variable for the current search and these are bound to "i" in the respective mode maps. I've also changed whether or not notmuch-search-oldest-first and notmuch-search-exclude are persisted across some commands. For example switching from a regular search buffer to a tree buffer with notmuch-tree-from-search-current-query will make sure the value of both these variables is the same in both buffers. Similarly filtering an existing search such as notmuch-search-filter will also persist them, but starting a new search with notmuch-search will reset to the global default value of either of them. There were quite a lot of functions that I've modified or altered in some way with this PR. I've tested the ones I'm familliar with and everythings working the way I expect. If you have any issues please let me know. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-emacs-add-new-option-notmuch-search-exclude.patch >From 9b11223c0162f8736dd27d6f1db3fadbd3b027e2 Mon Sep 17 00:00:00 2001 From: Mohsin Kaleem Date: Sat, 27 Nov 2021 18:58:43 +0000 Subject: [PATCH] emacs: add new option notmuch-search-exclude The new notmuch-search-exclude option allows users to configure whether to show or hide excluded messages (as determined by search.exclude_tags in the local config file). It defaults to true for now to maintain backwards-compatibility with how notmuch-{search,tree} already worked. New commands notmuch-search-toggle-exclude and notmuch-tree-toggle-exclude have also been added that toggle the value of notmuch-search-exclude for the search in the current search or tree buffer. It's bound to "i" in the respective keymaps for these modes. Lastly I've amended some calls to notmuch-tree and notmuch-unthreaded which didn't pass through the buffer local value of notmuch-search-oldest-first (and now notmuch-search-exclude). Examples of where I've done this + include notmuch-jump-search + notmuch-tree-from-search-current-query + notmuch-unthreaded-from-search-current-query + notmuch-tree-from-search-thread If there was a reasoning behind these not persisting the value of these variables then we should revert it before merging and discuss whether it's worth persisting notmuch-search-exclude. [1]: id:87ilxlxsng.fsf@kisara.moe --- emacs/notmuch-jump.el | 11 ++++++---- emacs/notmuch-lib.el | 10 +++++++++ emacs/notmuch-tree.el | 40 +++++++++++++++++++++++++++--------- emacs/notmuch.el | 47 ++++++++++++++++++++++++++++++++++--------- 4 files changed, 84 insertions(+), 24 deletions(-) diff --git a/emacs/notmuch-jump.el b/emacs/notmuch-jump.el index 6a276928..e98c9c1d 100644 --- a/emacs/notmuch-jump.el +++ b/emacs/notmuch-jump.el @@ -50,15 +50,18 @@ fast way to jump to a saved search from anywhere in Notmuch." (cl-case (plist-get saved-search :sort-order) (newest-first nil) (oldest-first t) - (otherwise (default-value 'notmuch-search-oldest-first))))) + (otherwise (default-value 'notmuch-search-oldest-first)))) + (exclude (default-value 'notmuch-search-exclude))) (push (list key name (cond ((eq (plist-get saved-search :search-type) 'tree) - (lambda () (notmuch-tree query))) + (lambda () (notmuch-tree query nil nil nil nil nil nil + oldest-first exclude))) ((eq (plist-get saved-search :search-type) 'unthreaded) - (lambda () (notmuch-unthreaded query))) + (lambda () (notmuch-unthreaded query nil nil nil nil + oldest-first exclude))) (t - (lambda () (notmuch-search query oldest-first))))) + (lambda () (notmuch-search query oldest-first exclude))))) action-map))))) (setq action-map (nreverse action-map)) (if action-map diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index 45817e13..a0b780fd 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -105,6 +105,16 @@ search." :group 'notmuch-search) (make-variable-buffer-local 'notmuch-search-oldest-first) +(defcustom notmuch-search-exclude t + "Hide mail tagged with a excluded tag. + +Excluded tags are defined in the users configuration file under +the search section. When this variable is true, any mail with +such a tag will not be shown in the search output." + :type 'boolean + :group 'notmuch-search) +(make-variable-buffer-local 'notmuch-search-exclude) + (defcustom notmuch-poll-script nil "[Deprecated] Command to run to incorporate new mail into the notmuch database. diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index 7fa73d40..7e85dc51 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -363,6 +363,7 @@ then NAME behaves like CMD." (define-key map [remap notmuch-jump-search] 'notmuch-tree-jump-search) (define-key map "o" 'notmuch-tree-toggle-order) + (define-key map "i" 'notmuch-tree-toggle-exclude) (define-key map "S" 'notmuch-search-from-tree-current-query) (define-key map "U" 'notmuch-unthreaded-from-tree-current-query) (define-key map "Z" 'notmuch-tree-from-unthreaded-current-query) @@ -578,7 +579,9 @@ NOT change the database." "Call notmuch search with the current query." (interactive) (notmuch-tree-close-message-window) - (notmuch-search (notmuch-tree-get-query))) + (notmuch-search (notmuch-tree-get-query) + notmuch-search-oldest-first + notmuch-search-exclude)) (defun notmuch-tree-message-window-kill-hook () "Close the message pane when exiting the show buffer." @@ -791,7 +794,8 @@ nil otherwise." target nil unthreaded - notmuch-search-oldest-first))) + notmuch-search-oldest-first + notmuch-search-exclude))) (defun notmuch-tree-thread-top () (when (notmuch-tree-get-message-properties) @@ -1108,7 +1112,8 @@ Complete list of currently available key bindings: results-buf))))) (defun notmuch-tree-worker (basic-query &optional query-context target - open-target unthreaded oldest-first) + open-target unthreaded oldest-first + exclude) "Insert the tree view of the search in the current buffer. This is is a helper function for notmuch-tree. The arguments are @@ -1117,6 +1122,7 @@ the same as for the function notmuch-tree." (notmuch-tree-mode) (add-hook 'post-command-hook #'notmuch-tree-command-hook t t) (setq notmuch-search-oldest-first oldest-first) + (setq notmuch-search-exclude exclude) (setq notmuch-tree-unthreaded unthreaded) (setq notmuch-tree-basic-query basic-query) (setq notmuch-tree-query-context (if (or (string= query-context "") @@ -1136,14 +1142,15 @@ the same as for the function notmuch-tree." (and query-context (concat " and (" query-context ")")))) (sort-arg (if oldest-first "--sort=oldest-first" "--sort=newest-first")) - (message-arg (if unthreaded "--unthreaded" "--entire-thread"))) + (message-arg (if unthreaded "--unthreaded" "--entire-thread")) + (exclude-arg (if exclude "--exclude=true" "--exclude=false"))) (when (equal (car (notmuch--process-lines notmuch-command "count" search-args)) "0") (setq search-args basic-query)) (notmuch-tag-clear-cache) (let ((proc (notmuch-start-notmuch "notmuch-tree" (current-buffer) #'notmuch-tree-process-sentinel "show" "--body=false" "--format=sexp" "--format-version=5" - sort-arg message-arg search-args)) + sort-arg message-arg exclude-arg search-args)) ;; Use a scratch buffer to accumulate partial output. ;; This buffer will be killed by the sentinel, which ;; should be called no matter how the process dies. @@ -1170,8 +1177,18 @@ default sort order is defined by `notmuch-search-oldest-first'." (setq notmuch-search-oldest-first (not notmuch-search-oldest-first)) (notmuch-tree-refresh-view)) +(defun notmuch-tree-toggle-exclude () + "Toggle whether to hide excluded messages. + +This command toggles whether to hide excluded messages for the current +search. The default value for this is defined by `notmuch-search-exclude'." + (interactive) + (setq notmuch-search-exclude (not notmuch-search-exclude)) + (notmuch-tree-refresh-view)) + (defun notmuch-tree (&optional query query-context target buffer-name - open-target unthreaded parent-buffer oldest-first) + open-target unthreaded parent-buffer + oldest-first exclude) "Display threads matching QUERY in tree view. The arguments are: @@ -1200,17 +1217,19 @@ The arguments are: (pop-to-buffer-same-window buffer)) ;; Don't track undo information for this buffer (setq buffer-undo-list t) - (notmuch-tree-worker query query-context target open-target unthreaded oldest-first) + (notmuch-tree-worker query query-context target open-target + unthreaded oldest-first exclude) (setq notmuch-tree-parent-buffer parent-buffer) (setq truncate-lines t)) (defun notmuch-unthreaded (&optional query query-context target buffer-name - open-target) + open-target oldest-first exclude) "Display threads matching QUERY in unthreaded view. See function NOTMUCH-TREE for documentation of the arguments" (interactive) - (notmuch-tree query query-context target buffer-name open-target t)) + (notmuch-tree query query-context target buffer-name open-target + t nil oldest-first exclude)) (defun notmuch-tree-filter (query) "Filter or LIMIT the current search results based on an additional query string. @@ -1244,7 +1263,8 @@ search results and that are also tagged with the given TAG." nil notmuch-tree-unthreaded nil - notmuch-search-oldest-first))) + notmuch-search-oldest-first + notmuch-search-exclude))) ;;; _ diff --git a/emacs/notmuch.el b/emacs/notmuch.el index fa061693..b2e61e36 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -178,6 +178,7 @@ there will be called at other points of notmuch execution." (define-key map "r" 'notmuch-search-reply-to-thread-sender) (define-key map "R" 'notmuch-search-reply-to-thread) (define-key map "o" 'notmuch-search-toggle-order) + (define-key map "i" 'notmuch-search-toggle-exclude) (define-key map "c" 'notmuch-search-stash-map) (define-key map "t" 'notmuch-search-filter-by-tag) (define-key map "l" 'notmuch-search-filter) @@ -537,12 +538,18 @@ thread." (defun notmuch-tree-from-search-current-query () "Tree view of current query." (interactive) - (notmuch-tree notmuch-search-query-string)) + (notmuch-tree notmuch-search-query-string + nil nil nil nil nil nil + notmuch-search-oldest-first + notmuch-search-exclude)) (defun notmuch-unthreaded-from-search-current-query () "Unthreaded view of current query." (interactive) - (notmuch-unthreaded notmuch-search-query-string)) + (notmuch-unthreaded notmuch-search-query-string + nil nil nil nil + notmuch-search-oldest-first + notmuch-search-exclude)) (defun notmuch-tree-from-search-thread () "Show the selected thread with notmuch-tree." @@ -551,7 +558,9 @@ thread." notmuch-search-query-string nil (notmuch-prettify-subject (notmuch-search-find-subject)) - t nil (current-buffer))) + t nil (current-buffer) + notmuch-search-oldest-first + notmuch-search-exclude)) (defun notmuch-search-reply-to-thread (&optional prompt-for-sender) "Begin composing a reply-all to the entire current thread in a new buffer." @@ -978,14 +987,15 @@ PROMPT is the string to prompt with." (put 'notmuch-search 'notmuch-doc "Search for messages.") ;;;###autoload -(defun notmuch-search (&optional query oldest-first target-thread target-line - no-display) +(defun notmuch-search (&optional query oldest-first exclude target-thread + target-line no-display) "Display threads matching QUERY in a notmuch-search buffer. If QUERY is nil, it is read interactively from the minibuffer. Other optional parameters are used as follows: OLDEST-FIRST: A Boolean controlling the sort order of returned threads + EXCLUDE: A boolean controlling whether to omit threads with excluded tags. TARGET-THREAD: A thread ID (without the thread: prefix) that will be made current if it appears in the search results. TARGET-LINE: The line number to move to if the target thread does not @@ -1000,9 +1010,10 @@ the configured default sort order." (list ;; Prompt for a query nil - ;; Use the default search order (if we're doing a search from a - ;; search buffer, ignore any buffer-local overrides) - (default-value 'notmuch-search-oldest-first))) + ;; Use the default search order and exclude value (if we're doing a + ;; search from a search buffer, ignore any buffer-local overrides) + (default-value 'notmuch-search-oldest-first) + (default-value 'notmuch-search-exclude))) (let* ((query (or query (notmuch-read-query "Notmuch search: "))) (buffer (get-buffer-create (notmuch-search-buffer-title query)))) @@ -1016,6 +1027,7 @@ the configured default sort order." (setq notmuch-search-oldest-first oldest-first) (setq notmuch-search-target-thread target-thread) (setq notmuch-search-target-line target-line) + (setq notmuch-search-exclude exclude) (notmuch-tag-clear-cache) (when (get-buffer-process buffer) (error "notmuch search process already running for query `%s'" query)) @@ -1029,6 +1041,9 @@ the configured default sort order." (if oldest-first "--sort=oldest-first" "--sort=newest-first") + (if exclude + "--exclude=true" + "--exclude=false") query))) ;; Use a scratch buffer to accumulate partial output. ;; This buffer will be killed by the sentinel, which @@ -1050,11 +1065,21 @@ same relative position within the new buffer." (interactive) (notmuch-search notmuch-search-query-string notmuch-search-oldest-first + notmuch-search-exclude (notmuch-search-find-thread-id 'bare) (line-number-at-pos) t) (goto-char (point-min))) +(defun notmuch-search-toggle-exclude () + "Toggle whether to hide excluded messages. + +This command toggles whether to hide excluded messages for the current +search. The default value for this is defined by `notmuch-search-exclude'." + (interactive) + (setq notmuch-search-exclude (not notmuch-search-exclude)) + (notmuch-search-refresh-view)) + (defun notmuch-search-toggle-order () "Toggle the current search order. @@ -1083,7 +1108,8 @@ current search results AND the additional query string provided." (notmuch-search (if (string= grouped-original-query "*") grouped-query (concat grouped-original-query " and " grouped-query)) - notmuch-search-oldest-first))) + notmuch-search-oldest-first + notmuch-search-exclude))) (defun notmuch-search-filter-by-tag (tag) "Filter the current search results based on a single TAG. @@ -1094,7 +1120,8 @@ search results and that are also tagged with the given TAG." (list (notmuch-select-tag-with-completion "Filter by tag: " notmuch-search-query-string))) (notmuch-search (concat notmuch-search-query-string " and tag:" tag) - notmuch-search-oldest-first)) + notmuch-search-oldest-first + notmuch-search-exclude)) (defun notmuch-search-by-tag (tag) "Display threads matching TAG in a notmuch-search buffer." -- 2.33.1 --=-=-= Content-Type: text/plain -- Mohsin Kaleem --=-=-= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline --=-=-=--