~ruther/guix-local

79c7a8f214707c98c1ea1936fd62baec41177a81 — Alex Kost 10 years ago b4ea535
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.
5 files changed, 98 insertions(+), 62 deletions(-)

M emacs.am
M emacs/guix-backend.el
M emacs/guix-base.el
A emacs/guix-location.el
M emacs/guix-ui-package.el
M emacs.am => emacs.am +1 -0
@@ 40,6 40,7 @@ ELFILES =					\
  emacs/guix-init.el				\
  emacs/guix-license.el				\
  emacs/guix-list.el				\
  emacs/guix-location.el			\
  emacs/guix-messages.el			\
  emacs/guix-pcomplete.el			\
  emacs/guix-popup.el				\

M emacs/guix-backend.el => emacs/guix-backend.el +23 -1
@@ 82,7 82,7 @@ If you have a slow system, try to increase this time."
  :type 'string
  :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."
  :type 'hook
  :group 'guix-repl)


@@ 337,6 337,28 @@ additional internal REPL if it exists."
  (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

(defvar guix-operation-buffer nil

M emacs/guix-base.el => emacs/guix-base.el +1 -61
@@ 48,53 48,7 @@
          (when output (concat ":" output))))


;;; Location of packages, 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)))
;;; Location of profiles and manifests

(defun guix-generation-file (profile generation)
  "Return the file name of a PROFILE's GENERATION."


@@ 120,20 74,6 @@ See `guix-packages-profile'."
  (expand-file-name "manifest"
                    (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


A emacs/guix-location.el => emacs/guix-location.el +72 -0
@@ 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

M emacs/guix-ui-package.el => emacs/guix-ui-package.el +1 -0
@@ 38,6 38,7 @@
(require 'guix-hydra-build)
(require 'guix-read)
(require 'guix-license)
(require 'guix-location)
(require 'guix-profiles)

(guix-ui-define-entry-type package)