summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/emacs.texi3
-rw-r--r--emacs/guix-base.el9
-rw-r--r--emacs/guix-info.el9
-rw-r--r--emacs/guix-list.el11
4 files changed, 31 insertions, 1 deletions
diff --git a/doc/emacs.texi b/doc/emacs.texi
index 2e6b60ec77..01a5712f3b 100644
--- a/doc/emacs.texi
+++ b/doc/emacs.texi
@@ -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
diff --git a/emacs/guix-base.el b/emacs/guix-base.el
index aafa220f8b..5131eb0f87 100644
--- a/emacs/guix-base.el
+++ b/emacs/guix-base.el
@@ -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
diff --git a/emacs/guix-info.el b/emacs/guix-info.el
index fc1b585414..7a600907b1 100644
--- a/emacs/guix-info.el
+++ b/emacs/guix-info.el
@@ -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)
diff --git a/emacs/guix-list.el b/emacs/guix-list.el
index f9d106b421..c3e8ef4cdc 100644
--- a/emacs/guix-list.el
+++ b/emacs/guix-list.el
@@ -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)