commit 7fe84613ee54f63fc09d06906077b0852a27d2bd parent d714a77b8d1dd7ece2a941d86c4ec67e10cfcd92 Author: mtmn <miro@haravara.org> Date: Thu, 21 May 2026 13:18:48 +0200 dotfiles: add emacs, the holiest of the editors Diffstat:
17 files changed, 372 insertions(+), 1 deletion(-)
diff --git a/hosts/void/overlays/config/magdalena/config.json.nix b/hosts/void/overlays/config/magdalena/config.json.nix Binary files differ. diff --git a/hosts/void/overlays/config/river/init b/hosts/void/overlays/config/river/init @@ -127,6 +127,7 @@ riverctl map normal $mod+Shift Tab send-to-previous-tags swaybg -m fill -c "#120d15" -i "$HOME/misc/random/wallpapers/16.jpg" & mkfifo "$wobsock" && tail -f "$wobsock" | wob & wl-paste --watch cliphist store & +emacs --daemon & services_to_start=( battery-notify diff --git a/modules/mixins/dotfiles/config/emacs/early-init.el b/modules/mixins/dotfiles/config/emacs/early-init.el @@ -0,0 +1,11 @@ +;;; early-init.el + +(push '(menu-bar-lines . 0) default-frame-alist) +(push '(tool-bar-lines . 0) default-frame-alist) +(push '(vertical-scroll-bars) default-frame-alist) +(push '(left-fringe . 8) default-frame-alist) +(push '(right-fringe . 8) default-frame-alist) + +(when (featurep 'native-compile) + (setq native-comp-jit-compilation t)) +;;; early-init.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/init.el b/modules/mixins/dotfiles/config/emacs/init.el @@ -0,0 +1,49 @@ +;;; init.el + +(require 'package) +(setq package-archives '(("melpa" . "https://melpa.org/packages/") + ("gnu" . "https://elpa.gnu.org/packages/") + ("nongnu" . "https://elpa.nongnu.org/packages/")) + package-install-upgrade-built-in t) +(package-initialize) + +(unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) + +(require 'use-package) +(setq use-package-always-ensure t) + +(add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory)) + +(require 'edit) +(require 'cmp) +(require 'fmt) +(require 'git) +(require 'ui) +(require 'go) +(require 'lsp) +(require 'zig) +(require 'rust) +(require 'misc) +(require 'meow-init) + +(setq-default indent-tabs-mode nil + tab-width 2 + fill-column 100) + +(setq make-backup-files nil + auto-save-default nil + undo-limit (* 10 1000000) + confirm-kill-processes nil + enable-recursive-minibuffers t + read-process-output-max (* 4 1024) + auto-save-list-file-prefix (expand-file-name "auto-save-list/" "~/.cache/emacs")) + +(global-auto-revert-mode 1) +(savehist-mode 1) +(recentf-mode 1) +(winner-mode 1) + +(provide 'init) +;;; init.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/cmp.el b/modules/mixins/dotfiles/config/emacs/lisp/cmp.el @@ -0,0 +1,35 @@ +;;; cmp.el + +(use-package vertico + :config + (vertico-mode 1) + (setq vertico-cycle t)) + +(use-package orderless + :init + (setq completion-styles '(orderless basic) + completion-category-defaults nil)) + +(use-package marginalia + :config + (marginalia-mode 1)) + +(use-package consult + :config + (setq consult-project-function + (lambda (_) (locate-dominating-file default-directory ".git")))) + +(use-package embark + :bind ("C-." . embark-act) + :config + (setq embark-prompter 'embark-completing-read-prompter)) + +(use-package embark-consult + :after (embark consult) + :hook (embark-collect-mode . embark-consult-preview-minor-mode)) + +(when (fboundp 'global-completion-preview-mode) + (global-completion-preview-mode 1)) + +(provide 'cmp) +;;; cmp.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/edit.el b/modules/mixins/dotfiles/config/emacs/lisp/edit.el @@ -0,0 +1,26 @@ +;;; edit.el + +(electric-pair-mode 1) + +(use-package avy + :config + (setq avy-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l ?q ?w ?e ?r ?t ?y ?u ?i ?o ?p ?z ?x ?c ?v ?b ?n ?m))) + +(defun -comment-dwim () + "Comment or uncomment region or line." + (interactive) + (if (use-region-p) + (comment-dwim nil) + (comment-line 1))) + +(defun -imenu-or-outline () + "Jump to imenu, fall back to line search." + (interactive) + (condition-case nil + (consult-imenu) + (error (consult-line)))) + +(add-hook 'before-save-hook #'delete-trailing-whitespace) + +(provide 'edit) +;;; edit.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/fmt.el b/modules/mixins/dotfiles/config/emacs/lisp/fmt.el @@ -0,0 +1,18 @@ +;;; fmt.el + +(use-package apheleia + :config + (setq apheleia-formatters + '((gofmt . ("gofmt")) + (rustfmt . ("rustfmt")) + (zig-format . ("zig" "fmt")) + (alejandra . ("alejandra"))) + apheleia-mode-alist + '((go-mode . gofmt) + (rust-mode . rustfmt) + (zig-mode . zig-format) + (nix-mode . alejandra))) + (apheleia-global-mode 1)) + +(provide 'fmt) +;;; fmt.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/git.el b/modules/mixins/dotfiles/config/emacs/lisp/git.el @@ -0,0 +1,15 @@ +;;; git.el + +(use-package magit + :config + (setq magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1 + magit-diff-refine-hunk t)) + +(use-package ediff + :ensure nil + :config + (setq ediff-window-setup-function #'ediff-setup-windows-plain + ediff-split-window-function #'split-window-horizontally)) + +(provide 'git) +;;; git.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/go.el b/modules/mixins/dotfiles/config/emacs/lisp/go.el @@ -0,0 +1,7 @@ +;;; go.el + +(use-package go-mode + :mode "\\.go\\'") + +(provide 'go) +;;; go.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/lsp.el b/modules/mixins/dotfiles/config/emacs/lisp/lsp.el @@ -0,0 +1,26 @@ +;;; lsp.el + +(use-package eglot + :config + (setq eglot-send-changes-idle-time 0.5) + :hook ((python-mode . eglot-ensure) + (typescript-mode . eglot-ensure) + (js-mode . eglot-ensure) + (rust-mode . eglot-ensure) + (go-mode . eglot-ensure) + (zig-mode . eglot-ensure) + (purescript-mode . eglot-ensure) + (c-mode . eglot-ensure) + (c++-mode . eglot-ensure) + (nix-mode . eglot-ensure))) + +(use-package flymake + :config + (setq flymake-no-changes-timeout 0.5)) + +(use-package eldoc + :config + (setq eldoc-echo-area-use-multiline-p nil)) + +(provide 'lsp) +;;; lsp.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/meow-init.el b/modules/mixins/dotfiles/config/emacs/lisp/meow-init.el @@ -0,0 +1,89 @@ +;;; meow-init.el + +(use-package meow + :config + (setq meow-cheatsheet-layout meow-cheatsheet-layout-qwerty) + + (meow-motion-define-key + '("j" . meow-next) + '("k" . meow-prev) + '("<escape>" . ignore)) + + (meow-leader-define-key + '("SPC" . project-find-file) + '("b" . consult-buffer) + '("g" . magit-status) + '("f" . consult-ripgrep) + '("d" . consult-flymake) + '("o" . -imenu-or-outline) + '("v" . avy-goto-word-1) + '("-" . dired-jump) + '("?" . meow-cheatsheet)) + + (meow-normal-define-key + '("0" . meow-expand-0) + '("9" . meow-expand-9) + '("8" . meow-expand-8) + '("7" . meow-expand-7) + '("6" . meow-expand-6) + '("5" . meow-expand-5) + '("4" . meow-expand-4) + '("3" . meow-expand-3) + '("2" . meow-expand-2) + '("1" . meow-expand-1) + '("-" . negative-argument) + '(";" . meow-reverse) + '("," . meow-inner-of-thing) + '("." . meow-bounds-of-thing) + '("[" . meow-beginning-of-thing) + '("]" . meow-end-of-thing) + '("a" . meow-append) + '("A" . meow-open-below) + '("b" . meow-back-word) + '("B" . meow-back-symbol) + '("c" . meow-change) + '("D" . meow-backward-delete) + '("d" . meow-delete) + '("e" . meow-next-word) + '("E" . meow-next-symbol) + '("f" . meow-find) + '("g" . meow-cancel-selection) + '("G" . meow-grab) + '("h" . meow-left) + '("H" . meow-left-expand) + '("i" . meow-insert) + '("I" . meow-open-above) + '("j" . meow-next) + '("J" . meow-next-expand) + '("k" . meow-prev) + '("K" . meow-prev-expand) + '("l" . meow-right) + '("L" . meow-right-expand) + '("m" . meow-join) + '("n" . meow-search) + '("o" . meow-block) + '("O" . meow-to-block) + '("p" . meow-yank) + '("q" . meow-quit) + '("Q" . meow-goto-line) + '("r" . meow-replace) + '("R" . meow-swap-grab) + '("s" . meow-kill) + '("t" . meow-till) + '("u" . meow-undo) + '("U" . undo-redo) + '("v" . meow-visit) + '("w" . meow-mark-word) + '("W" . meow-mark-symbol) + '("x" . meow-line) + '("X" . meow-goto-line) + '("y" . meow-save) + '("Y" . meow-sync-grab) + '("z" . meow-pop-selection) + '("'" . repeat) + '("<escape>" . ignore)) + + (meow-global-mode 1)) + +(provide 'meow-init) +;;; meow-init.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/misc.el b/modules/mixins/dotfiles/config/emacs/lisp/misc.el @@ -0,0 +1,13 @@ +;;; misc.el + +(use-package markdown-mode + :mode "\\.md\\'") + +(use-package nix-mode + :mode "\\.nix\\'") + +(use-package purescript-mode + :mode "\\.purs\\'") + +(provide 'misc) +;;; misc.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/rust.el b/modules/mixins/dotfiles/config/emacs/lisp/rust.el @@ -0,0 +1,13 @@ +;;; rust.el + +(use-package rust-mode + :mode "\\.rs\\'" + :config + (setq rust-indent-offset 4)) + +(use-package cargo + :diminish t + :hook (rust-mode . cargo-minor-mode)) + +(provide 'rust) +;;; rust.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/ui.el b/modules/mixins/dotfiles/config/emacs/lisp/ui.el @@ -0,0 +1,40 @@ +;;; ui.el + +(use-package doric-themes + :config + (load-theme 'doric-obsidian t)) + +(use-package tree-sitter + :config + (global-tree-sitter-mode 1)) + +(use-package tree-sitter-langs + :after tree-sitter) + +(unless (display-graphic-p) + (xterm-mouse-mode 1)) + +(add-hook 'after-make-frame-functions + (lambda (frame) + (unless (display-graphic-p frame) + (set-face-background 'default "unspecified-bg" frame)))) + +(setq dired-listing-switches "-alhv --group-directories-first" + dired-auto-revert-buffer t + dired-dwim-target t) + +(add-hook 'dired-mode-hook #'dired-hide-details-mode) +(add-hook 'prog-mode-hook #'display-line-numbers-mode) +(show-paren-mode 1) + +(setq-default mode-line-format + '("% " + (:eval (if (buffer-modified-p) "*" "-")) + " " mode-line-buffer-identification + " L:%l " + (:eval (when (eglot-managed-p) "[eglot]")) + (:eval (when (bound-and-true-p meow--current-state) + (format "[%s]" meow--current-state))))) + +(provide 'ui) +;;; ui.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/lisp/zig.el b/modules/mixins/dotfiles/config/emacs/lisp/zig.el @@ -0,0 +1,9 @@ +;;; zig.el + +(use-package zig-mode + :mode "\\.zig\\'" + :config + (setq zig-format-on-save nil)) + +(provide 'zig) +;;; zig.el ends here diff --git a/modules/mixins/dotfiles/config/emacs/scripts/format-elisp.sh b/modules/mixins/dotfiles/config/emacs/scripts/format-elisp.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +if [ $# -eq 0 ]; then + echo "Usage: $0 file.el [file2.el ...]" + exit 1 +fi + +for file in "$@"; do + if [ ! -f "$file" ]; then + echo "Error: File not found: $file" + exit 1 + fi + + emacs --batch "$file" \ + --eval "(indent-region (point-min) (point-max))" \ + --eval "(save-buffer)" + + echo "Formatted: $file" +done diff --git a/modules/mixins/dotfiles/config/nota b/modules/mixins/dotfiles/config/nota @@ -1,3 +1,3 @@ GPG=0 MARKDOWN=1 -EDITOR=nvim +EDITOR=emacsclient -t