summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Kost <alezost@gmail.com>2015-11-22 13:21:18 +0300
committerAlex Kost <alezost@gmail.com>2016-01-02 17:25:35 +0300
commit819518d15a4ca6ef4ce0844d89e990ffd46ee3a0 (patch)
tree00d457ec61e45e33f64afb3b7125776d72d9ee92
parente40b3c33f4750dcbe83012eb4e5b8e786f9f71b1 (diff)
downloadguix-819518d15a4ca6ef4ce0844d89e990ffd46ee3a0.tar.gz
emacs: Generalize buffer redisplaying.
* emacs/guix-base.el (guix-buffer-after-redisplay-hook): New variable.
  (guix-redisplay-buffer): Use it.  Remove all arguments and the code
  for moving point to the next button.  Rename to...
  (guix-buffer-redisplay): ... this.
  (guix-buffer-redisplay-goto-button): New procedure.
* emacs/guix-info.el (guix-package-info-show-source): Use it.  Adjust
  accordingly.
  (guix-package-info-redisplay-after-download): Likewise.
-rw-r--r--emacs/guix-base.el64
-rw-r--r--emacs/guix-info.el15
2 files changed, 40 insertions, 39 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
diff --git a/emacs/guix-info.el b/emacs/guix-info.el
index 6e50d34c4d..b52bd73322 100644
--- a/emacs/guix-info.el
+++ b/emacs/guix-info.el
@@ -714,14 +714,16 @@ prompt depending on `guix-operation-confirm' variable)."
 Find the file if needed (see `guix-package-info-auto-find-source').
 ENTRY-ID is an ID of the current entry (package or output).
 PACKAGE-ID is an ID of the package which source to show."
-  (let* ((entry (guix-entry-by-id entry-id guix-entries))
-         (file  (guix-package-source-path package-id)))
+  (let* ((entries guix-entries)
+         (entry   (guix-entry-by-id entry-id guix-entries))
+         (file    (guix-package-source-path package-id)))
     (or file
-        (error "Couldn't define file path of the package source"))
+        (error "Couldn't define file name of the package source"))
     (let* ((new-entry (cons (cons 'source-file file)
                             entry))
-           (entries (guix-replace-entry entry-id new-entry guix-entries)))
-      (guix-redisplay-buffer :entries entries)
+           (new-entries (guix-replace-entry entry-id new-entry entries)))
+      (setq guix-entries new-entries)
+      (guix-buffer-redisplay-goto-button)
       (if (file-exists-p file)
           (if guix-package-info-auto-find-source
               (guix-find-file file)
@@ -770,7 +772,8 @@ SOURCE is a list of URLs."
   "Redisplay an 'info' buffer after downloading the package source.
 This function is used to hide a \"Download\" button if needed."
   (when (buffer-live-p guix-package-info-download-buffer)
-    (guix-redisplay-buffer :buffer guix-package-info-download-buffer)
+    (with-current-buffer guix-package-info-download-buffer
+      (guix-buffer-redisplay-goto-button))
     (setq guix-package-info-download-buffer nil)))
 
 (add-hook 'guix-after-source-download-hook