diff --git a/gnu/packages/aux-files/emacs/guix-emacs.el b/gnu/packages/aux-files/emacs/guix-emacs.el index 9a49e8861c..46ee557f20 100644 --- a/gnu/packages/aux-files/emacs/guix-emacs.el +++ b/gnu/packages/aux-files/emacs/guix-emacs.el @@ -2,6 +2,7 @@ ;; Copyright © 2014, 2015, 2016, 2017 Alex Kost ;; Copyright © 2017 Kyle Meyer +;; Copyright © 2019 Maxim Cournoyer ;; This file is part of GNU Guix. @@ -24,91 +25,40 @@ ;; installed with Guix. ;;; Code: - -(require 'cl-lib) - -(defvar guix-user-profile (expand-file-name "~/.guix-profile")) - -(defvar guix-emacs-autoloads nil - "List of the last loaded Emacs autoloads.") +(require 'seq) (defvar guix-emacs-autoloads-regexp - (rx (group (* any) "-autoloads") - ".el" (zero-or-one "c") string-end) + (rx (* any) "-autoloads.el" (zero-or-one "c") string-end) "Regexp to match Emacs 'autoloads' file.") -(defun guix-emacs-directory (&optional profile) - "Return directory with Emacs packages installed in PROFILE. -If PROFILE is nil, use `guix-user-profile'." - (expand-file-name "share/emacs/site-lisp" - (or profile guix-user-profile))) - (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)." - (cl-remove-duplicates - (delq nil - (mapcar (lambda (file) - (when (string-match guix-emacs-autoloads-regexp file) - (match-string 1 file))) - (directory-files directory 'full-name nil 'no-sort))) - :test #'string=)) - -(defun guix-emacs-subdirs (directory) - "Return list of DIRECTORY subdirectories." - (cl-remove-if (lambda (file) - (or (string-match-p (rx "/." string-end) file) - (string-match-p (rx "/.." string-end) file) - (not (file-directory-p file)))) - (directory-files directory 'full-name nil 'no-sort))) - -(defun guix-emacs-directories (&optional profile) - "Return the list of directories under PROFILE that contain Emacs packages. -This includes both `share/emacs/site-lisp/guix.d/PACKAGE' -sub-directories and `share/emacs/site-lisp' itself. - -If PROFILE is nil, use `guix-user-profile'. -Return nil, if Emacs packages are not installed in PROFILE." - (let ((root-dir (guix-emacs-directory (or profile guix-user-profile)))) - (when (file-directory-p root-dir) - (let* ((pkgs-dir (expand-file-name "guix.d" root-dir)) - (pkgs-dirs (when (file-directory-p pkgs-dir) - (guix-emacs-subdirs pkgs-dir)))) - (cons root-dir pkgs-dirs))))) + ;; `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 (&rest profiles) - "Autoload Emacs packages installed in PROFILES. -If PROFILES are not specified, use a default user and system -profiles. +(defun guix-emacs-autoload-packages () + "Autoload Emacs packages found in EMACSLOADPATH. -'Autoload' means add directories with Emacs packages to -`load-path' and load 'autoloads' files matching +'Autoload' means to load the 'autoloads' files matching `guix-emacs-autoloads-regexp'." - (interactive (list (if (fboundp 'guix-read-package-profile) - (funcall 'guix-read-package-profile) - guix-user-profile))) - (let* ((env (getenv "GUIX_ENVIRONMENT")) - (profiles (or profiles - (append (list "/run/current-system/profile" - guix-user-profile) - (and env (list env)))))) - (dolist (profile profiles) - (let ((dirs (guix-emacs-directories profile))) - (when dirs - (let* ((autoloads (cl-mapcan #'guix-emacs-find-autoloads - dirs)) - (new-autoloads (cl-nset-difference autoloads - guix-emacs-autoloads - :test #'string=))) - (dolist (dir dirs) - (cl-pushnew (directory-file-name dir) - load-path - :test #'string=)) - (dolist (file new-autoloads) - (load file 'noerror)) - (setq guix-emacs-autoloads - (append new-autoloads guix-emacs-autoloads)))))))) + ;; 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)