emacs: Separate package location code.
* emacs/guix-base.el (guix-directory, guix-read-directory) (guix-set-directory): Move to "guix-backend.el". (guix-find-location, guix-package-location, guix-edit): Move to... * emacs/guix-location.el: ... here. New file. * emacs/guix-ui-package.el: Use it. * emacs.am (ELFILES): Add it.
This commit is contained in:
parent
b4ea535a9f
commit
79c7a8f214
1
emacs.am
1
emacs.am
|
@ -40,6 +40,7 @@ ELFILES = \
|
||||||
emacs/guix-init.el \
|
emacs/guix-init.el \
|
||||||
emacs/guix-license.el \
|
emacs/guix-license.el \
|
||||||
emacs/guix-list.el \
|
emacs/guix-list.el \
|
||||||
|
emacs/guix-location.el \
|
||||||
emacs/guix-messages.el \
|
emacs/guix-messages.el \
|
||||||
emacs/guix-pcomplete.el \
|
emacs/guix-pcomplete.el \
|
||||||
emacs/guix-popup.el \
|
emacs/guix-popup.el \
|
||||||
|
|
|
@ -82,7 +82,7 @@ If you have a slow system, try to increase this time."
|
||||||
:type 'string
|
:type 'string
|
||||||
:group 'guix-repl)
|
:group 'guix-repl)
|
||||||
|
|
||||||
(defcustom guix-after-start-repl-hook ()
|
(defcustom guix-after-start-repl-hook '(guix-set-directory)
|
||||||
"Hook called after Guix REPL is started."
|
"Hook called after Guix REPL is started."
|
||||||
:type 'hook
|
:type 'hook
|
||||||
:group 'guix-repl)
|
:group 'guix-repl)
|
||||||
|
@ -336,6 +336,28 @@ additional internal REPL if it exists."
|
||||||
(interactive "P")
|
(interactive "P")
|
||||||
(geiser-repl--switch-to-buffer (guix-get-repl-buffer internal)))
|
(geiser-repl--switch-to-buffer (guix-get-repl-buffer internal)))
|
||||||
|
|
||||||
|
|
||||||
|
;;; Guix directory
|
||||||
|
|
||||||
|
(defvar guix-directory nil
|
||||||
|
"Default directory with Guix source.
|
||||||
|
If it is not set by a user, it is set after starting Guile REPL.
|
||||||
|
This directory is used to define package locations.")
|
||||||
|
|
||||||
|
(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 ()
|
||||||
|
"Set `guix-directory' if needed."
|
||||||
|
(or guix-directory
|
||||||
|
(setq guix-directory
|
||||||
|
(guix-eval-read "%guix-dir"))))
|
||||||
|
|
||||||
|
|
||||||
;;; Evaluating expressions
|
;;; Evaluating expressions
|
||||||
|
|
||||||
|
|
|
@ -48,53 +48,7 @@
|
||||||
(when output (concat ":" output))))
|
(when output (concat ":" output))))
|
||||||
|
|
||||||
|
|
||||||
;;; Location of packages, profiles and manifests
|
;;; Location of profiles and manifests
|
||||||
|
|
||||||
(defvar guix-directory nil
|
|
||||||
"Default Guix directory.
|
|
||||||
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.")
|
|
||||||
|
|
||||||
(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 ()
|
|
||||||
"Set `guix-directory' if needed."
|
|
||||||
(or guix-directory
|
|
||||||
(setq guix-directory
|
|
||||||
(guix-eval-read "%guix-dir"))))
|
|
||||||
|
|
||||||
(add-hook 'guix-after-start-repl-hook 'guix-set-directory)
|
|
||||||
|
|
||||||
(defun guix-find-location (location &optional directory)
|
|
||||||
"Go to LOCATION of a package.
|
|
||||||
LOCATION is a string of the form:
|
|
||||||
|
|
||||||
\"PATH:LINE:COLUMN\"
|
|
||||||
|
|
||||||
If PATH is relative, it is considered to be relative to
|
|
||||||
DIRECTORY (`guix-directory' by default)."
|
|
||||||
(cl-multiple-value-bind (path line col)
|
|
||||||
(split-string location ":")
|
|
||||||
(let ((file (expand-file-name path (or directory guix-directory)))
|
|
||||||
(line (string-to-number line))
|
|
||||||
(col (string-to-number col)))
|
|
||||||
(find-file file)
|
|
||||||
(goto-char (point-min))
|
|
||||||
(forward-line (- line 1))
|
|
||||||
(move-to-column col)
|
|
||||||
(recenter 1))))
|
|
||||||
|
|
||||||
(defun guix-package-location (id-or-name)
|
|
||||||
"Return location of a package with ID-OR-NAME.
|
|
||||||
For the meaning of location, see `guix-find-location'."
|
|
||||||
(guix-eval-read (guix-make-guile-expression
|
|
||||||
'package-location-string id-or-name)))
|
|
||||||
|
|
||||||
(defun guix-generation-file (profile generation)
|
(defun guix-generation-file (profile generation)
|
||||||
"Return the file name of a PROFILE's GENERATION."
|
"Return the file name of a PROFILE's GENERATION."
|
||||||
|
@ -120,20 +74,6 @@ See `guix-packages-profile'."
|
||||||
(expand-file-name "manifest"
|
(expand-file-name "manifest"
|
||||||
(guix-packages-profile profile generation system?)))
|
(guix-packages-profile profile generation system?)))
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun guix-edit (id-or-name &optional directory)
|
|
||||||
"Edit (go to location of) package with ID-OR-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)))
|
|
||||||
(if loc
|
|
||||||
(guix-find-location loc directory)
|
|
||||||
(message "Couldn't find package location."))))
|
|
||||||
|
|
||||||
|
|
||||||
;;; Actions on packages and generations
|
;;; Actions on packages and generations
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
;;; guix-location.el --- Package locations
|
||||||
|
|
||||||
|
;; Copyright © 2016 Alex Kost <alezost@gmail.com>
|
||||||
|
|
||||||
|
;; This file is part of GNU Guix.
|
||||||
|
|
||||||
|
;; GNU Guix is free software; you can redistribute it and/or modify
|
||||||
|
;; it under the terms of the GNU General Public Location as published by
|
||||||
|
;; the Free Software Foundation, either version 3 of the Location, or
|
||||||
|
;; (at your option) any later version.
|
||||||
|
|
||||||
|
;; GNU Guix is distributed in the hope that it will be useful,
|
||||||
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
;; GNU General Public Location for more details.
|
||||||
|
|
||||||
|
;; You should have received a copy of the GNU General Public Location
|
||||||
|
;; along with this program. If not, see <http://www.gnu.org/locations/>.
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
|
||||||
|
;; This file provides the code to work with locations of Guix packages.
|
||||||
|
|
||||||
|
;;; Code:
|
||||||
|
|
||||||
|
(require 'cl-lib)
|
||||||
|
(require 'guix-backend)
|
||||||
|
(require 'guix-read)
|
||||||
|
(require 'guix-guile)
|
||||||
|
|
||||||
|
(defun guix-package-location (id-or-name)
|
||||||
|
"Return location of a package with ID-OR-NAME.
|
||||||
|
For the meaning of location, see `guix-find-location'."
|
||||||
|
(guix-eval-read (guix-make-guile-expression
|
||||||
|
'package-location-string id-or-name)))
|
||||||
|
|
||||||
|
(defun guix-find-location (location &optional directory)
|
||||||
|
"Go to LOCATION of a package.
|
||||||
|
LOCATION is a string of the form:
|
||||||
|
|
||||||
|
\"PATH:LINE:COLUMN\"
|
||||||
|
|
||||||
|
If PATH is relative, it is considered to be relative to
|
||||||
|
DIRECTORY (`guix-directory' by default)."
|
||||||
|
(cl-multiple-value-bind (path line col)
|
||||||
|
(split-string location ":")
|
||||||
|
(let ((file (expand-file-name path (or directory guix-directory)))
|
||||||
|
(line (string-to-number line))
|
||||||
|
(col (string-to-number col)))
|
||||||
|
(find-file file)
|
||||||
|
(goto-char (point-min))
|
||||||
|
(forward-line (- line 1))
|
||||||
|
(move-to-column col)
|
||||||
|
(recenter 1))))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun guix-edit (id-or-name &optional directory)
|
||||||
|
"Edit (go to location of) package with ID-OR-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)))
|
||||||
|
(if loc
|
||||||
|
(guix-find-location loc directory)
|
||||||
|
(message "Couldn't find package location."))))
|
||||||
|
|
||||||
|
(provide 'guix-location)
|
||||||
|
|
||||||
|
;;; guix-location.el ends here
|
|
@ -38,6 +38,7 @@
|
||||||
(require 'guix-hydra-build)
|
(require 'guix-hydra-build)
|
||||||
(require 'guix-read)
|
(require 'guix-read)
|
||||||
(require 'guix-license)
|
(require 'guix-license)
|
||||||
|
(require 'guix-location)
|
||||||
(require 'guix-profiles)
|
(require 'guix-profiles)
|
||||||
|
|
||||||
(guix-ui-define-entry-type package)
|
(guix-ui-define-entry-type package)
|
||||||
|
|
Loading…
Reference in New Issue