commit - df4f9a90cd60e528ac859ac15bc4d5ab82e0ea34
commit + 2ed57a1dd15ad101eef0224de2012b8b18076582
blob - 338b9576e618faa40c957c1bb568e08da1e8e83a
blob + 885a085b0665945104bf71b8aab9c40b12ae86d5
--- .gitignore
+++ .gitignore
/eln-cache/
/elpaca/
+/quelpa/
/elpa/
/tree-sitter/
/auto-save-list/
blob - b3851ade4c8688896bcf33b41f8573b1bf5ecf68
blob + 84e9f0d6d6dc4df013f09f0b1bdd0962f9545b82
--- Makefile
+++ Makefile
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 \
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 \
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
-;;; 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)
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))
(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
;;; 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))
: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))
(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))
(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.
(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
(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)))
:after (embark consult))
(use-package corfu
- :init
+ :demand t
+ :config
(global-corfu-mode)
:bind (:map corfu-map
("SPC" . corfu-insert-separator)
("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
;;; 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))
(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
;;; 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))
(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
;;; 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
(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)
("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
(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
: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
;;; 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
(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
;;; 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
: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)
(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