~ruther/guix-local

2d7bf949277a0889ced8aa486c4ef16cb7cf6b1a — Alex Kost 11 years ago 17b5048
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.
3 files changed, 51 insertions(+), 4 deletions(-)

M doc/emacs.texi
M emacs/guix-base.el
M emacs/guix-main.scm
M doc/emacs.texi => doc/emacs.texi +11 -0
@@ 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


M emacs/guix-base.el => emacs/guix-base.el +39 -0
@@ 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

M emacs/guix-main.scm => emacs/guix-main.scm +1 -4
@@ 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)