emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 36bfd69 2/2: Use quit-window to hide buffers tempor


From: Dmitry Gutov
Subject: [Emacs-diffs] master 36bfd69 2/2: Use quit-window to hide buffers temporarily displayed by xref
Date: Mon, 19 Jan 2015 02:20:30 +0000

branch: master
commit 36bfd6947f8671eb279d8aa8f2976ada24361dec
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>

    Use quit-window to hide buffers temporarily displayed by xref
    
    * lisp/progmodes/xref.el (xref--display-history): New variable.
    (xref--window-configuration): Remove.
    (xref--save-to-history): New function.
    (xref--display-position): Use it.  Add new argument.
    (xref--restore-window-configuration): Remove.
    (xref--show-location, xref-show-location-at-point): Update
    accordingly.
    (xref--xref-buffer-mode): Don't use `pre-command-hook'.
    (xref--quit): New command.
    (xref-goto-xref): Use it.
    (xref--xref-buffer-mode-map): Bind `q' to it.
---
 lisp/ChangeLog         |   14 +++++++++++++
 lisp/progmodes/xref.el |   50 ++++++++++++++++++++++++++++++++---------------
 2 files changed, 48 insertions(+), 16 deletions(-)

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index d84e831..39d9436 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,17 @@
+2015-01-19  Dmitry Gutov  <address@hidden>
+
+       * progmodes/xref.el (xref--display-history): New variable.
+       (xref--window-configuration): Remove.
+       (xref--save-to-history): New function.
+       (xref--display-position): Use it.  Add new argument.
+       (xref--restore-window-configuration): Remove.
+       (xref--show-location, xref-show-location-at-point): Update
+       accordingly.
+       (xref--xref-buffer-mode): Don't use `pre-command-hook'.
+       (xref--quit): New command.
+       (xref-goto-xref): Use it.
+       (xref--xref-buffer-mode-map): Bind `q' to it.
+
 2015-01-18  Dmitry Gutov  <address@hidden>
 
        * progmodes/xref.el (xref-goto-xref): Perform the jump even inside
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 59da579..4431cb5 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -51,6 +51,7 @@
 (require 'cl-lib)
 (require 'eieio)
 (require 'ring)
+(require 'pcase)
 
 (defgroup xref nil "Cross-referencing commands"
   :group 'tools)
@@ -333,19 +334,31 @@ WINDOW controls how the buffer is displayed:
 
 ;; The xref buffer is used to display a set of xrefs.
 
-(defvar-local xref--window-configuration nil)
+(defvar-local xref--display-history nil
+  "List of pairs (BUFFER . WINDOW), for temporarily displayed buffers.")
 
-(defun xref--display-position (pos other-window recenter-arg)
-  ;; show the location, but don't hijack focus.
+(defun xref--save-to-history (buf win)
+  (let ((restore (window-parameter win 'quit-restore)))
+    ;; Save the new entry if the window displayed another buffer
+    ;; previously.
+    (when (and restore (not (eq (car restore) 'same)))
+      (push (cons buf win) xref--display-history))))
+
+(defun xref--display-position (pos other-window recenter-arg xref-buf)
+  ;; Show the location, but don't hijack focus.
   (with-selected-window (display-buffer (current-buffer) other-window)
     (goto-char pos)
-    (recenter recenter-arg)))
+    (recenter recenter-arg)
+    (let ((buf (current-buffer))
+          (win (selected-window)))
+      (with-current-buffer xref-buf
+        (xref--save-to-history buf win)))))
 
 (defun xref--show-location (location)
   (condition-case err
-      (progn
+      (let ((xref-buf (current-buffer)))
         (xref--goto-location location)
-        (xref--display-position (point) t 1))
+        (xref--display-position (point) t 1 xref-buf))
     (user-error (message (error-message-string err)))))
 
 (defun xref-show-location-at-point ()
@@ -353,14 +366,8 @@ WINDOW controls how the buffer is displayed:
   (interactive)
   (let ((loc (xref--location-at-point)))
     (when loc
-      (setq xref--window-configuration (current-window-configuration))
       (xref--show-location loc))))
 
-(defun xref--restore-window-configuration ()
-  (when xref--window-configuration
-    (set-window-configuration xref--window-configuration)
-    (setq xref--window-configuration nil)))
-
 (defun xref-next-line ()
   "Move to the next xref and display its source in the other window."
   (interactive)
@@ -385,16 +392,15 @@ WINDOW controls how the buffer is displayed:
   (let ((loc (or (xref--location-at-point)
                  (error "No reference at point")))
         (window xref--window))
-    (quit-window)
+    (xref--quit)
     (xref--pop-to-location loc window)))
 
 (define-derived-mode xref--xref-buffer-mode fundamental-mode "XREF"
   "Mode for displaying cross-references."
-  (setq buffer-read-only t)
-  (add-hook 'pre-command-hook #'xref--restore-window-configuration nil t))
+  (setq buffer-read-only t))
 
 (let ((map xref--xref-buffer-mode-map))
-  (define-key map (kbd "q") #'quit-window)
+  (define-key map (kbd "q") #'xref--quit)
   (define-key map (kbd "n") #'xref-next-line)
   (define-key map (kbd "p") #'xref-prev-line)
   (define-key map (kbd "RET") #'xref-goto-xref)
@@ -404,6 +410,18 @@ WINDOW controls how the buffer is displayed:
   (define-key map (kbd ".") #'xref-next-line)
   (define-key map (kbd ",") #'xref-prev-line))
 
+(defun xref--quit ()
+  "Quit all windows in `xref--display-history', then quit current window."
+  (interactive)
+  (let ((window (selected-window))
+        (history xref--display-history))
+    (setq xref--display-history nil)
+    (pcase-dolist (`(,buf . ,win) history)
+      (when (and (window-live-p win)
+                 (eq buf (window-buffer win)))
+        (quit-window nil win)))
+    (quit-window nil window)))
+
 (defconst xref-buffer-name "*xref*"
   "The name of the buffer to show xrefs.")
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]