.emacs.d/init.el

839 lines
29 KiB
EmacsLisp
Raw Normal View History

2022-12-16 10:27:53 -08:00
;;; EMACS init file -*- lexical-binding:t -*-
2023-03-08 22:34:06 -08:00
(defconst my-is-nixos (file-exists-p "/nix")
"Whether or not Emacs is running on NixOS.")
(when my-is-nixos
(setq auth-sources '("/run/agenix/authinfo")))
(with-eval-after-load 'package
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/"))
(package-initialize))
2022-12-16 10:27:53 -08:00
2023-03-08 22:34:06 -08:00
(setq use-package-always-ensure (not my-is-nixos)
use-package-always-defer t
2022-12-16 10:27:53 -08:00
use-package-expand-minimally t)
(require 'use-package)
(let ((emacs-tmp-dir (expand-file-name (format "emacs%d" (user-uid))
temporary-file-directory)))
(setq auto-save-file-name-transforms `((".*" ,emacs-tmp-dir t))
auto-save-list-file-prefix emacs-tmp-dir
backup-directory-alist (setq undo-tree-history-directory-alist
`((".*" . ,emacs-tmp-dir)))
org-preview-latex-image-directory (expand-file-name "ltximg" emacs-tmp-dir)))
(setq backup-by-copying t
inhibit-splash-screen t
custom-file (expand-file-name "custom.el" temporary-file-directory))
2022-12-16 10:27:53 -08:00
2023-03-08 10:04:19 -08:00
(use-package f)
(use-package dash
:hook (emacs-lisp-mode . dash-fontify-mode)
:init
(with-eval-after-load 'info-look
(dash-register-info-lookup)))
2023-01-08 20:48:37 -08:00
(use-package undo-fu
:demand t
2022-12-16 10:27:53 -08:00
:config
2023-01-08 20:48:37 -08:00
(global-unset-key (kbd "C-z"))
(global-set-key (kbd "C-z") #'undo-fu-only-undo)
(global-set-key (kbd "C-S-z") #'undo-fu-only-redo))
(defun my-meow-undo (arg)
2023-01-24 23:31:15 -08:00
"Same as meow-undo, but uses undo-fu to redo if negative prefix."
2023-01-08 20:48:37 -08:00
(interactive "P")
(when (region-active-p)
(meow--cancel-selection))
(let ((numeric-prefix (prefix-numeric-value arg)))
(if (meow--with-negative-argument-p arg)
(undo-fu-only-redo (abs numeric-prefix))
(undo-fu-only-undo numeric-prefix))))
2023-02-13 11:11:19 -08:00
(defun my-meow-forward-paragraph ()
(interactive)
(meow--execute-kbd-macro "M-}"))
(defun my-meow-backward-paragraph ()
(interactive)
(meow--execute-kbd-macro "M-{"))
2023-01-17 17:48:26 -08:00
2023-01-08 20:48:37 -08:00
(use-package meow
:demand t
2022-12-16 10:27:53 -08:00
:config
2023-01-08 20:48:37 -08:00
(setq meow-cheatsheet-layout meow-cheatsheet-layout-qwerty)
(meow-motion-overwrite-define-key '("j" . meow-next)
'("k" . meow-prev)
'("<escape>" . ignore))
(meow-leader-define-key '("j" . "H-j")
'("k" . "H-k")
'("1" . meow-digit-argument)
'("2" . meow-digit-argument)
'("3" . meow-digit-argument)
'("4" . meow-digit-argument)
'("5" . meow-digit-argument)
'("6" . meow-digit-argument)
'("7" . meow-digit-argument)
'("8" . meow-digit-argument)
'("9" . meow-digit-argument)
'("0" . meow-digit-argument)
'("/" . meow-keypad-describe-key)
2023-01-24 23:31:15 -08:00
'("?" . meow-cheatsheet)
'("(" . insert-pair)
'("[" . insert-pair)
'("{" . insert-pair)
'("<" . insert-pair)
'("yy" . meow-clipboard-save)
'("ys" . meow-clipboard-kill)
'("yp" . meow-clipboard-yank))
2023-01-08 20:48:37 -08:00
(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-delete)
'("D" . meow-backward-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)
'("N" . meow-pop-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" . my-meow-undo)
'("U" . meow-undo-in-selection)
2023-01-24 23:31:15 -08:00
'("v" . meow-page-down)
'("V" . meow-page-up)
2023-01-08 20:48:37 -08:00
'("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)
2023-02-13 11:11:19 -08:00
'("Z" . meow-find-ref)
2023-01-08 20:48:37 -08:00
'("'" . repeat)
2023-01-24 23:31:15 -08:00
'("/" . meow-visit)
'(">" . meow-forward-slurp)
'("<" . meow-forward-barf)
'("C-<" . meow-backward-slurp)
'("C->" . meow-backward-barf)
2023-02-13 11:11:19 -08:00
'("}" . my-meow-forward-paragraph)
'("{" . my-meow-backward-paragraph)
2023-01-24 23:31:15 -08:00
'(":" . meow-comment)
'("=" . meow-indent)
2023-01-08 20:48:37 -08:00
'("<escape>" . ignore))
2023-02-07 22:22:13 -08:00
(with-eval-after-load 'catppuccin-theme
(setq meow-cursor-type-insert 'box)
(face-spec-set 'meow-insert-cursor `((t (:background
,(catppuccin-get-color 'mauve)
:inherit
unspecified))))
(face-spec-set 'meow-unknown-cursor `((t (:background
,(catppuccin-get-color 'rosewater)
:inherit
unspecified))))
(dolist (meow-cursor-face '(meow-normal-cursor meow-motion-cursor meow-beacon-cursor))
(face-spec-set meow-cursor-face `((t (:inherit meow-unknown-cursor)))))
(add-to-list 'meow-update-cursor-functions-alist
(cons (lambda () (and (meow-insert-mode-p) (not (display-graphic-p))))
(lambda () (meow--set-cursor-type '(hbar 2))))))
2023-01-08 20:48:37 -08:00
(meow-global-mode))
2022-12-16 10:27:53 -08:00
2023-01-24 23:31:15 -08:00
(use-package puni
:hook prog-mode tex-mode
:bind (:map puni-mode-map
("C-)" . puni-slurp-forward)
("C-}" . puni-barf-forward)
("C-(" . puni-slurp-backward)
("C-{" . puni-barf-backward)
("C-c p t" . puni-transpose)
("C-c p r" . puni-raise)
("C-c p C-s" . puni-splice)
("C-c p s" . puni-split)
("C-c p z" . puni-squeeze))
:config
(with-eval-after-load 'goggles
2023-02-08 21:29:33 -08:00
(defun my--disable-goggles-for-puni (oldfun &rest r)
(let ((old-goggles-mode goggles-mode))
(goggles-mode 0)
2023-02-22 22:28:26 -08:00
(prog1 (apply oldfun r)
2023-02-08 21:29:33 -08:00
(when old-goggles-mode
2023-02-22 22:28:26 -08:00
(goggles-mode)))))
(dolist (fun '(puni-slurp-forward
puni-barf-forward
puni-slurp-backward
puni-barf-backward
puni-raise))
2023-02-08 21:29:33 -08:00
(advice-add fun :around #'my--disable-goggles-for-puni))))
2023-01-24 23:31:15 -08:00
2023-01-09 23:03:49 -08:00
(use-package ace-window
:bind ("C-c w" . ace-window)
:custom
(aw-keys '(?a ?w ?e ?f ?g ?h ?j ?k ?l ?p))
(aw-dispatch-always t)
2023-01-18 10:42:40 -08:00
(aw-scope 'frame)
2023-01-09 23:03:49 -08:00
:config
(require 'cl-lib)
2023-01-09 23:03:49 -08:00
(dolist (c aw-dispatch-alist)
(cl-case (car c)
(?j (setcar c ?J))
(?v (setcar c ?s) (setcar (nthcdr 2 c) "Split Window"))
(?b (setcar c ?v) (setcar (nthcdr 2 c) "Vertical Split"))))
2023-01-21 17:31:58 -08:00
(with-eval-after-load 'catppuccin-theme
(face-spec-set 'aw-leading-char-face `((t (:foreground
2023-02-07 22:22:13 -08:00
,(catppuccin-get-color 'crust)
:background
,(catppuccin-get-color 'red)
:weight bold))))
2023-01-21 17:31:58 -08:00
(face-spec-set 'aw-background-face `((t (:foreground
2023-02-07 22:22:13 -08:00
,(catppuccin-get-color 'overlay1)))))))
2023-01-09 23:03:49 -08:00
2023-01-08 22:56:09 -08:00
(use-package goggles
:hook prog-mode
2023-01-08 22:56:09 -08:00
:config
(setq-default goggles-pulse t)
(with-eval-after-load 'catppuccin-theme
(face-spec-set 'goggles-added `((t (:background ,(catppuccin-get-color 'green)))))
(face-spec-set 'goggles-removed `((t (:background ,(catppuccin-get-color 'red)))))
(face-spec-set 'goggles-changed `((t (:background ,(catppuccin-get-color 'blue))))))
(setcar (cdr (assq 'goggles-mode minor-mode-alist)) " O-O"))
2023-01-08 22:56:09 -08:00
(use-package treesit
:ensure nil
2023-01-06 09:47:59 -08:00
:init
(add-to-list 'major-mode-remap-alist '(sh-mode . bash-ts-mode))
(add-to-list 'major-mode-remap-alist '(css-mode . css-ts-mode))
(add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode))
(add-to-list 'major-mode-remap-alist '(c++-mode . c++-ts-mode))
(add-to-list 'major-mode-remap-alist '(csharp-mode . csharp-ts-mode))
(add-to-list 'major-mode-remap-alist '(java-mode . java-ts-mode))
(add-to-list 'major-mode-remap-alist '(python-mode . python-ts-mode))
(add-to-list 'major-mode-remap-alist '(ruby-mode . ruby-ts-mode))
(add-to-list 'major-mode-remap-alist '(js-mode . js-ts-mode))
(add-to-list 'major-mode-remap-alist '(js-json-mode . json-ts-mode))
2022-12-16 10:27:53 -08:00
:custom
2023-02-07 22:22:13 -08:00
(treesit-extra-load-path (list (expand-file-name "tree-sitter-module/dist/"
user-emacs-directory))))
2022-12-16 10:27:53 -08:00
(use-package dtrt-indent
:demand t
2022-12-16 10:27:53 -08:00
:config
(dtrt-indent-global-mode)
(setcar (cdr (assq 'dtrt-indent-mode minor-mode-alist)) " dtrt"))
2022-12-16 10:27:53 -08:00
(use-package aggressive-indent
:custom
(aggressive-indent-sit-for-time 0.1)
2023-03-08 22:34:06 -08:00
:hook
emacs-lisp-mode
ielm-mode
lisp-mode
lisp-interaction-mode
scheme-mode
clojure-mode
nix-mode
:config
(with-eval-after-load 'meow
(add-to-list 'aggressive-indent-protected-commands #'my-meow-undo)
(add-to-list 'aggressive-indent-protected-commands #'meow-undo)
(add-to-list 'aggressive-indent-protected-commands #'meow-undo-in-selection)))
2022-12-16 10:27:53 -08:00
(use-package rainbow-delimiters
:hook prog-mode)
(use-package which-key
:demand t
2022-12-16 10:27:53 -08:00
:custom
(which-key-idle-delay 0.2)
:config
(which-key-mode))
2023-01-19 21:10:22 -08:00
(use-package lsp-mode
2023-03-08 22:34:06 -08:00
:hook
(c-ts-mode . lsp-deferred)
(c++-ts-mode . lsp-deferred)
(html-mode . lsp-deferred)
(lsp-mode . lsp-enable-which-key-integration)
2023-01-19 21:10:22 -08:00
:custom
(read-process-output-max (* 1024 1024)) ; 1 MB
2023-02-08 08:42:44 -08:00
(lsp-keymap-prefix "M-o"))
2023-01-19 21:10:22 -08:00
(use-package lsp-java
2023-03-08 22:34:06 -08:00
:hook
(java-ts-mode . lsp-deferred))
2023-01-19 21:10:22 -08:00
(use-package lsp-ui)
(use-package lsp-treemacs
2023-03-08 22:34:06 -08:00
:hook
(lsp-mode . lsp-treemacs-sync-mode))
2023-01-19 21:10:22 -08:00
2023-02-20 22:22:05 -08:00
(use-package dap-mode
:bind (:map lsp-command-map ("d" . dap-hydra))
:custom
(dap-auto-configure-mode t)
(dap-auto-configure-features '(sessions locals breakpoints expressions tooltip))
:config
(add-hook 'dap-stopped-hook (lambda (arg) (call-interactively #'dap-hydra)))
(require 'dap-cpptools)
(dap-register-debug-template
"Automatic C++ debug"
(list :type "cppdbg"
:request "launch"
:name "Automatic C++ debug"
:MIMode "gdb"
:dap-compilation "CXXFLAGS='-g' make '${fileBasenameNoExtension}'"
:program "${workspaceFolder}/${fileBasenameNoExtension}"
:cwd "${workspaceFolder}"
:args ["<" "${workspaceFolder}/${fileBasenameNoExtension}.in"])))
2023-01-19 21:10:22 -08:00
2023-02-08 21:29:33 -08:00
(use-package yasnippet
:config
2023-02-09 11:24:03 -08:00
(yas-global-mode)
(advice-add #'yas-expand-snippet
:around
(lambda (oldfun &rest r)
(let ((org-src-tab-acts-natively nil))
(apply oldfun r)))
'((name . my--yas-expand-disable-org-tab-native))))
2023-02-08 21:29:33 -08:00
(use-package yasnippet-snippets)
2023-01-24 23:31:15 -08:00
(use-package consult
2023-03-08 22:34:06 -08:00
:bind
("M-s r" . consult-ripgrep)
("M-s d" . consult-find)
("C-x M-:" . consult-complex-command)
("C-x b" . consult-buffer)
("C-x r b" . consult-bookmark))
2023-01-19 21:10:22 -08:00
2023-02-08 21:29:33 -08:00
(use-package consult-yasnippet
2023-03-08 22:34:06 -08:00
:bind
("C-c s" . consult-yasnippet)
("C-c S" . consult-yasnippet-visit-snippet-file))
2023-02-08 21:29:33 -08:00
2023-02-08 08:42:44 -08:00
(use-package embark
2023-03-08 22:34:06 -08:00
:bind
("C-." . embark-act)
("C-;" . embark-dwim))
2023-02-08 08:42:44 -08:00
(use-package embark-consult)
2022-12-16 10:27:53 -08:00
(use-package orderless
:demand t
2022-12-16 10:27:53 -08:00
:custom
(completion-styles '(orderless basic))
(completion-category-defaults nil)
2023-01-24 23:31:15 -08:00
(completion-category-overrides '((file (styles . (partial-completion))))))
2022-12-16 10:27:53 -08:00
(use-package marginalia
:demand t
:after vertico
2023-01-19 21:10:22 -08:00
:bind (:map minibuffer-local-map ("M-a" . marginalia-cycle))
:config
2022-12-16 10:27:53 -08:00
(marginalia-mode))
(use-package vertico
:demand t
2022-12-16 10:27:53 -08:00
:config
(vertico-mode)
(vertico-mouse-mode))
2023-01-19 21:10:22 -08:00
(use-package corfu
:demand t
:custom
(corfu-auto t)
2023-01-24 23:31:15 -08:00
(corfu-cycle t)
(corfu-preselect-first nil)
(corfu-scroll-margin 3)
(tab-always-indent 'complete)
2023-01-19 21:10:22 -08:00
:config
2023-01-24 23:31:15 -08:00
(global-corfu-mode)
(add-hook 'minibuffer-setup-hook (lambda ()
(when (where-is-internal #'completion-at-point
(list (current-local-map)))
(setq-local corfu-echo-display nil
corfu-popupinfo-delay nil)
2023-02-13 11:11:19 -08:00
(corfu-mode))))
2023-01-24 23:31:15 -08:00
(with-eval-after-load 'meow
(add-hook 'meow-insert-exit-hook #'corfu-quit)))
2023-01-19 21:10:22 -08:00
2023-02-08 08:42:44 -08:00
(use-package cape)
(use-package all-the-icons
:demand t)
2022-12-16 10:27:53 -08:00
(use-package all-the-icons-completion
2023-03-08 22:34:06 -08:00
:after marginalia all-the-icons
2022-12-16 10:27:53 -08:00
:hook (marginalia-mode . all-the-icons-completion-marginalia-setup)
:init
(all-the-icons-completion-mode))
(use-package treemacs)
2022-12-16 10:27:53 -08:00
(use-package treemacs-all-the-icons
:demand t
:after treemacs
2022-12-16 10:27:53 -08:00
:config
(treemacs-load-theme 'all-the-icons))
(use-package doom-modeline
:disabled t
:demand t
:custom
(doom-modeline-fn-alist (--map
(cons (remove-pos-from-symbol (car it)) (cdr it))
doom-modeline-fn-alist))
2022-12-16 10:27:53 -08:00
:config
(doom-modeline-mode))
(use-package dirvish
2023-01-11 21:34:48 -08:00
:demand t
2022-12-16 10:27:53 -08:00
:after dired
:custom
(dirvish-attributes '(all-the-icons))
:config
(dirvish-override-dired-mode))
(use-package pdf-tools
2023-01-06 09:47:59 -08:00
:mode ("\\.pdf\\'" . pdf-view-mode)
2023-03-08 10:04:19 -08:00
:bind (:map pdf-view-mode-map ("/" . #'isearch-forward))
2022-12-16 10:27:53 -08:00
:config
(pdf-tools-install))
2023-02-10 16:43:24 -08:00
(use-package wc-mode
:hook text-mode org-mode)
2023-02-14 10:18:14 -08:00
(defun my-set-text-modes-font ()
2022-12-16 10:27:53 -08:00
(interactive)
2023-02-14 10:18:14 -08:00
(setq buffer-face-mode-face '(:family "Inter" :height 115)
line-spacing 0.3)
2022-12-16 10:27:53 -08:00
(buffer-face-mode))
(use-package org
2023-03-08 22:34:06 -08:00
:hook
(org-mode . org-indent-mode)
(org-mode . auto-fill-mode)
(org-mode . my-set-text-modes-font)
2023-02-14 10:18:14 -08:00
:custom-face
(org-block ((t (:family "JetbrainsMono Nerd Font" :height 105))))
(org-code ((t (:family "JetbrainsMono Nerd Font" :height 105))))
2023-02-27 20:30:43 -08:00
(org-meta-line ((t (:family "JetbrainsMono Nerd Font" :height 105))))
(org-document-info-keyword ((t (:family "JetbrainsMono Nerd Font" :height 105))))
2023-02-14 10:18:14 -08:00
(org-hide ((t (:inherit fixed-pitch))))
2022-12-16 10:27:53 -08:00
:custom
(org-list-allow-alphabetical t)
2022-12-23 16:32:34 -08:00
(org-hide-emphasis-markers t)
2023-01-01 00:38:59 -08:00
(org-pretty-entities t)
2023-02-10 13:39:46 -08:00
(org-babel-load-languages '((emacs-lisp . t)
(ruby . t)
(python . t)
(shell . t)
(C . t)))
2023-02-27 20:30:43 -08:00
;; NixOS minimal LaTeX setup
(org-latex-compiler "lualatex")
(org-preview-latex-default-process 'dvisvgm)
2022-12-16 10:27:53 -08:00
:config
2023-02-09 11:24:03 -08:00
(setq org-format-latex-options (plist-put org-format-latex-options :scale 1.1))
2023-02-14 10:18:14 -08:00
(add-to-list 'org-modules 'org-tempo)
(with-eval-after-load 'catppuccin-theme
(face-spec-set 'org-table `((t (:family
"DejaVu Sans Mono"
:height
100
:foreground
,(catppuccin-get-color 'subtext0)))))))
2022-12-16 10:27:53 -08:00
(use-package org-superstar
:custom
(org-superstar-leading-bullet ?\s)
:hook org-mode)
(use-package org-pdftools
:hook (org-mode . org-pdftools-setup-link))
(use-package editorconfig
:demand t
2022-12-16 10:27:53 -08:00
:config
(editorconfig-mode)
(setcar (cdr (assq 'editorconfig-mode minor-mode-alist)) " EdConf"))
2022-12-16 10:27:53 -08:00
2023-02-18 23:42:10 -08:00
(use-package envrc
:bind ("C-c v" . envrc-command-map)
:hook (after-init . envrc-global-mode))
2023-02-27 20:08:32 -08:00
(defun my-slime-repl-set-parens ()
(rainbow-delimiters-mode)
(puni-mode)
(electric-pair-local-mode)
(define-key slime-repl-mode-map (kbd "DEL") nil)
(local-set-key (kbd "DEL") #'backward-delete-char-untabify))
(use-package slime
:hook (slime-repl-mode . my-slime-repl-set-parens)
:custom
(slime-contribs '(slime-fancy slime-repl))
(slime-lisp-implementations '((sbcl ("sbcl")
:coding-system utf-8-unix)))
:config
(setq inferior-lisp-program "sbcl"))
2023-02-09 11:24:03 -08:00
(use-package nix-mode)
2022-12-29 22:17:36 -08:00
2022-12-23 16:32:34 -08:00
(use-package markdown-mode
:mode ("README\\.md\\'" . gfm-mode)
2023-02-14 10:18:14 -08:00
:hook (markdown-mode . my-set-text-modes-font)
:custom-face
(markdown-code-face ((t (:family "JetbrainsMono Nerd Font" :height 105))))
(markdown-inline-code-face ((t (:family "JetbrainsMono Nerd Font" :height 105))))
2022-12-23 16:32:34 -08:00
:custom
(markdown-command '("pandoc" "--from=markdown" "--to=html5")))
2023-02-09 11:24:03 -08:00
(use-package meson-mode)
2023-01-16 21:28:47 -08:00
2023-03-08 10:04:19 -08:00
(use-package spell-fu
:hook org-mode text-mode)
2022-12-16 10:27:53 -08:00
(use-package minimap
:custom-face
2023-02-10 16:43:24 -08:00
(minimap-active-region-background ((t (:background unspecified :inherit hl-line))))
2023-01-08 20:48:37 -08:00
:hook (minimap-sb-mode . turn-on-solaire-mode))
2022-12-16 10:27:53 -08:00
2023-03-08 10:04:19 -08:00
(defun my-magit-commit-text-setup ()
(git-commit-turn-on-auto-fill)
(spell-fu-mode)
(setq-local spell-fu-check-range #'my-magit-spell-fu-check-range)
(spell-fu--time-ensure t))
(defun my-magit-spell-fu-check-range (pos-beg pos-end)
(require 'dash)
(spell-fu--overlays-remove pos-beg pos-end)
(with-syntax-table spell-fu-syntax-table
(save-match-data
(save-excursion
(goto-char (point-min))
(let ((check-end (-> (concat "^" comment-start " -+ >8 -+$")
(re-search-forward pos-end t)
(or pos-end)))
(comment-start-char (aref comment-start 0)))
(goto-char pos-beg)
(while (< (point) check-end)
(unless (= (char-after) comment-start-char)
(let ((pos-line-end (pos-eol)))
(while (re-search-forward spell-fu-word-regexp pos-line-end t)
(let ((word-beg (match-beginning 0))
(word-end (match-end 0)))
(spell-fu-check-word word-beg word-end (match-string-no-properties 0))))))
(forward-line)))))))
(use-package magit
2023-03-08 10:04:19 -08:00
:hook (git-commit-setup . my-magit-commit-text-setup))
2022-12-16 10:27:53 -08:00
2023-03-08 22:34:06 -08:00
(use-package forge
:after magit
:demand t)
2022-12-16 10:27:53 -08:00
(use-package tramp
:custom
(remote-file-name-inhibit-cache nil)
(tramp-verbose 1)
:config
(setq vc-ignore-dir-regexp (format "%s\\|%s"
vc-ignore-dir-regexp
tramp-file-name-regexp)))
2022-12-24 15:52:45 -08:00
(use-package vterm
2023-03-08 22:34:06 -08:00
:bind
("C-c t" . vterm)
("C-c T" . vterm-other-window)
2022-12-24 15:52:45 -08:00
:hook (vterm-mode . my-inhibit-hl-line-mode)
:config
2023-01-08 20:48:37 -08:00
(with-eval-after-load 'meow
(defvar meow-vterm-normal-mode-map
(let ((map (make-sparse-keymap)))
2023-03-08 22:34:06 -08:00
(define-key map (kbd "RET") #'vterm-send-return)
map))
2023-01-08 20:48:37 -08:00
(setq vterm-keymap-exceptions '("C-c"))
(define-key vterm-mode-map (kbd "C-c ESC") #'vterm-send-escape)
(dolist (c '((yank . vterm-yank)
(xterm-paste . vterm-xterm-paste)
(yank-pop . vterm-yank-pop)
(mouse-yank-primary . vterm-yank-primary)
(self-insert-command . vterm--self-insert)
(beginning-of-defun . vterm-previous-prompt)
(end-of-defun . vterm-next-prompt)))
(define-key meow-vterm-normal-mode-map (vector 'remap (car c)) (cdr c)))
(add-hook 'vterm-mode-hook
(lambda ()
(add-hook 'meow-insert-enter-hook
(lambda ()
(use-local-map vterm-mode-map)
(vterm-goto-char (point)))
nil t)
(add-hook 'meow-insert-exit-hook
(lambda ()
(use-local-map meow-vterm-normal-mode-map))
nil t)))
(add-to-list 'meow-mode-state-list '(vterm-mode . insert))))
2022-12-23 22:04:26 -08:00
2022-12-16 10:27:53 -08:00
(use-package elfeed
:custom
(elfeed-feeds '(("https://archlinux.org/feeds/news/" arch-linux))))
2023-03-08 10:04:19 -08:00
(use-package xkcd)
2022-12-16 10:27:53 -08:00
2023-03-10 23:35:34 -08:00
(use-package page-break-lines
:hook
emacs-lisp-mode
lisp-mode
scheme-mode
compilation-mode
outline-mode
help-mode)
2023-03-08 22:34:06 -08:00
(use-package hl-todo
:hook prog-mode)
2022-12-16 10:27:53 -08:00
(use-package ligature
2023-03-08 22:34:06 -08:00
:hook
prog-mode
(ligature-mode . prettify-symbols-mode)
2022-12-16 10:27:53 -08:00
:custom
(prettify-symbols-unprettify-at-point t)
:config
(ligature-set-ligatures 'prog-mode '("|||>" "<|||" "<==>" "<!--" "####" "~~>" "***" "||=" "||>"
":::" "::=" "=:=" "===" "==>" "=!=" "=>>" "=<<" "=/=" "!=="
"!!." ">=>" ">>=" ">>>" ">>-" ">->" "->>" "-->" "---" "-<<"
"<~~" "<~>" "<*>" "<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->"
"<--" "<-<" "<<=" "<<-" "<<<" "<+>" "</>" "###" "#_(" "..<"
"..." "+++" "/==" "///" "_|_" "www" "&&" "^=" "~~" "~@" "~="
"~>" "~-" "**" "*>" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|"
"[|" "]#" "::" ":=" ":>" ":<" "$>" "==" "=>" "!=" "!!" ">:"
">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:"
"<$" "<=" "<>" "<-" "<<" "<+" "</" "#{" "#[" "#:" "#=" "#!"
"##" "#(" "#?" "#_" "%%" ".=" ".-" ".." ".?" "+>" "++" "?:"
"?=" "?." "??" ";;" "/*" "/=" "/>" "//" "__" "~~" "(*" "*)"
"\\\\" "://")))
(use-package gruvbox-theme)
2023-01-08 20:48:37 -08:00
(use-package catppuccin-theme
2023-01-21 17:31:58 -08:00
:demand t
2023-01-27 11:00:39 -08:00
:custom-face
2023-02-22 11:52:00 -08:00
(mode-line-active ((t (:font "DejaVu Sans Mono"))))
(mode-line-inactive ((t (:font "DejaVu Sans Mono"))))
(line-number-current-line ((t (:inherit hl-line))))
:custom
2023-01-21 17:31:58 -08:00
(catppuccin-flavor 'mocha))
2023-01-08 20:48:37 -08:00
2023-02-18 22:07:57 -08:00
(defun my-load-theme-with-solaire ()
(load-theme 'catppuccin t)
(catppuccin-reload)
2023-03-08 22:34:06 -08:00
(face-spec-set 'font-lock-variable-name-face `((t (:foreground
,(catppuccin-get-color 'flamingo)))))
2022-12-16 10:27:53 -08:00
(solaire-global-mode)
(when (daemonp)
2023-02-18 22:07:57 -08:00
(remove-hook 'server-after-make-frame-hook #'my-load-theme-with-solaire)))
2022-12-16 10:27:53 -08:00
(use-package solaire-mode
:demand t
2022-12-16 10:27:53 -08:00
:custom
(solaire-mode-real-buffer-fn (lambda ()
(and (solaire-mode-real-buffer-p)
(or (custom-theme-enabled-p 'gruvbox)
2023-02-18 22:07:57 -08:00
(not (memq 'minimap-sb-mode
local-minor-modes))))))
2022-12-16 10:27:53 -08:00
:config
(if (daemonp)
2023-02-18 22:07:57 -08:00
(add-hook 'server-after-make-frame-hook #'my-load-theme-with-solaire)
(my-load-theme-with-solaire)))
2022-12-16 10:27:53 -08:00
2023-03-08 22:34:06 -08:00
(use-package with-editor
:bind
([remap async-shell-command] . with-editor-async-shell-command)
([remap shell-command] . with-editor-shell-command)
:hook
(shell-mode . with-editor-export-editor)
(eshell-mode . with-editor-export-editor)
(term-exec . with-editor-export-editor)
(vterm-mode . with-editor-export-editor))
2022-12-16 10:27:53 -08:00
(use-package emacs-everywhere
2023-02-22 22:28:26 -08:00
:ensure nil
:commands emacs-everywhere
:custom
(emacs-everywhere-frame-parameters '((name . "emacs-everywhere")
(alpha-background . 1.0)))
:config
(add-to-list 'emacs-everywhere-frame-parameters '(alpha-background . 1.0))
(add-to-list 'emacs-everywhere-frame-parameters '(width . 120))
(add-to-list 'emacs-everywhere-frame-parameters '(height . 20)))
2022-12-16 10:27:53 -08:00
(use-package ffap
2023-02-16 12:27:06 -08:00
:ensure nil
:demand t
:config
(ffap-bindings))
2023-02-16 12:27:06 -08:00
(use-package eldoc
:ensure nil
:custom
(eldoc-documentation-strategy #'eldoc-documentation-compose-eagerly))
2023-02-08 08:42:44 -08:00
(use-package ibuffer
:bind ("C-x C-b" . ibuffer))
2022-12-16 10:27:53 -08:00
(use-package tool-bar
:ensure nil
:config
(tool-bar-mode 0))
(use-package menu-bar
:ensure nil
:config
(menu-bar-mode 0))
(use-package scroll-bar
:ensure nil
:config
(scroll-bar-mode 0))
(setq pixel-scroll-precision-large-scroll-height 40)
(pixel-scroll-precision-mode)
2022-12-16 10:27:53 -08:00
(setcar mouse-wheel-scroll-amount 3)
(setq server-client-instructions nil
scroll-step 1
2023-01-09 23:03:49 -08:00
scroll-margin 8
2022-12-16 10:27:53 -08:00
scroll-conservatively 9999
2022-12-31 14:10:38 -08:00
python-indent-guess-indent-offset nil
2022-12-16 10:27:53 -08:00
read-file-name-completion-ignore-case t
read-buffer-completion-ignore-case t
completion-ignore-case t
sentence-end-double-space nil
2023-02-07 22:22:13 -08:00
custom-safe-themes t
x-stretch-cursor t)
2022-12-16 10:27:53 -08:00
(setq-default c-basic-offset 4
2023-01-15 13:57:38 -08:00
c-ts-mode-indent-offset 4
2022-12-16 10:27:53 -08:00
tab-width 4
fill-column 80)
2022-12-31 14:10:38 -08:00
(add-hook 'python-mode-hook (lambda () (setq tab-width 4)))
2022-12-16 10:27:53 -08:00
2023-01-21 17:31:58 -08:00
(column-number-mode)
(size-indication-mode)
2022-12-24 15:52:45 -08:00
(global-hl-line-mode)
(defun my-inhibit-hl-line-mode ()
(setq-local global-hl-line-mode nil))
(defun my-relative-linenum ()
2022-12-16 10:27:53 -08:00
(setq display-line-numbers 'relative))
(dolist (hook '(prog-mode-hook
text-mode-hook
conf-mode-hook
org-mode-hook))
2022-12-24 15:52:45 -08:00
(add-hook hook #'my-relative-linenum))
2022-12-16 10:27:53 -08:00
2022-12-24 15:52:45 -08:00
(defun my-use-spaces-for-indent ()
2022-12-16 10:27:53 -08:00
(setq indent-tabs-mode nil))
2022-12-24 15:52:45 -08:00
(dolist (hook '(emacs-lisp-mode-hook
lisp-mode-hook
scheme-mode-hook
clojure-mode-hook))
(add-hook hook #'my-use-spaces-for-indent))
2022-12-16 10:27:53 -08:00
2023-01-08 22:56:09 -08:00
(add-hook 'prog-mode-hook #'electric-pair-local-mode)
(add-hook 'eval-expression-minibuffer-setup-hook #'electric-pair-local-mode)
(add-hook 'text-mode-hook #'word-wrap-whitespace-mode)
2022-12-16 10:27:53 -08:00
(defun scroll-down-3 ()
"Scroll down by 3."
2022-12-16 10:27:53 -08:00
(interactive)
(scroll-down 3))
(defun scroll-up-3 ()
"Scroll up by 3."
2022-12-16 10:27:53 -08:00
(interactive)
(scroll-up 3))
(defun frame-make-detect-term (&optional frame)
2022-12-16 10:27:53 -08:00
"Check when frames are made in order to make terminal-only configurations"
(unless (display-graphic-p frame)
(xterm-mouse-mode)
(global-set-key (kbd "<mouse-4>") #'scroll-down-3)
(global-set-key (kbd "<mouse-5>") #'scroll-up-3)
(remove-hook 'after-make-frame-functions #'frame-make-detect-term)))
2022-12-16 10:27:53 -08:00
(if (daemonp)
(add-to-list 'after-make-frame-functions #'frame-make-detect-term)
(frame-make-detect-term))
2022-12-16 10:27:53 -08:00
2023-01-06 22:35:05 -08:00
(defun my-sudo-edit ()
"Edit current file as root."
(interactive)
(unless (and buffer-file-name
(file-writable-p buffer-file-name))
(find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))
2022-12-16 10:27:53 -08:00
(add-to-list 'auto-mode-alist '("\\.yuck\\'" . lisp-mode))
2023-01-06 09:47:59 -08:00
(add-to-list 'auto-mode-alist '("flake\\.lock\\'" . js-json-mode))
2023-02-08 22:53:03 -08:00
(add-to-list 'auto-mode-alist '("/qutebrowser-editor-" . text-mode) t)
2022-12-16 10:27:53 -08:00
(when (daemonp)
(with-current-buffer "*scratch*"
(cd "~/")))
(defvar my-bat-previous-status nil
"Whether battery was in use on last check.")
(require 'battery)
(defun my-bat-check ()
"Check if battery status has changed in order to toggle
goggles-pulse and pixel-scroll-precision-mode."
(let ((bat-status (string-equal (cdr (assq ?L (funcall battery-status-function)))
"BAT")))
(unless (eq bat-status my-bat-previous-status)
(setq my-bat-previous-status bat-status)
(when (boundp 'goggles-pulse)
(setq goggles-pulse (not bat-status)))
(pixel-scroll-precision-mode (if bat-status 0 1)))))
(when battery-status-function
(run-with-timer 0 30 #'my-bat-check))