emacs: Add interface for package locations.

* emacs/guix-main.scm (%package-location-param-alist): New variable.
(package-location->sexp, package-location-entries): New procedures.
* emacs/guix-ui-location.el: New file.
* emacs.am (ELFILES): Add it.
* doc/emacs.texi (Emacs Package Locations): Document 'guix-locations'.
* NEWS: Mention it.
master
Alex Kost 2016-04-01 23:53:20 +03:00
parent b5e3cbbb24
commit b4b9975d4a
5 changed files with 109 additions and 0 deletions

6
NEWS
View File

@ -10,6 +10,12 @@ Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
Please send Guix bug reports to bug-guix@gnu.org. Please send Guix bug reports to bug-guix@gnu.org.
* Changes in 0.11.0 (since 0.10.0)
** Package management
*** New Emacs interface for package locations: M-x guix-locations
* Changes in 0.10.0 (since 0.9.0) * Changes in 0.10.0 (since 0.9.0)
** Community ** Community

View File

@ -556,6 +556,13 @@ get lost in these locations:
@table @kbd @table @kbd
@item M-x guix-locations
Display a list of package locations. You can press @key{RET} there to
display packages placed in the current location in the same way as
@kbd{M-x guix-packages-by-location} would do (@pxref{Emacs Commands}).
Note that when the point is on a location button, @key{RET} will open
this location file.
@item M-x guix-find-location @item M-x guix-find-location
Open the given package definition source file (press @key{TAB} to choose Open the given package definition source file (press @key{TAB} to choose
a location from a completion list). a location from a completion list).

View File

@ -49,6 +49,7 @@ ELFILES = \
emacs/guix-read.el \ emacs/guix-read.el \
emacs/guix-ui.el \ emacs/guix-ui.el \
emacs/guix-ui-license.el \ emacs/guix-ui-license.el \
emacs/guix-ui-location.el \
emacs/guix-ui-package.el \ emacs/guix-ui-package.el \
emacs/guix-ui-generation.el \ emacs/guix-ui-generation.el \
emacs/guix-ui-system-generation.el \ emacs/guix-ui-system-generation.el \

View File

@ -1127,3 +1127,15 @@ Return #t if the shell command was executed successfully."
(lambda () (lambda ()
"Return the list of file names of all package locations." "Return the list of file names of all package locations."
(force files))))) (force files)))))
(define %package-location-param-alist
`((id . ,identity)
(location . ,identity)
(number-of-packages . ,(lambda (location)
(length (packages-by-location-file location))))))
(define package-location->sexp
(object-transformer %package-location-param-alist))
(define (package-location-entries)
(map package-location->sexp (package-location-files)))

83
emacs/guix-ui-location.el Normal file
View File

@ -0,0 +1,83 @@
;;; guix-ui-location.el --- Interface for displaying 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 a 'list' interface for displaying locations of Guix
;; packages.
;;; Code:
(require 'guix-buffer)
(require 'guix-list)
(require 'guix-location)
(require 'guix-backend)
(guix-define-entry-type location)
(defun guix-location-get-entries ()
"Receive 'package location' entries."
(guix-eval-read "(package-location-entries)"))
;;; Location 'list'
(guix-list-define-interface location
:buffer-name "*Guix Package Locations*"
:get-entries-function 'guix-location-get-entries
:format '((location guix-location-list-file-name-specification 50 t)
(number-of-packages nil 10 guix-list-sort-numerically-1
:right-align t))
:sort-key '(location))
(let ((map guix-location-list-mode-map))
(define-key map (kbd "RET") 'guix-location-list-show-packages)
;; "Location Info" buffer is not defined (it would be useless), so
;; unbind "i" key (by default, it is used to display Info buffer).
(define-key map (kbd "i") nil))
(defun guix-location-list-file-name-specification (location &optional _)
"Return LOCATION button specification for `tabulated-list-entries'."
(list location
'face 'guix-list-file-name
'action (lambda (btn)
(guix-find-location (button-get btn 'location)))
'follow-link t
'help-echo (concat "Find location: " location)
'location location))
(declare-function guix-packages-by-location "guix-ui-package")
(defun guix-location-list-show-packages ()
"Display packages placed in the location at point."
(interactive)
(guix-packages-by-location (guix-list-current-id)))
;;; Interactive commands
;;;###autoload
(defun guix-locations ()
"Display locations of the Guix packages."
(interactive)
(guix-list-get-display-entries 'location))
(provide 'guix-ui-location)
;;; guix-ui-location.el ends here