summary refs log tree commit diff
path: root/emacs
diff options
context:
space:
mode:
Diffstat (limited to 'emacs')
-rw-r--r--emacs/guix-base.el9
-rw-r--r--emacs/guix-info.el9
-rw-r--r--emacs/guix-list.el11
3 files changed, 28 insertions, 1 deletions
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)