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.
This commit is contained in:
Alex Kost 2014-10-10 23:58:30 +04:00
parent c2379b3c1f
commit af874238d4
4 changed files with 31 additions and 1 deletions

View file

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

View file

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

View file

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

View file

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