]> git.eshelyaron.com Git - emacs.git/commitdiff
Set next-error-* in xref--xref-buffer-mode
authorHelmut Eller <eller.helmut@gmail.com>
Thu, 30 Apr 2015 00:41:34 +0000 (03:41 +0300)
committerDmitry Gutov <dgutov@yandex.ru>
Thu, 30 Apr 2015 00:41:42 +0000 (03:41 +0300)
* xref.el (xref--xref-buffer-mode): Set `next-error-function' and
`next-error-last-buffer'.
(xref--next-error-function): New function.
(http://lists.gnu.org/archive/html/emacs-devel/2015-04/msg01311.html)

lisp/progmodes/xref.el

index 9f1068668b126d2e46d762bebc304c29e03a70c7..fc27c2688451ac04dbe78f2bd1c91b022b75be33 100644 (file)
@@ -444,7 +444,22 @@ Used for temporary buffers.")
 
 (define-derived-mode xref--xref-buffer-mode special-mode "XREF"
   "Mode for displaying cross-references."
-  (setq buffer-read-only t))
+  (setq buffer-read-only t)
+  (setq next-error-function #'xref--next-error-function)
+  (setq next-error-last-buffer (current-buffer)))
+
+(defun xref--next-error-function (n reset?)
+  (when reset?
+    (goto-char (point-min)))
+  (let ((backward (< n 0))
+        (n (abs n))
+        (loc nil))
+    (dotimes (_ n)
+      (setq loc (xref--search-property 'xref-location backward)))
+    (cond (loc
+           (xref--pop-to-location loc))
+          (t
+           (error "No %s xref" (if backward "previous" "next"))))))
 
 (defun xref-quit (&optional kill)
   "Bury temporarily displayed buffers, then quit the current window.