commit 2ed57a1dd15ad101eef0224de2012b8b18076582 from: mtmn date: Fri Sep 18 17:00:50 2026 UTC elpaca commit - df4f9a90cd60e528ac859ac15bc4d5ab82e0ea34 commit + 2ed57a1dd15ad101eef0224de2012b8b18076582 blob - 338b9576e618faa40c957c1bb568e08da1e8e83a blob + 885a085b0665945104bf71b8aab9c40b12ae86d5 --- .gitignore +++ .gitignore @@ -1,5 +1,6 @@ /eln-cache/ /elpaca/ +/quelpa/ /elpa/ /tree-sitter/ /auto-save-list/ blob - b3851ade4c8688896bcf33b41f8573b1bf5ecf68 blob + 84e9f0d6d6dc4df013f09f0b1bdd0962f9545b82 --- Makefile +++ Makefile @@ -3,7 +3,7 @@ EMACS ?= emacs MODULES := (append (directory-files "lisp" t "\\.el$$") (directory-files-recursively "plugins" "\\.el$$")) FILES := (append (list "early-init.el" "init.el") $(MODULES)) -.PHONY: checkdoc lint fmt clean update-lock +.PHONY: checkdoc lint fmt clean update checkdoc: $(EMACS) -Q --batch \ @@ -11,17 +11,18 @@ checkdoc: lint: checkdoc @tmp=$$(mktemp -d); trap 'rm -rf "$$tmp"' EXIT; \ - XDG_CACHE_HOME="$$tmp" $(EMACS) -Q --batch \ - --eval '(setq user-emacs-directory (file-name-as-directory default-directory))' \ - --load init.el \ - --eval '(let ((byte-compile-dest-file-function (lambda (f) (expand-file-name (concat (file-name-base f) ".elc") temporary-file-directory)))) (dolist (f $(MODULES)) (byte-compile-file f)))' + out=$$tmp/lint.log; \ + $(EMACS) -Q --batch -L lisp \ + --eval '(setq byte-compile-dest-file-function (lambda (f) (expand-file-name (concat (file-name-base f) ".elc") temporary-file-directory)))' \ + --eval '(require (quote use-package))' \ + --eval '(dolist (f $(MODULES)) (byte-compile-file f))' \ + --eval '(byte-compile-file "early-init.el")' \ + --eval '(byte-compile-file "init.el")' >"$$out" 2>&1; \ + grep -E "Error" "$$out" | grep -v "Failed to parse package" || true; \ + if grep -E "Error" "$$out" | grep -vq "Failed to parse package"; then exit 1; fi -update-lock: - @tmp=$$(mktemp -d); trap 'rm -rf "$$tmp"' EXIT; \ - XDG_CACHE_HOME="$$tmp" $(EMACS) -Q --batch \ - --eval '(setq user-emacs-directory (file-name-as-directory default-directory))' \ - --load init.el \ - --eval '(elpaca-write-lock-file elpaca-lock-file)' +update: + $(EMACS) --batch -l init.el --eval '(elpaca-fetch-all nil)' fmt: $(EMACS) -Q --batch \ @@ -31,4 +32,4 @@ fmt: clean: rm -f *.elc rm -rf eln-cache - find lisp plugins elpaca -name '*.elc' -delete + find lisp plugins -name '*.elc' -delete blob - 5bae3228064caf74e557146e85edd8c7490feebf blob + e48a1d171ec3e1f17046554dfbba6e86c5e856e2 --- early-init.el +++ early-init.el @@ -1,13 +1,16 @@ -;;; early-init.el --- Early startup tweaks -*- lexical-binding: t; -*- +;;; early-init.el --- Early start-up tweaks -*- lexical-binding: t; -*- ;;; Commentary: -;; Configure startup performance and package activation before `init.el'. +;; Performance and frame defaults applied before `init.el' loads. +;; Keep this file dependency free: no third-party packages here. ;;; Code: +(setq package-enable-at-startup nil) + (defvar mine--initial-file-name-handler-alist file-name-handler-alist - "Value of `file-name-handler-alist' before startup tuning.") + "Value of `file-name-handler-alist' before start-up tuning.") (setq-default indent-tabs-mode nil) @@ -16,7 +19,7 @@ file-name-handler-alist nil) (defun mine--restore-startup-defaults () - "Restore GC and `file-name-handler-alist' to runtime values." + "Restore GC and `file-name-handler-alist' for normal use." (setq gc-cons-threshold (* 128 1024 1024) gc-cons-percentage 0.1 file-name-handler-alist mine--initial-file-name-handler-alist)) @@ -34,12 +37,5 @@ (internal-border-width . 0) (undecorated . t)))) -(setq package-enable-at-startup nil) - -;; Emacs on macOS inherits a minimal PATH from launchd -(when (and window-system (not (bound-and-true-variable inside-emacs)) - (member system-type '(darwin gnu/linux))) - (exec-path-from-shell-initialize)) - (provide 'early-init) ;;; early-init.el ends here blob - e26bf8ce784b632a54431182e44f9cb312a1c5fc blob + ec146775082d6a9b8b275b18eb95710f198b02c1 --- init.el +++ init.el @@ -2,10 +2,20 @@ ;;; Commentary: -;; Bootstrap Elpaca and load the configuration libraries. +;; Bootstrap Elpaca, enable its `use-package' support, then load the +;; configuration modules in `lisp/'. ;;; Code: +(declare-function elpaca "elpaca" (order &rest body)) +(declare-function elpaca-wait "elpaca" ()) +(declare-function elpaca-process-queues "elpaca" (&optional arg)) +(declare-function elpaca-generate-autoloads "elpaca" (package dir)) +(declare-function elpaca-use-package-mode "elpaca-use-package" (&optional arg)) +(defvar elpaca-use-package) +(declare-function compile-angel-on-load-mode "compile-angel" (&optional arg)) +(defvar compile-angel-excluded-path-suffixes) + (defvar elpaca-installer-version 0.12) (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) (defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) @@ -14,7 +24,7 @@ :ref nil :depth 1 :inherit ignore :files (:defaults "elpaca-test.el" (:exclude "extensions")) :build (:not elpaca-activate))) -(let* ((repo (expand-file-name "elpaca/" elpaca-sources-directory)) +(let* ((repo (expand-file-name "elpaca/" elpaca-sources-directory)) (build (expand-file-name "elpaca/" elpaca-builds-directory)) (order (cdr elpaca-order)) (default-directory repo)) @@ -24,22 +34,15 @@ (when (<= emacs-major-version 28) (require 'subr-x)) (condition-case-unless-debug err (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) - ((zerop - (apply #'call-process - `("git" nil ,buffer t "clone" - ,@(when-let* ((depth (plist-get order :depth))) - (list (format "--depth=%d" depth) - "--no-single-branch")) - ,(plist-get order :repo) - ,repo)))) - ((zerop - (call-process "git" nil buffer t "checkout" - (or (plist-get order :ref) "--")))) + ((zerop (apply #'call-process `("git" nil ,buffer t "clone" + ,@(when-let* ((depth (plist-get order :depth))) + (list (format "--depth=%d" depth) "--no-single-branch")) + ,(plist-get order :repo) ,repo)))) + ((zerop (call-process "git" nil buffer t "checkout" + (or (plist-get order :ref) "--")))) (emacs (concat invocation-directory invocation-name)) - ((zerop - (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" - "--eval" - "(byte-recompile-directory \".\" 0 'force)"))) + ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" + "--eval" "(byte-recompile-directory \".\" 0 'force)"))) ((require 'elpaca)) ((elpaca-generate-autoloads "elpaca" repo))) (progn (message "%s" (buffer-string)) (kill-buffer buffer)) @@ -49,20 +52,15 @@ (require 'elpaca) (elpaca-generate-autoloads "elpaca" repo) (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) - - +(add-hook 'after-init-hook #'elpaca-process-queues) (elpaca `(,@elpaca-order)) (elpaca elpaca-use-package - (require 'elpaca-use-package) (elpaca-use-package-mode)) - (elpaca-wait) -(require 'use-package) - -(setopt use-package-expand-minimally t - elpaca-lock-file (expand-file-name "elpaca-lock.eld" user-emacs-directory) +(setopt use-package-always-ensure t + use-package-expand-minimally t evil-want-keybinding nil) ;; Do not let stale byte-code hide newer configuration source files. @@ -70,79 +68,21 @@ (add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory)) -(elpaca (compat :wait t)) -(elpaca (org :wait t)) -(elpaca (transient :wait t)) +(use-package compile-angel + :if (not (eq system-type 'darwin)) + :custom (compile-angel-verbose nil) + :config + (add-to-list 'compile-angel-excluded-path-suffixes "/init.el") + (add-to-list 'compile-angel-excluded-path-suffixes "/early-init.el") + (compile-angel-on-load-mode 1)) -(elpaca (compile-angel :wait t) - (require 'compile-angel) - (setopt compile-angel-verbose nil) - (add-to-list 'compile-angel-excluded-path-suffixes "/init.el") - (add-to-list 'compile-angel-excluded-path-suffixes "/early-init.el") - (unless (eq system-type 'darwin) (compile-angel-on-load-mode 1))) +;; Load configuration modules. +(mapc #'require '(setup-core setup-ui setup-evil setup-cmp setup-search + setup-treesitter setup-prog setup-eglot setup-git + setup-term-sessions setup-tramp-rpc setup-notes + setup-remind setup-gptel setup-pilish setup-popper + setup-keys)) -(elpaca-queue - (elpaca undo-fu-session) - (elpaca vundo) - (elpaca evil) - (elpaca evil-collection) - (elpaca evil-surround) - (elpaca evil-org) - (elpaca vertico) - (elpaca marginalia) - (elpaca orderless) - (elpaca embark) - (elpaca embark-consult) - (elpaca corfu) - (elpaca tempel) - (elpaca consult) - (elpaca wgrep) - (elpaca avy) - (elpaca ivy) - (elpaca swiper) - (elpaca nix-mode) - (elpaca zig-mode) - (elpaca markdown-mode) - (elpaca purescript-mode) - (elpaca clojure-mode) - (elpaca inf-clojure) - (elpaca sly) - (elpaca sly-asdf) - (elpaca sly-quicklisp) - (elpaca magit) - (elpaca diff-hl) - (elpaca vterm) - (elpaca denote-journal) - (elpaca denote-org) - (elpaca gptel) - (elpaca geiser) - (elpaca geiser-chez) - (elpaca tramp) - (elpaca doric-themes) - (elpaca ef-themes) - (elpaca fontaine) - (elpaca popper) - (elpaca (pilish :host github :repo "dnouri/pilish")) - (elpaca (pale :host codeberg :repo "monadicsheep/pale")) - (elpaca (tramp-rpc :host github :repo "ArthurHeymans/emacs-tramp-rpc" - :files ("lisp/*.el"))) - (elpaca (janet-ts-mode :host github :repo "sogaiu/janet-ts-mode")) - (elpaca (term-sessions :host github :repo "ArthurHeymans/emacs-term-sessions"))) - -(elpaca-wait) - -(defconst mine-modules - '(setup-core setup-ui setup-evil setup-cmp setup-search setup-treesitter setup-prog - setup-eglot setup-git setup-shell setup-term-sessions setup-tramp-rpc - setup-notes setup-remind setup-gptel setup-pilish setup-popper setup-keys) - "Configuration libraries loaded during startup.") - -(dolist (module mine-modules) - (require module)) - -(elpaca-process-queues) -(elpaca-wait) - (defvar mine-cache-directory) (setopt custom-file (expand-file-name "custom.el" mine-cache-directory)) blob - 2c7dd225dfc76fae1a2c6fbe90e74fdeaed90346 blob + 578f6e2caf6d8ef3e5d036306eab628768c34277 --- lisp/setup-cmp.el +++ lisp/setup-cmp.el @@ -22,7 +22,8 @@ (keymap-set minibuffer-mode-map "TAB" #'minibuffer-complete) (use-package vertico - :init + :demand t + :config (vertico-mode) :bind (:map vertico-map ("M-DEL" . vertico-directory-delete-word))) @@ -43,7 +44,8 @@ :after (embark consult)) (use-package corfu - :init + :demand t + :config (global-corfu-mode) :bind (:map corfu-map ("SPC" . corfu-insert-separator) @@ -54,6 +56,7 @@ ("C-f" . corfu-scroll-up))) (use-package corfu-popupinfo + :ensure nil :after corfu :hook (corfu-mode . corfu-popupinfo-mode) :bind (:map corfu-popupinfo-map blob - 1a40ca0a0444e97c80361001b335b4733ae798d6 blob + f87bcee1a8abab7df6bdd35448a7eb6d8c57ac1b --- lisp/setup-core.el +++ lisp/setup-core.el @@ -2,12 +2,12 @@ ;;; Commentary: -;; Configure filesystem paths, persistent state, and core Emacs services. +;; Filesystem paths, persistent state, and core Emacs services. ;;; Code: -(require 'subr-x) ; string-remove-prefix (require 'savehist) +(require 'subr-x) (declare-function undo-fu-session-global-mode "undo-fu-session" (&optional arg)) @@ -83,9 +83,9 @@ mirrored path as relative; its parent directories are (add-to-list 'savehist-additional-variables 'mine-last-theme) -(savehist-mode 1) +(savehist-mode t) -(recentf-mode 1) +(recentf-mode t) (setopt auto-revert-avoid-polling t auto-revert-interval 5 blob - 6e18cc90a812083a3fd782d3041a57593797377a blob + d9c629809ae8756f3cbecd19f19e61c9de5b248b --- lisp/setup-evil.el +++ lisp/setup-evil.el @@ -6,6 +6,9 @@ ;;; Code: +(eval-when-compile + (require 'evil nil t)) + (declare-function evil-mode "evil" (&optional arg)) (declare-function evil-insert-state "evil" (&optional arg)) (declare-function evil-set-initial-state "evil" (mode state)) @@ -47,18 +50,18 @@ (kbd "gv") #'avy-goto-line)) (use-package avy + :ensure nil :after evil :config (defun mine-avy-char-jump (char beg end &optional post) - "Avy-jump to CHAR between BEG and END, then move point by POST." + "Jump to CHAR between BEG and END, then move by POST." (let* ((regex (if (= char 13) "\n" (regexp-quote (string char)))) (cands (avy--regex-candidates regex beg end)) (pt (point))) (cond ((null cands) (user-error "No matches for `%c'" char)) - ;; Single candidate: jump without showing the decision tree. ((null (cdr cands)) (goto-char (car cands))) - (t (avy-jump regex :beg beg :end end))) + ((avy-jump regex :beg beg :end end))) (when (and post (/= (point) pt)) (forward-char post)))) (evil-define-motion mine-avy-f (_count) blob - 3bcb4b3f6fcddc8d102b5d98860e42a5009c511f blob + d525da5a128ee83330ab1f1316ec858fb6eacc26 --- lisp/setup-pilish.el +++ lisp/setup-pilish.el @@ -8,6 +8,7 @@ ;;; Code: (use-package pilish + :ensure (:host github :repo "dnouri/pilish") :custom (pilish-executable '("pisol" "pi" "--offline")) :custom-face blob - 97c2723ada2dde20c582bae4a0346927b676ff9d blob + fae55202b7b8a81eadf0938f240b8f8d1436357a --- lisp/setup-prog.el +++ lisp/setup-prog.el @@ -9,7 +9,7 @@ (declare-function sly-setup "sly" (&optional contribs)) (defvar sly-mode-map) -(setopt treesit-font-lock-level 4) +(setq treesit-font-lock-level 4) (dolist (entry '(("\\.go\\'" . go-ts-mode) ("/go\\.mod\\'" . go-mod-ts-mode) @@ -69,7 +69,10 @@ ("C-c C-d C-s" . sly-describe-symbol) ("C-c C-d C-a" . sly-apropos)) :config - (sly-setup '(sly-fancy sly-quicklisp sly-asdf))) + (unless noninteractive + (condition-case err + (sly-setup '(sly-fancy sly-quicklisp sly-asdf)) + (error (message "sly-setup failed: %s" (error-message-string err)))))) ;; Chez / Scheme support via Geiser (dolist (entry '(("\\.ss\\'" . scheme-mode) blob - 03e2d2ba5a9b01753d5b7995cb88b1c25a0bf489 blob + b2ae5236bf2102d55e4aff3066848a52930adac0 --- lisp/setup-search.el +++ lisp/setup-search.el @@ -12,6 +12,10 @@ (declare-function evil-define-key "evil" (state map key def &rest bindings)) (declare-function consult-grep "consult" (&optional dir initial)) (declare-function consult-ripgrep "consult" (&optional dir initial)) +(declare-function swiper "swiper" (&optional initial)) +(declare-function swiper-avy "swiper" ()) +(declare-function ivy-resume "ivy" ()) +(defvar swiper-map) (defun mine-consult-project-search (&optional dir initial) "Search DIR with ugrep through Consult, falling back to ripgrep. blob - 4b8fc6aafc37333cdc80bef5b9b3a2f7666d6617 blob + ada079107721d4e09bd59a6a3fbbc35c868dc86e --- lisp/setup-shell.el +++ lisp/setup-shell.el @@ -16,6 +16,15 @@ :ensure nil :hook (eshell-mode . mine-eshell-setup)) +(use-package eat + :ensure (eat :repo "https://codeberg.org/akib/emacs-eat" + :files ("*.el" ("term" "term/*.el") "*.texi" + "*.ti" ("terminfo/e" "terminfo/e/*") + ("terminfo/65" "terminfo/65/*") + ("integration" "integration/*") + (:exclude ".dir-locals.el" "*-tests.el"))) + :commands (eat eat-project)) + (use-package vterm :commands vterm) blob - 9630ddbf41a8738609e6b7ecd6d2156016a7f66d blob + 86be0e8d66338bbf57bff23465cef56c2eb8a405 --- lisp/setup-term-sessions.el +++ lisp/setup-term-sessions.el @@ -6,12 +6,10 @@ ;;; Code: -(eval-when-compile - (require 'use-package)) - (use-package term-sessions + :ensure (:host github :repo "ArthurHeymans/emacs-term-sessions") :custom - (term-sessions-preferred-frontend 'vterm)) + (term-sessions-preferred-frontend 'eat)) (provide 'setup-term-sessions) ;;; setup-term-sessions.el ends here blob - c5db4881c0badeca12512395c4c29b37ab2f922c blob + 04d426a24d0644987eeea10817e589e4797eebc0 --- lisp/setup-tramp-rpc.el +++ lisp/setup-tramp-rpc.el @@ -10,7 +10,8 @@ (require 'tramp) (use-package tramp-rpc - :ensure nil + :ensure (:host github :repo "ArthurHeymans/emacs-tramp-rpc" + :files ("lisp/*.el")) :after tramp :custom (tramp-rpc-deploy-auto-deploy t) blob - ead42476f0755ce2dd1a6cb7f8ea1d58c6d4b0a5 blob + 33acad841d563f3024c91301e5b9afd4bc12c5f7 --- lisp/setup-ui.el +++ lisp/setup-ui.el @@ -7,6 +7,10 @@ ;;; Code: (declare-function mine-cache-file "setup-core" (name)) +(declare-function fontaine-mode "fontaine" (&optional arg)) +(declare-function fontaine-set-preset "fontaine" (preset)) +(declare-function fontaine-restore-latest-preset "fontaine" ()) +(defvar mine-last-theme) (setopt initial-major-mode 'fundamental-mode inhibit-startup-screen t @@ -32,31 +36,30 @@ :demand t :config (setopt fontaine-latest-state-file (mine-cache-file "fontaine-state.eld") - fontaine-presets - '((inconsolata - :default-family "Inconsolata" - :default-weight medium - :default-height 160) - (terminusa :default-family "Terminusa" :default-height 120) - (proto :default-family "0xProto" :default-height 120) - (proto-hidpi - :inherit proto - :default-height 180) - (unifont :default-family "UnifontExMono" :default-height 120) - (uw :default-family "Ttyp0 OTB" :default-height 130) - (go :default-family "Go Mono" :default-height 140) - (dsm :default-family "Droid Sans Mono Dotted" :default-height 120) - (sudo :default-family "Sudo" :default-height 160) - (pp :default-family "PragmataPro" :default-height 140) - (fm :default-family "Fragment Mono" :default-height 120) - (cc :default-family "Comic Code" :default-height 120) - (cc16 - :inherit cc - :default-height 160) - (fsm :default-family "Fantasque Sans Mono" :default-height 140) - (ioskeley :default-family "Ioskeley Mono Term" :default-height 120) - (input :default-family "Input Mono" :default-height 110) - (cl :default-family "Codelia" :default-height 120))) + fontaine-presets '((inconsolata + :default-family "Inconsolata" + :default-weight medium + :default-height 160) + (terminusa :default-family "Terminusa" :default-height 120) + (proto :default-family "0xProto" :default-height 120) + (proto-hidpi + :inherit proto + :default-height 180) + (unifont :default-family "UnifontExMono" :default-height 120) + (uw :default-family "Ttyp0 OTB" :default-height 130) + (go :default-family "Go Mono" :default-height 140) + (dsm :default-family "Droid Sans Mono Dotted" :default-height 120) + (sudo :default-family "Sudo" :default-height 160) + (pp :default-family "PragmataPro" :default-height 140) + (fm :default-family "Fragment Mono" :default-height 120) + (cc :default-family "Comic Code" :default-height 120) + (cc16 + :inherit cc + :default-height 160) + (fsm :default-family "Fantasque Sans Mono" :default-height 140) + (ioskeley :default-family "Ioskeley Mono Term" :default-height 120) + (input :default-family "Input Mono" :default-height 110) + (cl :default-family "Codelia" :default-height 120))) (fontaine-mode 1) (fontaine-set-preset (or (fontaine-restore-latest-preset) @@ -96,6 +99,9 @@ (load-theme 'eziam-dark t) (error (load-theme 'ef-night t)))) +(use-package doric-themes + :ensure (:host github :repo "protesilaos/doric-themes")) + (use-package ef-themes :if (display-graphic-p) :demand t