emacs: 'C-u M-x guix-edit' prompts for directory.

* emacs/guix-base.el (guix-read-directory): New procedure.
(guix-find-location, guix-edit): Add optional 'directory' argument.
* emacs/guix-ui-package.el (guix-package-list-edit)
(guix-output-list-edit): Likewise.
* doc/emacs.texi (Emacs Commands): Mention "C-u".
This commit is contained in:
Alex Kost 2016-02-07 11:08:57 +03:00
parent f1957fc145
commit 2c04e2eec8
3 changed files with 34 additions and 15 deletions

View File

@ -240,6 +240,9 @@ this:
@kbd{M-x guix-edit guix} opens @kbd{M-x guix-edit guix} opens
@file{~/src/guix/gnu/packages/package-management.scm} file. @file{~/src/guix/gnu/packages/package-management.scm} file.
Also you can use @kbd{C-u} prefix argument to specify a directory just
for the current @kbd{M-x guix-edit} command.
@node Emacs General info @node Emacs General info
@subsection General information @subsection General information

View File

@ -55,6 +55,14 @@
If it is not set by a user, it is set after starting Guile REPL. If it is not set by a user, it is set after starting Guile REPL.
This directory is used to define location of the packages.") This directory is used to define location of the packages.")
(defun guix-read-directory ()
"Return `guix-directory' or prompt for it.
This function is intended for using in `interactive' forms."
(if current-prefix-arg
(read-directory-name "Directory with Guix modules: "
guix-directory)
guix-directory))
(defun guix-set-directory () (defun guix-set-directory ()
"Set `guix-directory' if needed." "Set `guix-directory' if needed."
(or guix-directory (or guix-directory
@ -63,17 +71,17 @@ This directory is used to define location of the packages.")
(add-hook 'guix-after-start-repl-hook 'guix-set-directory) (add-hook 'guix-after-start-repl-hook 'guix-set-directory)
(defun guix-find-location (location) (defun guix-find-location (location &optional directory)
"Go to LOCATION of a package. "Go to LOCATION of a package.
LOCATION is a string of the form: LOCATION is a string of the form:
\"PATH:LINE:COLUMN\" \"PATH:LINE:COLUMN\"
If PATH is relative, it is considered to be relative to If PATH is relative, it is considered to be relative to
`guix-directory'." DIRECTORY (`guix-directory' by default)."
(cl-multiple-value-bind (path line col) (cl-multiple-value-bind (path line col)
(split-string location ":") (split-string location ":")
(let ((file (expand-file-name path guix-directory)) (let ((file (expand-file-name path (or directory guix-directory)))
(line (string-to-number line)) (line (string-to-number line))
(col (string-to-number col))) (col (string-to-number col)))
(find-file file) (find-file file)
@ -113,12 +121,17 @@ See `guix-packages-profile'."
(guix-packages-profile profile generation system?))) (guix-packages-profile profile generation system?)))
;;;###autoload ;;;###autoload
(defun guix-edit (id-or-name) (defun guix-edit (id-or-name &optional directory)
"Edit (go to location of) package with ID-OR-NAME." "Edit (go to location of) package with ID-OR-NAME.
(interactive (list (guix-read-package-name))) See `guix-find-location' for the meaning of package location and
DIRECTORY.
Interactively, with prefix argument, prompt for DIRECTORY."
(interactive
(list (guix-read-package-name)
(guix-read-directory)))
(let ((loc (guix-package-location id-or-name))) (let ((loc (guix-package-location id-or-name)))
(if loc (if loc
(guix-find-location loc) (guix-find-location loc directory)
(message "Couldn't find package location.")))) (message "Couldn't find package location."))))

View File

@ -746,10 +746,11 @@ The specification is suitable for `guix-process-package-actions'."
(let ((specs (guix-list-get-marked-args action-type))) (let ((specs (guix-list-get-marked-args action-type)))
(and specs (cons action-type specs)))) (and specs (cons action-type specs))))
(defun guix-package-list-edit () (defun guix-package-list-edit (&optional directory)
"Go to the location of the current package." "Go to the location of the current package.
(interactive) See `guix-find-location' for the meaning of DIRECTORY."
(guix-edit (guix-list-current-id))) (interactive (list (guix-read-directory)))
(guix-edit (guix-list-current-id) directory))
(defun guix-package-list-latest-builds (number &rest args) (defun guix-package-list-latest-builds (number &rest args)
"Display latest NUMBER of Hydra builds of the current package. "Display latest NUMBER of Hydra builds of the current package.
@ -906,11 +907,13 @@ See `guix-package-info-type'."
'id (cl-remove-duplicates pids)) 'id (cl-remove-duplicates pids))
'add)))) 'add))))
(defun guix-output-list-edit () (defun guix-output-list-edit (&optional directory)
"Go to the location of the current package." "Go to the location of the current package.
(interactive) See `guix-find-location' for the meaning of DIRECTORY."
(interactive (list (guix-read-directory)))
(guix-edit (guix-entry-value (guix-list-current-entry) (guix-edit (guix-entry-value (guix-list-current-entry)
'package-id))) 'package-id)
directory))
;;; Interactive commands ;;; Interactive commands