emacs: Improve 'guix-redisplay-buffer'.

* emacs/guix-base.el (guix-redisplay-buffer): Allow to display new entries.
  Restore point position.
This commit is contained in:
Alex Kost 2014-11-10 15:30:21 +03:00
parent e718f6cc8f
commit 37c4ffc2c4
1 changed files with 33 additions and 6 deletions

View File

@ -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