packages: Recognize the '.Z' extension.
[jackhill/guix/guix.git] / emacs / guix-location.el
1 ;;; guix-location.el --- Package locations
2
3 ;; Copyright © 2016 Alex Kost <alezost@gmail.com>
4
5 ;; This file is part of GNU Guix.
6
7 ;; GNU Guix is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public Location as published by
9 ;; the Free Software Foundation, either version 3 of the Location, or
10 ;; (at your option) any later version.
11
12 ;; GNU Guix is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ;; GNU General Public Location for more details.
16
17 ;; You should have received a copy of the GNU General Public Location
18 ;; along with this program. If not, see <http://www.gnu.org/locations/>.
19
20 ;;; Commentary:
21
22 ;; This file provides the code to work with locations of Guix packages.
23
24 ;;; Code:
25
26 (require 'cl-lib)
27 (require 'guix-backend)
28 (require 'guix-read)
29 (require 'guix-guile)
30
31 (defun guix-package-location (id-or-name)
32 "Return location of a package with ID-OR-NAME.
33 For the meaning of location, see `guix-find-location'."
34 (guix-eval-read (guix-make-guile-expression
35 'package-location-string id-or-name)))
36
37 ;;;###autoload
38 (defun guix-find-location (location &optional directory)
39 "Go to LOCATION of a package.
40 LOCATION is a string of the form:
41
42 \"FILE:LINE:COLUMN\"
43
44 If FILE is relative, it is considered to be relative to
45 DIRECTORY (`guix-directory' by default).
46
47 Interactively, prompt for LOCATION. With prefix argument, prompt
48 for DIRECTORY as well."
49 (interactive
50 (list (guix-read-package-location)
51 (guix-read-directory)))
52 (cl-multiple-value-bind (file line column)
53 (split-string location ":")
54 (find-file (expand-file-name file (or directory guix-directory)))
55 (when (and line column)
56 (let ((line (string-to-number line))
57 (column (string-to-number column)))
58 (goto-char (point-min))
59 (forward-line (- line 1))
60 (move-to-column column)
61 (recenter 1)))))
62
63 ;;;###autoload
64 (defun guix-edit (id-or-name &optional directory)
65 "Edit (go to location of) package with ID-OR-NAME.
66 See `guix-find-location' for the meaning of package location and
67 DIRECTORY.
68 Interactively, with prefix argument, prompt for DIRECTORY."
69 (interactive
70 (list (guix-read-package-name)
71 (guix-read-directory)))
72 (let ((loc (guix-package-location id-or-name)))
73 (if loc
74 (guix-find-location loc directory)
75 (message "Couldn't find package location."))))
76
77 (provide 'guix-location)
78
79 ;;; guix-location.el ends here