unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [notmuch-emacs] Paginate user's saved search results - proposed patch
@ 2018-11-02 14:00 Antoine R. Dumont
  0 siblings, 0 replies; only message in thread
From: Antoine R. Dumont @ 2018-11-02 14:00 UTC (permalink / raw)
  To: notmuch


[-- Attachment #1.1: Type: text/plain, Size: 7 bytes --]

Hello,

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: optional pagination for user's saved search --]
[-- Type: text/x-diff, Size: 5566 bytes --]

diff --git a/emacs/notmuch-jump.el b/emacs/notmuch-jump.el
index 3e20b8c7..5cc6e42e 100644
--- a/emacs/notmuch-jump.el
+++ b/emacs/notmuch-jump.el
@@ -54,11 +54,12 @@ fast way to jump to a saved search from anywhere in Notmuch."
 		 (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))))
+		(limit (plist-get saved-search :limit)))
 	    (push (list key name
 			(if (eq (plist-get saved-search :search-type) 'tree)
 			    `(lambda () (notmuch-tree ',query))
-			  `(lambda () (notmuch-search ',query ',oldest-first))))
+			  `(lambda () (notmuch-search ',query ',oldest-first nil nil nil ',limit))))
 		  action-map)))))
     (setq action-map (nreverse action-map))
 
diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index 1f453357..078eae45 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -189,6 +189,8 @@ there will be called at other points of notmuch execution."
     (define-key map "+" 'notmuch-search-add-tag)
     (define-key map (kbd "RET") 'notmuch-search-show-thread)
     (define-key map "Z" 'notmuch-tree-from-search-current-query)
+    (define-key map (kbd "M-n") 'notmuch-search-query-result-next)
+    (define-key map (kbd "M-p") 'notmuch-search-query-result-previous)
     map)
   "Keymap for \"notmuch search\" buffers.")
 (fset 'notmuch-search-mode-map notmuch-search-mode-map)
@@ -383,6 +385,8 @@ Complete list of currently available key bindings:
   (make-local-variable 'notmuch-search-oldest-first)
   (make-local-variable 'notmuch-search-target-thread)
   (make-local-variable 'notmuch-search-target-line)
+  (make-local-variable 'notmuch-search-query-limit)
+  (make-local-variable 'notmuch-search-query-offset)
   (setq notmuch-buffer-refresh-function #'notmuch-search-refresh-view)
   (set (make-local-variable 'scroll-preserve-screen-position) t)
   (add-to-invisibility-spec (cons 'ellipsis t))
@@ -959,7 +963,7 @@ 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 target-thread target-line no-display limit offset)
   "Display threads matching QUERY in a notmuch-search buffer.
 
 If QUERY is nil, it is read interactively from the minibuffer.
@@ -973,6 +977,8 @@ Other optional parameters are used as follows:
   NO-DISPLAY: Do not try to foreground the search results buffer. If it is
               already foregrounded i.e. displayed in a window, this has no
               effect, meaning the buffer will remain visible.
+  LIMIT: Try to limit the search to a given size. Defaults to no limit.
+  OFFSET: Start from offset. Defaults to nil
 
 When called interactively, this will prompt for a query and use
 the configured default sort order."
@@ -994,6 +1000,8 @@ the configured default sort order."
     (set 'buffer-undo-list t)
     (set 'notmuch-search-query-string query)
     (set 'notmuch-search-oldest-first oldest-first)
+    (set 'notmuch-search-query-limit limit)
+    (set 'notmuch-search-query-offset (if offset offset 0))
     (set 'notmuch-search-target-thread target-thread)
     (set 'notmuch-search-target-line target-line)
     (notmuch-tag-clear-cache)
@@ -1011,6 +1019,12 @@ the configured default sort order."
 		     (if oldest-first
 			 "--sort=oldest-first"
 		       "--sort=newest-first")
+                     (if limit
+                         (format "--limit=%s" limit)
+                       "")
+                     (if offset
+                         (format "--offset=%s" offset)
+                       "")
 		     query))
 	      ;; Use a scratch buffer to accumulate partial output.
 	      ;; This buffer will be killed by the sentinel, which
@@ -1021,6 +1035,22 @@ the configured default sort order."
 	  (set-process-query-on-exit-flag proc nil))))
     (run-hooks 'notmuch-search-hook)))
 
+(defun notmuch-search-query-result-next ()
+  "Trigger the next results page for the current query."
+  (interactive)
+  (when notmuch-search-query-offset
+    (setq notmuch-search-query-offset
+          (+ notmuch-search-query-offset notmuch-search-query-limit)))
+  (notmuch-search-refresh-view))
+
+(defun notmuch-search-query-result-previous ()
+  "Trigger the previous results page for the current query."
+  (interactive)
+  (when (and notmuch-search-query-offset (> notmuch-search-query-offset 0))
+    (setq notmuch-search-query-offset
+          (max 0 (- notmuch-search-query-offset notmuch-search-query-limit))))
+  (notmuch-search-refresh-view))
+
 (defun notmuch-search-refresh-view ()
   "Refresh the current view.
 
@@ -1033,9 +1063,11 @@ same relative position within the new buffer."
   (let ((target-line (line-number-at-pos))
 	(oldest-first notmuch-search-oldest-first)
 	(target-thread (notmuch-search-find-thread-id 'bare))
-	(query notmuch-search-query-string))
+	(query notmuch-search-query-string)
+        (limit notmuch-search-query-limit)
+        (offset notmuch-search-query-offset))
     ;; notmuch-search erases the current buffer.
-    (notmuch-search query oldest-first target-thread target-line t)
+    (notmuch-search query oldest-first target-thread target-line t limit offset)
     (goto-char (point-min))))
 
 (defun notmuch-search-toggle-order ()

[-- Attachment #1.3: Type: text/plain, Size: 1759 bytes --]

Here is a patch (against current master - 7f726c6e) to allow user
saved-search query pagination.  This is an opt-in option to be defined
on per saved-search basis.

To opt-in, define a :limit option on a saved-search.
If not defined, the current behavior (no limit) is kept.

# example

```
  (custom-set-variables'(notmuch-saved-searches
      '((:name "inbox"
         :query "tag:inbox"
         :count-query "tag:inbox"
         :sort-order 'newest-first
         :limit 30
         :key "i")
        (:name "unread"
         :query "tag:inbox and tag:unread"
         :count-query "tag:inbox and tag:unread"
         :sort-order 'newest-first
         :key "u"))))
```

Here the 'unread' saved-search will work as usual.
The 'inbox' one will paginate results by page of 30.
The user can then use M-n to move forward or M-p to move backward in
results.


What this patch does not do:
- no new buttons in the search page view.
- no documentation patch about this option on saved-search


Note:
- Relevant threads:
  - id:1327692900-22926-1-git-send-email-jani@nikula.org (from 7 years
  ago)
  - The state part was unclear, j4ni's old diff on that matter unstuck
  me http://paste.debian.net/1050094/
  - https://notmuchmail.org/pipermail/notmuch/2017/024495.html
  - https://notmuchmail.org/pipermail/notmuch/2017/024496.html
  - https://notmuchmail.org/pipermail/notmuch/2017/024497.html
- notmuchmail.org is down (some part at least, so i cannot download the
  archive, convert and reply to the right thread, sorry)

Thanks to bremner and j4ni for their help on irc
(pointers/answers/help).

Cheers,
--
tony / @ardumont

-----------------------------------------------------------------
gpg fingerprint BF00 203D 741A C9D5 46A8 BE07 52E2 E984 0D10 C3B8

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2018-11-02 14:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-02 14:00 [notmuch-emacs] Paginate user's saved search results - proposed patch Antoine R. Dumont

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).