From 79c7a8f214707c98c1ea1936fd62baec41177a81 Mon Sep 17 00:00:00 2001 From: Alex Kost Date: Fri, 1 Apr 2016 14:00:01 +0300 Subject: [PATCH] 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. --- emacs.am | 1 + emacs/guix-backend.el | 24 +++++++++++++- emacs/guix-base.el | 62 +--------------------------------- emacs/guix-location.el | 72 ++++++++++++++++++++++++++++++++++++++++ emacs/guix-ui-package.el | 1 + 5 files changed, 98 insertions(+), 62 deletions(-) create mode 100644 emacs/guix-location.el diff --git a/emacs.am b/emacs.am index 1897e2e956..c0d294de9d 100644 --- a/emacs.am +++ b/emacs.am @@ -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 \ diff --git a/emacs/guix-backend.el b/emacs/guix-backend.el index 8afbc9ed48..6341aacae1 100644 --- a/emacs/guix-backend.el +++ b/emacs/guix-backend.el @@ -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) @@ -336,6 +336,28 @@ additional internal REPL if it exists." (interactive "P") (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 diff --git a/emacs/guix-base.el b/emacs/guix-base.el index 75d19cbfe0..888836428f 100644 --- a/emacs/guix-base.el +++ b/emacs/guix-base.el @@ -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 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 + +;; 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 . + +;;; 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 diff --git a/emacs/guix-ui-package.el b/emacs/guix-ui-package.el index 07bbd973e7..966fc9c5f6 100644 --- a/emacs/guix-ui-package.el +++ b/emacs/guix-ui-package.el @@ -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)