emacs: Improve 'guix-redisplay-buffer'.
authorAlex Kost <alezost@gmail.com>
Mon, 10 Nov 2014 12:30:21 +0000 (15:30 +0300)
committerAlex Kost <alezost@gmail.com>
Mon, 10 Nov 2014 13:13:41 +0000 (16:13 +0300)
* emacs/guix-base.el (guix-redisplay-buffer): Allow to display new entries.
  Restore point position.

emacs/guix-base.el

index 784474e..a6e56dc 100644 (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)))))
 
 \f
 ;;; Generations