diff options
Diffstat (limited to 'guix/packages/emacs.scm')
-rw-r--r-- | guix/packages/emacs.scm | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/guix/packages/emacs.scm b/guix/packages/emacs.scm new file mode 100644 index 0000000..24d0e2e --- /dev/null +++ b/guix/packages/emacs.scm @@ -0,0 +1,317 @@ +(define-module (packages emacs) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (guix gexp) + #:use-module (guix download) + #:use-module (guix git-download) + #:use-module (guix build-system) + #:use-module (guix build-system gnu) + #:use-module (guix build-system glib-or-gtk) + #:use-module (gnu packages) + #:use-module (gnu packages acl) + #:use-module (gnu packages autotools) + #:use-module (gnu packages base) + #:use-module (gnu packages bash) + #:use-module (gnu packages compression) + #:use-module (gnu packages fontutils) + #:use-module (gnu packages freedesktop) + #:use-module (gnu packages fribidi) + #:use-module (gnu packages gawk) + #:use-module (gnu packages gcc) + #:use-module (gnu packages gd) + #:use-module (gnu packages gettext) + #:use-module (gnu packages ghostscript) + #:use-module (gnu packages glib) + #:use-module (gnu packages gnome) ; for librsvg + #:use-module (gnu packages gtk) + #:use-module (gnu packages guile) + #:use-module (gnu packages image) + #:use-module (gnu packages lesstif) ; motif + #:use-module (gnu packages linux) ; alsa-lib, gpm + #:use-module (gnu packages mail) ; for mailutils + #:use-module (gnu packages multiprecision) + #:use-module (gnu packages ncurses) + #:use-module (gnu packages pdf) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages selinux) + #:use-module (gnu packages sqlite) + #:use-module (gnu packages texinfo) + #:use-module (gnu packages tls) + #:use-module (gnu packages tree-sitter) + #:use-module (gnu packages web) ; for jansson + #:use-module (gnu packages webkit) + #:use-module (gnu packages xml) + #:use-module (gnu packages xorg) + #:use-module (guix utils) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (gnu packages emacs)) + +(define-public emacs-minimal + (package + (name "emacs-minimal") + (version "29.4") + ;; Note: When using (replacement …), ensure that comp-native-version-dir + ;; stays the same across grafts. + ;; Run `make check-system TESTS=emacs-native-comp' to ensure that grafts + ;; can meaningfully be applied. + (source (origin + (method url-fetch) + (uri (string-append "mirror://gnu/emacs/emacs-" + version ".tar.xz")) + (sha256 + (base32 + "0dd2mh6maa7dc5f49qdzj7bi4hda4wfm1cvvgq560djcz537k2ds")) + (patches (search-patches "emacs-disable-jit-compilation.patch" + "emacs-exec-path.patch" + "emacs-fix-scheme-indent-function.patch" + "emacs-native-comp-driver-options.patch" + "emacs-native-comp-fix-filenames.patch" + "emacs-native-comp-pin-packages.patch" + "emacs-pgtk-super-key-fix.patch")) + (modules '((guix build utils))) + (snippet + '(with-directory-excursion "lisp" + ;; Delete the bundled byte-compiled elisp files and generated + ;; autoloads. + (for-each delete-file + (append (find-files "." "\\.elc$") + (find-files "." "loaddefs\\.el$") + (find-files "eshell" "^esh-groups\\.el$"))) + + ;; Make sure Tramp looks for binaries in the right places on + ;; remote Guix System machines, where 'getconf PATH' returns + ;; something bogus. + (substitute* "net/tramp.el" + ;; Patch the line after "(defcustom tramp-remote-path". + (("\\(tramp-default-remote-path") + (format #f "(tramp-default-remote-path ~s ~s ~s ~s " + "~/.guix-profile/bin" "~/.guix-profile/sbin" + "/run/current-system/profile/bin" + "/run/current-system/profile/sbin"))) + + ;; Make sure Man looks for C header files in the right + ;; places. + (substitute* "man.el" + (("\"/usr/local/include\"" line) + (string-join + (list line + "\"~/.guix-profile/include\"" + "\"/var/guix/profiles/system/profile/include\"") + " "))))))) + (build-system gnu-build-system) + (arguments + (list + #:tests? #f ; no check target + #:modules (%emacs-modules build-system) + #:configure-flags #~(list "--with-gnutls=no" "--disable-build-details") + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'enable-elogind + (lambda _ + (substitute* "configure.ac" + (("libsystemd") "libelogind")) + (when (file-exists? "configure") + (delete-file "configure")))) + (add-after 'unpack 'patch-program-file-names + (lambda* (#:key inputs #:allow-other-keys) + ;; Substitute "sh" command. + (substitute* '("src/callproc.c" + "lisp/term.el" + "lisp/htmlfontify.el" + "lisp/mail/feedmail.el" + "lisp/obsolete/pgg-pgp.el" + "lisp/obsolete/pgg-pgp5.el" + "lisp/obsolete/terminal.el" + "lisp/org/ob-eval.el" + "lisp/textmodes/artist.el" + "lisp/progmodes/sh-script.el" + "lisp/textmodes/artist.el" + "lisp/htmlfontify.el" + "lisp/term.el") + (("\"/bin/sh\"") + (format #f "~s" (search-input-file inputs "bin/sh")))) + (substitute* '("lisp/gnus/mm-uu.el" + "lisp/gnus/nnrss.el" + "lisp/mail/blessmail.el") + (("\"#!/bin/sh\\\n\"") + (format #f "\"#!~a~%\"" (search-input-file inputs "bin/sh")))) + (substitute* '("lisp/jka-compr.el" + "lisp/man.el") + (("\"sh\"") + (format #f "~s" (search-input-file inputs "bin/sh")))) + + ;; Substitute "awk" command. + (substitute* '("lisp/gnus/nnspool.el" + "lisp/org/ob-awk.el" + "lisp/man.el") + (("\"awk\"") + (format #f "~s" (search-input-file inputs "bin/awk")))) + + ;; Substitute "find" command. + (substitute* '("lisp/gnus/gnus-search.el" + "lisp/obsolete/nnir.el" + "lisp/progmodes/executable.el" + "lisp/progmodes/grep.el" + "lisp/filecache.el" + "lisp/ldefs-boot.el" + "lisp/mpc.el") + (("\"find\"") + (format #f "~s" (search-input-file inputs "bin/find")))) + + ;; Substitute "sed" command. + (substitute* "lisp/org/ob-sed.el" + (("org-babel-sed-command \"sed\"") + (format #f "org-babel-sed-command ~s" + (search-input-file inputs "bin/sed")))) + (substitute* "lisp/man.el" + (("Man-sed-command \"sed\"") + (format #f "Man-sed-command ~s" + (search-input-file inputs "bin/sed")))) + + (substitute* "lisp/doc-view.el" + (("\"(gs|dvipdf|ps2pdf|pdftotext)\"" all what) + (let ((replacement (false-if-exception + (search-input-file + inputs + (string-append "/bin/" what))))) + (if replacement + (string-append "\"" replacement "\"") + all)))) + ;; match ".gvfs-fuse-daemon-real" and ".gvfsd-fuse-real" + ;; respectively when looking for GVFS processes. + (substitute* "lisp/net/tramp-gvfs.el" + (("\\(tramp-compat-process-running-p \"(.*)\"\\)" all process) + (format #f "(or ~a (tramp-compat-process-running-p ~s))" + all (string-append "." process "-real")))))) + (add-before 'configure 'fix-/bin/pwd + (lambda _ + ;; Use `pwd', not `/bin/pwd'. + (substitute* (find-files "." "^Makefile\\.in$") + (("/bin/pwd") + "pwd")))) + (add-after 'install 'install-site-start + ;; Use 'guix-emacs' in "site-start.el", which is used autoload the + ;; Elisp packages found in EMACSLOADPATH. + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (lisp-dir (string-append out "/share/emacs/site-lisp")) + (emacs (string-append out "/bin/emacs"))) + + ;; This is duplicated from emacs-utils to prevent coupling. + (define* (emacs-byte-compile-directory dir) + (let ((expr `(progn + (setq byte-compile-debug t) + (byte-recompile-directory + (file-name-as-directory ,dir) 0 1)))) + (invoke emacs "--quick" "--batch" + (format #f "--eval=~s" expr)))) + + (copy-file #$(local-file + (search-auxiliary-file "emacs/guix-emacs.el")) + (string-append lisp-dir "/guix-emacs.el")) + (with-output-to-file (string-append lisp-dir "/site-start.el") + (lambda () + (display + (string-append + "(when (require 'guix-emacs nil t)\n" + " (guix-emacs-autoload-packages 'no-reload)\n" + " (advice-add 'package-load-all-descriptors" + " :after #'guix-emacs-load-package-descriptors))")))) + ;; Remove the extraneous subdirs.el file, as it causes Emacs to + ;; add recursively all the the sub-directories of a profile's + ;; share/emacs/site-lisp union when added to EMACSLOADPATH, + ;; which leads to conflicts. + (delete-file (string-append lisp-dir "/subdirs.el")) + ;; Byte compile the site-start files. + (emacs-byte-compile-directory lisp-dir)))) + (add-after 'install 'wrap-emacs-paths + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (lisp-dirs (find-files (string-append out "/share/emacs") + "^lisp$" + #:directories? #t))) + (for-each + (lambda (prog) + (wrap-program prog + ;; Some variants rely on uname being in PATH for Tramp. + ;; Tramp paths can't be hardcoded, because they need to + ;; be portable. + `("PATH" suffix + ,(map dirname + (list (search-input-file inputs "/bin/gzip") + ;; for coreutils + (search-input-file inputs "/bin/yes")))) + `("EMACSLOADPATH" suffix ,lisp-dirs))) + (find-files (string-append out "/bin") + ;; Matches versioned and unversioned emacs binaries. + ;; We don't patch emacsclient, because it takes its + ;; environment variables from emacs. + ;; Likewise, we don't need to patch helper binaries + ;; like etags, ctags or ebrowse. + "^emacs(-[0-9]+(\\.[0-9]+)*)?$"))))) + (add-after 'wrap-emacs-paths 'undo-double-wrap + (lambda* (#:key outputs #:allow-other-keys) + ;; Directly copy emacs-X.Y to emacs, so that it is not wrapped + ;; twice. This also fixes a minor issue, where WMs would not be + ;; able to track emacs back to emacs.desktop. + (with-directory-excursion (assoc-ref outputs "out") + (copy-file + (car (find-files "bin" "^emacs-([0-9]+\\.)+[0-9]+$")) + "bin/emacs"))))))) + (inputs (list bash-minimal coreutils findutils gawk gzip ncurses sed)) + (native-inputs (list autoconf pkg-config texinfo)) + (home-page "https://www.gnu.org/software/emacs/") + (synopsis "The extensible text editor (minimal build for byte-compilation)") + (description + "GNU Emacs is an extensible and highly customizable text editor. It is +based on an Emacs Lisp interpreter with extensions for text editing. Emacs +has been extended in essentially all areas of computing, giving rise to a +vast array of packages supporting, e.g., email, IRC and XMPP messaging, +spreadsheets, remote server editing, and much more. Emacs includes extensive +documentation on all aspects of the system, from basic editing to writing +large Lisp programs. It has full Unicode support for nearly all human +languages.") + (license license:gpl3+) + (native-search-paths + (list (search-path-specification + (variable "EMACSLOADPATH") + (files '("share/emacs/site-lisp"))) + (search-path-specification + (variable "EMACSNATIVELOADPATH") + (files '("lib/emacs/native-site-lisp"))) + (search-path-specification + (variable "INFOPATH") + (files '("share/info"))) + ;; Most variants support tree-sitter, so let's include it here. + (search-path-specification + (variable "TREE_SITTER_GRAMMAR_PATH") + (files '("lib/tree-sitter"))))) + (properties `((upstream-name . "emacs"))))) + +(define-public thanos/emacs-next-minimal + (let ((commit "881d593a9879f3355733f1b627af7cc0c12b429e") + (revision "0")) + (package + (inherit emacs-minimal) + (name "emacs-next-minimal") + (version (git-version "30.0.92" revision commit)) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://git.savannah.gnu.org/git/emacs.git") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0nj3a7wsl5piqf6a8wnmfyjbpxp2dwl0r48flv9q624jx4nxfr2p")) + (patches + (search-patches "emacs-disable-jit-compilation.patch" + "emacs-next-exec-path.patch" + "emacs-fix-scheme-indent-function.patch" + "emacs-next-native-comp-driver-options.patch" + "emacs-next-native-comp-fix-filenames.patch" + "emacs-native-comp-pin-packages.patch" + "emacs-pgtk-super-key-fix.patch"))))))) + +thanos/emacs-next-minimal |