diff options
author | Dmitry Gutov <dgutov@yandex.ru> | 2015-01-06 13:21:59 +0300 |
---|---|---|
committer | Dmitry Gutov <dgutov@yandex.ru> | 2015-01-06 13:28:37 +0300 |
commit | 835f0c2c26909c4799f715817693a292bd08df21 (patch) | |
tree | c333a14a039926d34179556e2662f8762211156e | |
parent | f5afaf9ce74dd04e37d72e62ecd85fc19c06bb55 (diff) | |
download | emacs-scratch/xref.tar.gz |
Use `quit-window' to restore configuration before xrefscratch/xref
* lisp/progmodes/xref.el (xref--display-history): New variable.
(xref--window-configuration): Remove.
(xref--history-pushnew): New function.
(xref--display-position): Use `xref--history-pushnew'. 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--xref-buffer-mode-map): Bind `q' to it.
-rw-r--r-- | lisp/ChangeLog | 14 | ||||
-rw-r--r-- | lisp/progmodes/xref.el | 46 |
2 files changed, 45 insertions, 15 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 76ba2cd4c80..5311b50793c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,17 @@ +2015-01-06 Dmitry Gutov <dgutov@yandex.ru> + + * progmodes/xref.el (xref--display-history): New variable. + (xref--window-configuration): Remove. + (xref--history-pushnew): New function. + (xref--display-position): Use `xref--history-pushnew'. 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--xref-buffer-mode-map): Bind `q' to it. + 2015-01-05 Dmitry Gutov <dgutov@yandex.ru> * progmodes/xref.el (xref--insert-xrefs): Add `help-echo' property diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index b822619f783..b79b12f685f 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -332,19 +332,30 @@ 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) -(defun xref--display-position (pos other-window recenter-arg) - ;; show the location, but don't hijack focus. +(defun xref--history-pushnew (value) + (unless (equal value (car xref--display-history)) + (push value 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 ((val (cons (current-buffer) (selected-window))) + (rest (window-parameter nil 'quit-restore))) + ;; Save the new entry if the window displayed another buffer + ;; previously. + (when (and rest (not (eq (car rest) 'same))) + (with-current-buffer xref-buf + (xref--history-pushnew val)))))) (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 () @@ -352,14 +363,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) @@ -388,11 +393,10 @@ WINDOW controls how the buffer is displayed: (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) @@ -402,6 +406,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.") |