diff --git a/emacs/guix-base.el b/emacs/guix-base.el index 784474e333..a6e56dced1 100644 --- a/emacs/guix-base.el +++ b/emacs/guix-base.el @@ -640,14 +640,41 @@ 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)))) -(defun guix-redisplay-buffer () - "Redisplay current information. +(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. + This function will not update the information, use -\"\\[revert-buffer]\" if you want the full update." +\"\\[revert-buffer]\" if you want the full update. + +If BUFFER is nil, use the current buffer. For the meaning of the +rest arguments, see `guix-set-buffer'." (interactive) - (guix-show-entries guix-entries guix-buffer-type guix-entry-type) - (guix-result-message guix-profile guix-entries guix-entry-type - guix-search-type guix-search-vals)) + (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))))) ;;; Generations