diff options
-rw-r--r-- | doc/emacs.texi | 3 | ||||
-rw-r--r-- | emacs/guix-base.el | 9 | ||||
-rw-r--r-- | emacs/guix-info.el | 9 | ||||
-rw-r--r-- | emacs/guix-list.el | 11 |
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) |