[PATCH v4 0/8] emacs: JSON-based search cleanups

Austin Clements amdragon at MIT.EDU
Sat Jul 21 10:37:04 PDT 2012


This version fixes several bugs found in the previous version.  I
replaced the insert-before-markers trick in
notmuch-search-update-result with direct point manipulation.  This
fixes the problem with authors getting unhidden when a result is
updated with point after the authors on the line (since it no longer
deletes the region with the invisibility overlay).  I also removed the
scrolling hack (which was partially necessitated by
insert-before-markers), so that archiving the last visible result will
properly scroll the buffer instead of jumping point to the middle of
the visible window.  As a result, the window may scroll when updating
a multiline result, however, it will scroll to show the entire result
(unlike an earlier version where it scrolled to cut off the result
because of an interaction with insert-before-markers).  Finally, I
fixed notmuch-search-last-thread so that it behaves like it did before
when there are no results, rather than failing with an obscure error.

I also updated the customize documentation and NEWS to indicate that
multiline search results are considered experimental.

Diff from v3:

diff --git a/NEWS b/NEWS
index 7b33f0d..7b1f36c 100644
--- a/NEWS
+++ b/NEWS
@@ -25,7 +25,7 @@ The formatting of tags in search results can now be customized
   `notmuch-search-result-format` would usually break tagging from
   search-mode.  We no longer make assumptions about the format.
 
-Multi-line search result formats are now supported
+Experimental support for multi-line search result formats
 
   It is now possible to embed newlines in
   `notmuch-search-result-format` to make individual search results
diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index ec760dc..fd1836f 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -70,12 +70,12 @@
 For example:
 	(setq notmuch-search-result-format \(\(\"authors\" . \"%-40s\"\)
 					     \(\"subject\" . \"%s\"\)\)\)
-Line breaks are permitted in format strings.  Note that a line
-break at the end of an \"authors\" field will get elided if the
-authors list is long; place it instead at the beginning of the
-following field.  To enter a line break when setting this
-variable with setq, use \\n.  To enter a line break in customize,
-press \\[quoted-insert] C-j."
+Line breaks are permitted in format strings (though this is
+currently experimental).  Note that a line break at the end of an
+\"authors\" field will get elided if the authors list is long;
+place it instead at the beginning of the following field.  To
+enter a line break when setting this variable with setq, use \\n.
+To enter a line break in customize, press \\[quoted-insert] C-j."
   :type '(alist :key-type (string) :value-type (string))
   :group 'notmuch-search)
 
@@ -310,7 +310,8 @@ For a mouse binding, return nil."
   (interactive)
   (goto-char (point-max))
   (forward-line -2)
-  (goto-char (notmuch-search-result-beginning)))
+  (let ((beg (notmuch-search-result-beginning)))
+    (when beg (goto-char beg))))
 
 (defun notmuch-search-first-thread ()
   "Select the first thread in the search results."
@@ -599,30 +600,31 @@ This function advances the next thread when finished."
 
 (defun notmuch-search-update-result (result &optional pos)
   "Replace the result object of the thread at POS (or point) by
-RESULT and redraw it."
+RESULT and redraw it.
+
+This will keep point in a reasonable location.  However, if there
+are enclosing save-excursions and the saved point is in the
+result being updated, the point will be restored to the beginning
+of the result."
   (let ((start (notmuch-search-result-beginning pos))
 	(end (notmuch-search-result-end pos))
 	(init-point (point))
-	(init-start (window-start))
 	(inhibit-read-only t))
     ;; Delete the current thread
     (delete-region start end)
     ;; Insert the updated thread
     (notmuch-search-show-result result start)
-    ;; There may have been markers pointing into the text we just
-    ;; replaced.  For the most part, there's nothing we can do about
-    ;; this, but we can fix markers that were at point (which includes
-    ;; point itself and any save-excursions for which point hasn't
-    ;; moved) by re-inserting the text that should come before point
-    ;; before markers.
+    ;; If point was inside the old result, make an educated guess
+    ;; about where to place it now.  Unfortunately, this won't work
+    ;; with save-excursion (or any other markers that would be nice to
+    ;; preserve, such as the window start), but there's nothing we can
+    ;; do about that without a way to retrieve markers in a region.
     (when (and (>= init-point start) (<= init-point end))
       (let* ((new-end (notmuch-search-result-end start))
 	     (new-point (if (= init-point end)
 			    new-end
 			  (min init-point (- new-end 1)))))
-	(insert-before-markers (delete-and-extract-region start new-point))))
-    ;; We also may have shifted the window scroll.  Fix it.
-    (set-window-start (selected-window) init-start)))
+	(goto-char new-point)))))
 
 (defun notmuch-search-process-sentinel (proc msg)
   "Add a message to let user know when \"notmuch search\" exits"





More information about the notmuch mailing list