emacs: Add 'guix-pull' command.

* emacs/guix-base.el (guix-pull): New command.
  (guix-update-after-pull, guix-after-pull-hook): New variables.
  (guix-restart-repl-after-pull, guix-update-buffers-maybe-after-pull): New
  procedures.
* emacs/guix-main.scm: Use (guix scripts pull) module.
* doc/emacs.texi (Emacs Commands): Document 'guix-pull' command.
This commit is contained in:
Alex Kost 2014-10-21 11:48:28 +04:00
parent 17b50485a6
commit 2d7bf94927
3 changed files with 51 additions and 4 deletions

View file

@ -133,6 +133,17 @@ date/time prompt,,, org, Org Mode Manual}).
@end table
You can also invoke the @command{guix pull} command (@pxref{Invoking
guix pull}) from Emacs using:
@table @kbd
@item M-x guix-pull
With @kbd{C-u}, make it verbose.
@end table
Once @command{guix pull} has succeeded, the Guix REPL is restared. This
allows you to keep using the Emacs interface with the updated Guix.
@node Emacs General info
@subsubsection General information

View file

@ -994,6 +994,45 @@ Each element from GENERATIONS is a generation number."
'switch-to-generation profile generation)
operation-buffer)))
;;; Pull
(defcustom guix-update-after-pull t
"If non-nil, update Guix buffers after performing \\[guix-pull]."
:type 'boolean
:group 'guix)
(defvar guix-after-pull-hook
'(guix-restart-repl-after-pull guix-update-buffers-maybe-after-pull)
"Hook run after successful performing `guix-pull' operation.")
(defun guix-restart-repl-after-pull ()
"Restart Guix REPL after `guix-pull' operation."
(guix-repl-exit)
(guix-start-process-maybe
"Restarting Guix REPL after pull operation ..."))
(defun guix-update-buffers-maybe-after-pull ()
"Update buffers depending on `guix-update-after-pull'."
(when guix-update-after-pull
(mapc #'guix-update-buffer
;; No need to update "generation" buffers.
(guix-buffers '(guix-package-list-mode
guix-package-info-mode
guix-output-list-mode
guix-output-info-mode)))
(message "Guix buffers have been updated.")))
;;;###autoload
(defun guix-pull (&optional verbose)
"Run Guix pull operation.
If VERBOSE is non-nil (with prefix argument), produce verbose output."
(interactive)
(let ((args (and verbose '("--verbose"))))
(guix-eval-in-repl
(apply #'guix-make-guile-expression 'guix-pull args)
nil 'pull)))
(provide 'guix-base)
;;; guix-base.el ends here

View file

@ -31,10 +31,6 @@
;; installed manifest but not in a package directory), id parameter is
;; still "name-version" string. So id package parameter in the code
;; below is either an object-address number or a full-name string.
;;
;; Important: as object addresses live only during guile session, elisp
;; part should take care about updating information after "Guix REPL" is
;; restarted (TODO!)
;; To speed-up the process of getting information, the following
;; auxiliary variables are used:
@ -60,6 +56,7 @@
(guix utils)
(guix ui)
(guix scripts package)
(guix scripts pull)
(gnu packages))
(define-syntax-rule (first-or-false lst)