~ruther/guix-local

af874238d4d05f6584eebb7ceee10ee2ab1bf312 — Alex Kost 11 years ago c2379b3
emacs: Add support for switching generations.

* emacs/guix-base.el (guix-switch-to-generation): New procedure.
* emacs/guix-info.el (guix-generation-info-insert-current): Insert button for
  switching to generation.
* emacs/guix-list.el (guix-generation-list-switch): New procedure.
* doc/emacs.texi (emacs List buffer, emacs Info buffer): Document switching
  generations.
4 files changed, 31 insertions(+), 1 deletions(-)

M doc/emacs.texi
M emacs/guix-base.el
M emacs/guix-info.el
M emacs/guix-list.el
M doc/emacs.texi => doc/emacs.texi +3 -0
@@ 205,6 205,8 @@ List packages installed in the current generation.
@item i
Describe marked generations (display available information in a
``generation-info'' buffer).
@item s
Switch profile to the current generation.
@item d
Mark the current generation for deletion (with prefix, mark all
generations).


@@ 236,6 238,7 @@ emacs, The Emacs Editor}) which can be used to:

@itemize @minus
@item remove a generation;
@item switch to a generation;
@item list packages installed in a generation;
@item jump to a generation directory.
@end itemize

M emacs/guix-base.el => emacs/guix-base.el +9 -0
@@ 816,6 816,15 @@ Each element from GENERATIONS is a generation number."
     (guix-make-guile-expression
      'delete-generations* guix-current-profile generations))))

(defun guix-switch-to-generation (generation)
  "Switch `guix-current-profile' to GENERATION number."
  (when (or (not guix-operation-confirm)
            (y-or-n-p (format "Switch current profile to generation %d? "
                              generation)))
    (guix-eval-in-repl
     (guix-make-guile-expression
      'switch-to-generation guix-current-profile generation))))

(provide 'guix-base)

;;; guix-base.el ends here

M emacs/guix-info.el => emacs/guix-info.el +8 -1
@@ 647,7 647,14 @@ ENTRY is an alist with package info."
  "Insert boolean value VAL showing whether this generation is current."
  (if val
      (guix-info-insert-val-default "Yes" 'guix-generation-info-current)
    (guix-info-insert-val-default "No" 'guix-generation-info-not-current)))
    (guix-info-insert-val-default "No" 'guix-generation-info-not-current)
    (guix-info-insert-indent)
    (guix-info-insert-action-button
     "Switch"
     (lambda (btn)
       (guix-switch-to-generation (button-get btn 'number)))
     "Switch to this generation (make it the current one)"
     'number (guix-get-key-val entry 'number))))

(provide 'guix-info)


M emacs/guix-list.el => emacs/guix-list.el +11 -0
@@ 735,6 735,7 @@ Also see `guix-package-info-type'."
  (define-key map (kbd "RET") 'guix-generation-list-show-packages)
  (define-key map (kbd "x")   'guix-generation-list-execute)
  (define-key map (kbd "i")   'guix-list-describe)
  (define-key map (kbd "s")   'guix-generation-list-switch)
  (define-key map (kbd "d")   'guix-generation-list-mark-delete))

(defun guix-generation-list-get-current (val &optional _)


@@ 742,6 743,16 @@ Also see `guix-package-info-type'."
VAL is a boolean value."
  (if val "(current)" ""))

(defun guix-generation-list-switch ()
  "Switch current profile to the generation at point."
  (interactive)
  (let* ((entry   (guix-list-current-entry))
         (current (guix-get-key-val entry 'current))
         (number  (guix-get-key-val entry 'number)))
    (if current
        (user-error "This generation is already the current one")
      (guix-switch-to-generation number))))

(defun guix-generation-list-show-packages ()
  "List installed packages for the generation at point."
  (interactive)