summary refs log tree commit diff
path: root/emacs/guix-location.el
diff options
context:
space:
mode:
authorAlex Kost <alezost@gmail.com>2016-04-01 14:00:01 +0300
committerAlex Kost <alezost@gmail.com>2016-04-18 10:09:02 +0300
commit79c7a8f214707c98c1ea1936fd62baec41177a81 (patch)
treee159d941112a49cdee0523b983f74a78e7b81a41 /emacs/guix-location.el
parentb4ea535a9f0382f3575fdeb3b2eb1cc7cfc37cd4 (diff)
downloadguix-79c7a8f214707c98c1ea1936fd62baec41177a81.tar.gz
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.
Diffstat (limited to 'emacs/guix-location.el')
-rw-r--r--emacs/guix-location.el72
1 files changed, 72 insertions, 0 deletions
diff --git a/emacs/guix-location.el b/emacs/guix-location.el
new file mode 100644
index 0000000000..4b23293d94
--- /dev/null
+++ b/emacs/guix-location.el
@@ -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