Commit Diff


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