aboutsummaryrefslogtreecommitdiff
path: root/emacs/guix-base.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs/guix-base.el')
-rw-r--r--emacs/guix-base.el64
1 files changed, 31 insertions, 33 deletions
diff --git a/emacs/guix-base.el b/emacs/guix-base.el
index 73c94042ba..7592988fec 100644
--- a/emacs/guix-base.el
+++ b/emacs/guix-base.el
@@ -288,7 +288,7 @@ This alist is filled by `guix-buffer-define-interface' macro.")
(define-key map (kbd "l") 'guix-history-back)
(define-key map (kbd "r") 'guix-history-forward)
(define-key map (kbd "g") 'revert-buffer)
- (define-key map (kbd "R") 'guix-redisplay-buffer)
+ (define-key map (kbd "R") 'guix-buffer-redisplay)
map)
"Parent keymap for Guix buffer modes.")
@@ -616,41 +616,39 @@ See `revert-buffer' for the meaning of NOCONFIRM."
(guix-set-buffer guix-profile entries guix-buffer-type guix-entry-type
search-type search-vals t t))))
-(cl-defun guix-redisplay-buffer (&key buffer profile entries buffer-type
- entry-type search-type search-vals)
- "Redisplay a Guix BUFFER.
-Restore the point and window positions after redisplaying if possible.
+(defvar guix-buffer-after-redisplay-hook nil
+ "Hook run by `guix-buffer-redisplay'.
+This hook is called before seting up a window position.")
-This function will not update the information, use
-\"\\[revert-buffer]\" if you want the full update.
+(defun guix-buffer-redisplay ()
+ "Redisplay the current Guix buffer.
+Restore the point and window positions after redisplaying.
-If BUFFER is nil, use the current buffer. For the meaning of the
-rest arguments, see `guix-set-buffer'."
+This function does not update the buffer data, use
+'\\[revert-buffer]' if you want the full update."
(interactive)
- (or buffer (setq buffer (current-buffer)))
- (with-current-buffer buffer
- (or (derived-mode-p 'guix-info-mode 'guix-list-mode)
- (error "%S is not a Guix buffer" buffer))
- (let* ((point (point))
- (was-at-button (button-at point))
- ;; For simplicity, ignore an unlikely case when multiple
- ;; windows display the same BUFFER.
- (window (car (get-buffer-window-list buffer nil t)))
- (window-start (and window (window-start window))))
- (guix-set-buffer (or profile guix-profile)
- (or entries guix-entries)
- (or buffer-type guix-buffer-type)
- (or entry-type guix-entry-type)
- (or search-type guix-search-type)
- (or search-vals guix-search-vals)
- t t)
- (goto-char point)
- (and was-at-button
- (not (button-at (point)))
- (forward-button 1))
- (when window
- (set-window-point window (point))
- (set-window-start window window-start)))))
+ (let* ((old-point (point))
+ ;; For simplicity, ignore an unlikely case when multiple
+ ;; windows display the same buffer.
+ (window (car (get-buffer-window-list (current-buffer) nil t)))
+ (window-start (and window (window-start window))))
+ (guix-set-buffer guix-profile guix-entries guix-buffer-type
+ guix-entry-type guix-search-type guix-search-vals
+ t t)
+ (goto-char old-point)
+ (run-hooks 'guix-buffer-after-redisplay-hook)
+ (when window
+ (set-window-point window (point))
+ (set-window-start window window-start))))
+
+(defun guix-buffer-redisplay-goto-button ()
+ "Redisplay the current buffer and go to the next button, if needed."
+ (let ((guix-buffer-after-redisplay-hook
+ (cons (lambda ()
+ (unless (button-at (point))
+ (forward-button 1)))
+ guix-buffer-after-redisplay-hook)))
+ (guix-buffer-redisplay)))
;;; Generations