guix/gnu/packages/aux-files/emacs/guix-emacs.el
Maxim Cournoyer 47b3b4c2aa
gnu: emacs: Adapt the autoloads auxiliary code to use EMACSLOADPATH.
The Elisp directories to scan for autoloads are now taken from EMACSLOADPATH
instead of from the user profile, environment profile or system profile.
Manually adding the Elisp directories to the `load-path' is no longer
necessary, as this is covered by Emacs when they are in EMACSLOADPATH.  The
caching logic is also removed, as this code is not typically run often and the
gain is marginal (loading autoloads files is cheap).

* gnu/packages/aux-files/emacs/guix-emacs.el (guix-emacs-directory)
(guix-emacs-subdirs, guix-emacs-directories): Remove procedures.
(guix-emacs-find-autoloads): Filter the directory entries by passing the
regexp to `directory-files' directly, which is ten times faster.  Remove
deduplication.
(guix-emacs-autoloads-regexp): Remove the group, which used to filter out the
file extension; it no longer works this way due to passing the regexp to the
`directory-files' procedure directly, which doesn't care about groups.
(guix-emacs-autoload-packages): Update doc.  Search package directories from
EMACSLOADPATH.  Do not populate the load-path.  Remove cache.
2019-11-18 14:34:41 +09:00

66 lines
2.4 KiB
EmacsLisp

;;; guix-emacs.el --- Emacs packages installed with Guix
;; Copyright © 2014, 2015, 2016, 2017 Alex Kost <alezost@gmail.com>
;; Copyright © 2017 Kyle Meyer <kyle@kyleam.com>
;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@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 License as published by
;; the Free Software Foundation, either version 3 of the License, 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 License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides auxiliary code to autoload Emacs packages
;; installed with Guix.
;;; Code:
(require 'seq)
(defvar guix-emacs-autoloads-regexp
(rx (* any) "-autoloads.el" (zero-or-one "c") string-end)
"Regexp to match Emacs 'autoloads' file.")
(defun guix-emacs-find-autoloads (directory)
"Return a list of Emacs 'autoloads' files in DIRECTORY.
The files in the list do not have extensions (.el, .elc)."
;; `directory-files' doesn't honor group in regexp.
(mapcar #'file-name-sans-extension
(directory-files directory 'full-name guix-emacs-autoloads-regexp)))
;;;###autoload
(defun guix-emacs-autoload-packages ()
"Autoload Emacs packages found in EMACSLOADPATH.
'Autoload' means to load the 'autoloads' files matching
`guix-emacs-autoloads-regexp'."
;; FIXME: The autoloads generated by the emacs-build-system are not byte
;; compiled.
(interactive)
(let* ((emacs-load-path (getenv "EMACSLOADPATH"))
(emacs-non-core-load-path-directories
;; Filter out core Elisp directories, which are already autoloaded
;; by Emacs.
(seq-filter (lambda (dir)
(string-match-p "/share/emacs/site-lisp" dir))
(split-string emacs-load-path ":")))
(autoloads (mapcan #'guix-emacs-find-autoloads
emacs-non-core-load-path-directories)))
(mapc (lambda (f)
(load f 'noerror))
autoloads)))
(provide 'guix-emacs)
;;; guix-emacs.el ends here