summaryrefslogtreecommitdiff
path: root/guix/packages/emacs.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/packages/emacs.scm')
-rw-r--r--guix/packages/emacs.scm317
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