init.el (17587B)
1 ;;; -*- lexical-binding: t -*- 2 3 (setq custom-file (concat user-emacs-directory "custom.el")) 4 (add-to-list 'load-path "~/.config/emacs/local") 5 (add-to-list 'custom-theme-load-path "~/.config/emacs/local") 6 (when (file-exists-p custom-file) 7 (load custom-file)) 8 9 (load "odin-mode.el") 10 11 ;;; Appearance and basic functionality 12 (menu-bar-mode -1) 13 (tool-bar-mode -1) 14 (scroll-bar-mode -1) 15 16 (setq jrk/font-name "Iosevka-") 17 (setq jrk/font-size 12) 18 (setq jrk/font-big-size 24) 19 (setq jrk/font (concat jrk/font-name (number-to-string jrk/font-size))) 20 (modify-all-frames-parameters `((font . ,jrk/font))) 21 (load-theme 'gruber-darker t) 22 23 (set-default 'truncate-lines nil) 24 25 (add-hook 'before-save-hook 'delete-trailing-whitespace) 26 27 ;; no tabs !! 28 (setq-default indent-tabs-mode nil) 29 30 ;; no tabs in lisp files 31 (add-hook 'scheme-mode-hook (lambda () (setq indent-tabs-mode nil))) 32 (add-hook 'emacs-lisp-mode-hook (lambda () (setq indent-tabs-mode nil))) 33 34 ;; tab-width 2 in html and js files 35 (add-hook 'mhtml-mode-hook (lambda () (setq tab-width 2))) 36 (add-hook 'js-mode-hook (lambda () 37 (setq js-indent-level 2) 38 (setq tab-width 2))) 39 40 (add-hook 'Info-mode-hook (lambda () (display-line-numbers-mode -1))) 41 42 (setq display-buffer-alist 43 '( 44 ((or "\\*Help\\*" 45 "\\*Occur\\*") 46 (display-buffer-reuse-mode-window display-buffer-below-selected)) 47 )) 48 49 (setq-default tab-width 4 50 require-final-newline t) 51 (setq inhibit-splash-screen t 52 inhibit-startup-message t 53 scroll-step 3 54 auto-save-default nil 55 make-backup-files nil 56 blink-cursor-mode nil 57 ring-bell-function 'ignore 58 display-line-numbers-type 'relative 59 dired-listing-switches "-alh --group-directories-first" 60 compilation-scroll-output t 61 gc-cons-threshold 100000000 62 compilation-ask-about-save nil 63 frame-resize-pixelwise t 64 mouse-drag-mode-line-buffer 1 65 display-time-24hr-format t 66 use-short-answers t 67 read-answer-short 'auto 68 visible-cursor nil ;; no cursor blink in tui 69 ) 70 71 ;; (global-hl-line-mode 1) 72 ;; (global-display-line-numbers-mode) 73 74 (require 'package) 75 (add-to-list 'package-archives 76 '("melpa" . "https://melpa.org/packages/") t) 77 78 (use-package icomplete 79 :ensure nil 80 :config 81 (setq completion-auto-select t 82 completions-sort 'historical 83 completions-max-height 20 84 completions-format 'one-column 85 completion-ignore-case t) 86 (fido-vertical-mode)) 87 88 (use-package corfu 89 :ensure t 90 :init 91 (global-corfu-mode) 92 (corfu-popupinfo-mode)) 93 94 (use-package cape 95 :ensure t 96 :bind (("M-/" . cape-dabbrev))) 97 98 (use-package dabbrev 99 :config 100 (setq dabbrev-case-replace nil)) 101 102 (use-package ediff 103 :ensure nil 104 :config 105 (setq ediff-window-setup-function 'ediff-setup-windows-plain) 106 (setq ediff-split-window-function 'split-window-horizontally)) 107 108 (use-package ledger-mode 109 :ensure t 110 :config 111 (setq ledger-reconcile-finish-force-quit t)) 112 113 (use-package compile 114 :ensure nil 115 :config 116 ;; pascal compilation errors 117 (add-to-list 'compilation-error-regexp-alist 118 '("^\\(.*\\)(\\([0-9]+\\)+\\,\\([0-9]+\\)).*" 1 2 3))) 119 120 (use-package emacs 121 :config 122 (setq modus-themes-org-blocks 'gray-background)) 123 124 (use-package ef-themes 125 :ensure t) 126 127 (use-package acme-theme 128 :ensure t) 129 130 (use-package minions 131 :ensure t 132 133 :custom 134 (minions-mode-line-delimiters (cons "" "")) 135 136 :config 137 (defun +set-minions-mode-line-lighter () 138 (setq minions-mode-line-lighter 139 (if (display-graphic-p) "⚙" "#"))) 140 141 (add-hook 'server-after-make-frame-hook #'+set-minions-mode-line-lighter) 142 (display-time-mode 1) 143 (display-battery-mode 1) 144 (minions-mode 1)) 145 146 (use-package olivetti 147 :ensure t 148 :config 149 (add-hook 'olivetti-mode-on-hook (lambda () (olivetti-set-width 144)))) 150 151 (use-package zenburn-theme 152 :ensure t) 153 154 (use-package savehist 155 :ensure nil 156 :init 157 (savehist-mode)) 158 159 (use-package eat 160 :ensure t) 161 ;; (add-hook 'eshell-first-time-mode-hook #'eat-eshell-mode)) 162 163 (use-package eshell 164 :ensure nil 165 :config 166 (setq eshell-cp-interactive-query t) (add-to-list 'eshell-modules-list 'eshell-elecslash) 167 :hook (eshell-mode . (lambda () 168 (display-line-numbers-mode -1)))) 169 170 (use-package vertico 171 :ensure t 172 :init 173 ;; (vertico-mode 1) 174 (setq vertico-cycle t)) 175 176 ;; (use-package completion-preview 177 ;; :ensure nil 178 ;; :bind 179 ;; (:map completion-preview-active-mode-map 180 ;; ("M-n" . completion-preview-next-candidate) 181 ;; ("M-p" . completion-preview-prev-candidate)) 182 ;; :hook 183 ;; (emacs-lisp-mode . (lambda () (completion-preview-mode)))) 184 185 (use-package orderless 186 :ensure t 187 :custom 188 (completion-styles '(orderless basic)) 189 (completion-category-overrides '((file (styles basic partial-completion))))) 190 191 (use-package dired 192 :ensure nil 193 :bind 194 (:map dired-mode-map 195 ("o" . dired-find-file) 196 ("n" . dired-up-directory)) 197 :config 198 (setq dired-clean-up-buffers-too t 199 dired-dwim-target t 200 dired-recursive-copies 'always 201 dired-recursive-deletes 'top 202 global-auto-revert-non-file-buffers t 203 auto-revert-verbose nil)) 204 205 (use-package marginalia 206 :ensure t 207 :init 208 (marginalia-mode)) 209 210 (use-package yasnippet 211 :ensure t 212 :config 213 (yas-global-mode 1)) 214 215 (use-package dumb-jump 216 :ensure t 217 :config 218 (setq xref-show-definitions-function #'xref-show-definitions-completing-read) 219 (add-hook 'xref-backend-functions #'dumb-jump-xref-activate)) 220 221 (use-package magit :ensure t) 222 223 (use-package go-mode :ensure t) 224 225 (use-package lua-mode :ensure t) 226 227 (use-package rust-mode :ensure t) 228 229 (use-package glsl-mode :ensure t) 230 231 (use-package htmlize :ensure t) 232 233 (use-package zig-mode 234 :ensure t 235 :config 236 (setq zig-format-on-save nil)) 237 238 (use-package org 239 :ensure nil 240 :config 241 (setq org-directory "~/org") 242 (setq org-agenda-files (list org-directory)) 243 (setq org-html-validation-link nil) 244 (setq org-insert-heading-respect-content t) 245 (org-babel-do-load-languages 246 'org-babel-load-languages 247 '((shell . t))) 248 :hook (org-mode . (lambda () 249 (display-line-numbers-mode -1)))) 250 251 (use-package org-tempo 252 :ensure nil 253 :after (org) 254 :config 255 (add-to-list 'org-structure-template-alist 256 '("el" . "src emacs-lisp"))) 257 258 (use-package org-bullets 259 :ensure t 260 :after (org)) 261 ;; :hook 262 ;; (org-mode . (lambda () 263 ;; (org-bullets-mode)))) 264 265 (use-package ido 266 :ensure t 267 :config 268 (setq ido-enable-flex-matching t 269 ido-everywhere t 270 ido-show-dot-for-dired t 271 ido-auto-merge-work-directories-length -1) 272 (ido-mode 0)) 273 274 (use-package message 275 :ensure nil 276 :config 277 (setq message-kill-buffer-on-exit t)) 278 279 (use-package notmuch 280 :ensure t 281 :hook 282 (message-setup . (lambda () (mml-secure-sign-pgpmime))) 283 :bind 284 ("C-c n" . notmuch) 285 :config 286 (setq send-mail-function 'sendmail-send-it 287 sendmail-program "msmtp" 288 ;; msmtp read from address to determine which smtp account to use 289 message-sendmail-extra-arguments '("--read-envelope-from") 290 ;; removes the very evil --from 291 message-sendmail-f-is-evil t) 292 293 (setq notmuch-identities '("Jake Koroman <jake@jakekoroman.com>" 294 "Jake Koroman <koromanj@miltonhydro.com>")) 295 (setq notmuch-fcc-dirs '(("jake@jakekoroman.com" . "personal/Sent") 296 ("koromanj@miltonhydro.com" . "work/Sent"))) 297 (setq notmuch-always-prompt-for-sender t) 298 (setq notmuch-draft-folder "drafts")) 299 300 (setq-default c-basic-offset 4 301 c-default-style '((java-mode . "java") 302 (awk-mode . "awk") 303 (other . "bsd"))) 304 305 (use-package web-mode 306 :ensure t) 307 ;; :hook 308 ;; (web-mode . (lambda () 309 ;; (setq tab-width 2 310 ;; web-mode-style-padding 2 311 ;; web-mode-script-padding 2 312 ;; web-mode-markup-indent-offset 2 313 ;; web-mode-code-indent-offset 2 314 ;; setq web-mode-css-indent-offset 2)))) 315 316 (defun jrk/eshell () 317 "Open eshell in other window" 318 (interactive) 319 (split-window-sensibly) 320 (other-window 1) 321 (eshell)) 322 323 (defun jrk/indent-buffer () 324 "Run indent-region on entire buffer" 325 (interactive) 326 (indent-region (point-min) (point-max) nil)) 327 ;; (add-hook 'before-save-hook 'indent-buffer) 328 329 (defun jrk/find-corresponding-file () 330 "Find the file that corresponds to this one." 331 (interactive) 332 (setq CorrespondingFileName nil) 333 (setq BaseFileName (file-name-sans-extension buffer-file-name)) 334 (if (string-match "\\.c" buffer-file-name) 335 (setq CorrespondingFileName (concat BaseFileName ".h"))) 336 (if (string-match "\\.h" buffer-file-name) 337 (if (file-exists-p (concat BaseFileName ".c")) 338 (setq CorrespondingFileName (concat BaseFileName ".c")) 339 (setq CorrespondingFileName (concat BaseFileName ".cpp")))) 340 (if (string-match "\\.hin" buffer-file-name) 341 (setq CorrespondingFileName (concat BaseFileName ".cin"))) 342 (if (string-match "\\.cin" buffer-file-name) 343 (setq CorrespondingFileName (concat BaseFileName ".hin"))) 344 (if (string-match "\\.cpp" buffer-file-name) 345 (setq CorrespondingFileName (concat BaseFileName ".h"))) 346 (if CorrespondingFileName (find-file CorrespondingFileName) 347 (error "Unable to find a corresponding file"))) 348 349 (defun jrk/find-corresponding-file-other-window () 350 "Finds the file that corresponds to this and opens it in the other window." 351 (interactive) 352 (find-file-other-window buffer-file-name) 353 (find-corresponding-file)) 354 355 (defun jrk/gud () 356 "Run gud-gdb in other window" 357 (interactive) 358 (let* ((files (directory-files (file-name-directory buffer-file-name))) 359 (input (completing-read "executable: " files))) 360 (split-window-sensibly) 361 (other-window 1) 362 (gud-gdb (concat "gdb --fullname " input)))) 363 364 ;; Sets the default compile command based on OS 365 (if (string= system-type "windows-nt") 366 (setq compile-command "build.bat") 367 (setq compile-command "./build.sh")) 368 369 (defun jrk/disable-all-themes () 370 "Disables all active themes." 371 (interactive) 372 (dolist (i custom-enabled-themes) 373 (disable-theme i))) 374 375 (defun jrk/load-theme-proper () 376 "Disables all active themes and loads new one" 377 (interactive) 378 (let ((theme (completing-read "Load custom theme: " (custom-available-themes)))) 379 (jrk/disable-all-themes) 380 (load-theme (intern theme) t))) 381 382 (defun jrk/update-theme () 383 "Set theme based on time of day" 384 (interactive) 385 (let ((hour (nth 2 (parse-time-string (current-time-string))))) 386 (disable-all-themes) 387 (if (and (> hour 9) 388 (< hour 18)) 389 (load-theme 'zenburn t) 390 (load-theme 'gruber-darker t)))) 391 392 (defun jrk/swap-theme () 393 "Swaps theme to either zenburn or gruber-darker" 394 (interactive) 395 (let ((theme (nth 0 custom-enabled-themes))) 396 (disable-all-themes) 397 (if (string= theme "gruber-darker") 398 (load-theme 'zenburn t) 399 (load-theme 'gruber-darker t)))) 400 401 (defun jrk/transparency (value) 402 "Sets the transparency of the frame window. 0=transparent/100=opaque" 403 (interactive "nTransparency Value 0 - 100 opaque: ") 404 (set-frame-parameter (selected-frame) 'alpha-background value)) 405 406 (defun jrk/toggle-big-font () 407 "Toggles on/off a bigger font for hidpi or presentations" 408 (interactive) 409 (if (eq (aref (font-info (face-attribute 'default :font)) 2) (* 2 jrk/font-size)) 410 (setq jrk/font (concat jrk/font-name (number-to-string jrk/font-big-size))) 411 (setq jrk/font (concat jrk/font-name (number-to-string jrk/font-size)))) 412 (set-frame-font jrk/font)) 413 414 (defun jrk/meow-setup-colemakdh () 415 (setq meow-cheatsheet-layout meow-cheatsheet-layout-colemak-dh) 416 (meow-motion-overwrite-define-key 417 '("i" . meow-prev) 418 '("e" . meow-next) 419 '(";" . meow-temp-normal) 420 '("/" . meow-visit) 421 '("v" . meow-search) 422 '("<escape>" . ignore)) 423 (meow-leader-define-key 424 '("?" . meow-cheatsheet) 425 '("." . find-file) 426 '("," . switch-to-buffer) 427 '(">" . find-file-other-window) 428 '("<" . switch-to-buffer-other-window) 429 '("q" . compile) 430 '("d" . dired-jump) 431 '("o" . other-window) 432 '("1" . meow-digit-argument) 433 '("2" . meow-digit-argument) 434 '("3" . meow-digit-argument) 435 '("4" . meow-digit-argument) 436 '("5" . meow-digit-argument) 437 '("6" . meow-digit-argument) 438 '("7" . meow-digit-argument) 439 '("8" . meow-digit-argument) 440 '("9" . meow-digit-argument) 441 '("0" . meow-digit-argument)) 442 (meow-normal-define-key 443 '("0" . meow-expand-0) 444 '("1" . meow-expand-1) 445 '("2" . meow-expand-2) 446 '("3" . meow-expand-3) 447 '("4" . meow-expand-4) 448 '("5" . meow-expand-5) 449 '("6" . meow-expand-6) 450 '("7" . meow-expand-7) 451 '("8" . meow-expand-8) 452 '("9" . meow-expand-9) 453 '("-" . negative-argument) 454 '(";" . meow-reverse) 455 '("," . meow-inner-of-thing) 456 '("." . meow-bounds-of-thing) 457 '("[" . meow-beginning-of-thing) 458 '("]" . meow-end-of-thing) 459 '("/" . meow-visit) 460 '("a" . meow-append) 461 '("A" . meow-open-below) 462 '("b" . meow-back-word) 463 '("B" . meow-back-symbol) 464 '("c" . meow-change) 465 '("i" . meow-prev) 466 '("I" . join-line) 467 '("f" . meow-find) 468 '("g" . meow-cancel-selection) 469 '("G" . meow-grab) 470 '("n" . meow-left) 471 '("N" . meow-left-expand) 472 '("o" . meow-right) 473 '("O" . meow-right-expand) 474 '("j" . meow-join) 475 '("k" . meow-kill) 476 '("l" . meow-line) 477 '("L" . meow-goto-line) 478 '("h" . meow-mark-word) 479 '("H" . meow-mark-symbol) 480 '("e" . meow-next) 481 '("E" . meow-next-expand) 482 '("m" . meow-block) 483 '("M" . meow-to-block) 484 '("p" . meow-yank) 485 '("q" . meow-quit) 486 '("r" . meow-replace) 487 '("s" . meow-insert) 488 '("S" . meow-open-above) 489 '("t" . meow-till) 490 '("u" . meow-undo) 491 '("U" . meow-undo-in-selection) 492 '("v" . meow-search) 493 '("w" . meow-next-word) 494 '("W" . meow-next-symbol) 495 '("x" . meow-delete) 496 '("X" . meow-backward-delete) 497 '("y" . meow-save) 498 '("z" . meow-pop-selection) 499 '("'" . repeat) 500 '("<escape>" . ignore))) 501 502 (global-set-key (kbd "M-n") 'next-error) 503 (global-set-key (kbd "M-p") 'previous-error) 504 (global-set-key (kbd "<f2>") 'olivetti-mode) 505 506 (use-package meow 507 :ensure t 508 :config 509 (add-to-list 'meow-mode-state-list '(notmuch-hello-mode . motion)) 510 (add-to-list 'meow-mode-state-list '(notmuch-search-mode . motion)) 511 (add-to-list 'meow-mode-state-list '(godoc-mode . normal)) 512 (add-to-list 'meow-mode-state-list '(ediff-mode . insert)) 513 (setq meow-use-clipboard t) 514 (setq meow-keypad-self-insert-undefined nil) 515 (jrk/meow-setup-colemakdh) 516 (meow-setup-indicator) 517 (meow-global-mode 1)) 518 519 (setq jrk/mpv-cmd "mpv") 520 (setq jrk/ytdlp-cmd "yt-dlp") 521 (setq jrk/ytdlp-cmd-args '("--embed-chapters" "--sponsorblock-remove" "Sponsor" "-P" "~/videos")) 522 523 (defun jrk/elfeed-show-running-cmd () 524 (let ((cmd browse-url-generic-program) 525 (args browse-url-generic-args) 526 (format-str "opening with %s") 527 (arg-str "")) 528 (dolist (arg args) 529 (setf arg-str (concat arg-str " " arg))) 530 (message (format format-str 531 (concat cmd arg-str))))) 532 533 (defun jrk/clear-browse-url-progam () 534 (setq browse-url-generic-program nil) 535 (setq browse-url-generic-args nil)) 536 537 (defun jrk/elfeed-show-open-mpv () 538 (interactive) 539 (setq browse-url-generic-program jrk/mpv-cmd) 540 (jrk/elfeed-show-running-cmd) 541 (elfeed-show-visit 1) 542 (jrk/clear-browse-url-progam)) 543 544 (defun jrk/elfeed-search-open-mpv () 545 (interactive) 546 (setq browse-url-generic-program jrk/mpv-cmd) 547 (jrk/elfeed-show-running-cmd) 548 (elfeed-search-browse-url 1) 549 (jrk/clear-browse-url-progam)) 550 551 (defun jrk/elfeed-show-open-ytdlp () 552 (interactive) 553 (setq browse-url-generic-program jrk/ytdlp-cmd) 554 (setq browse-url-generic-args jrk/ytdlp-cmd-args) 555 (jrk/elfeed-show-running-cmd) 556 (elfeed-show-visit 1) 557 (jrk/clear-browse-url-progam)) 558 559 (defun jrk/elfeed-search-open-ytdlp () 560 (interactive) 561 (setq browse-url-generic-program jrk/ytdlp-cmd) 562 (setq browse-url-generic-args jrk/ytdlp-cmd-args) 563 (jrk/elfeed-show-running-cmd) 564 (elfeed-search-browse-url 1) 565 (jrk/clear-browse-url-progam)) 566 567 (use-package elfeed 568 :ensure t 569 :bind 570 (("C-c r" . elfeed) 571 :map elfeed-show-mode-map 572 ("m" . jrk/elfeed-show-open-mpv) 573 ("d" . jrk/elfeed-show-open-ytdlp) 574 575 :map elfeed-search-mode-map 576 ("m" . jrk/elfeed-search-open-mpv) 577 ("d" . jrk/elfeed-search-open-ytdlp) 578 579 ) 580 :config 581 (setq elfeed-feeds 582 '( 583 ("https://www.youtube.com/feeds/videos.xml?channel_id=UCLtREJY21xRfCuEKvdki1Kw" youtube) 584 ("https://www.youtube.com/feeds/videos.xml?channel_id=UCqNpjt_UcMPgm_9gphZgHYA" youtube) 585 ("https://www.youtube.com/feeds/videos.xml?channel_id=UCk9RA3G-aVQXvp7-Q4Ac9kQ" youtube) 586 587 ("https://suckless.org/atom.xml" suckless news) 588 ("https://www.gentoo.org/feeds/news.xml" gentoo news) 589 ("https://voidlinux.org/atom.xml" void news) 590 ) 591 )) 592 593 (defun send-cmd-to-geiser-repl (cmd) 594 "Sends a cmd to the current geiser repl" 595 (geiser-repl--switch-to-repl) 596 (geiser-repl--send cmd)) 597 598 (defun geiser-load-current-buffer-in-repl () 599 "Loads current buffer into the current geiser repl" 600 (interactive) 601 (send-cmd-to-geiser-repl (concat ",load " (buffer-file-name)))) 602 603 ;; Startup time 604 ;; (defun efs/display-startup-time () 605 ;; (message 606 ;; "Emacs loaded in %s with %d garbage collections." 607 ;; (format 608 ;; "%.2f seconds" 609 ;; (float-time 610 ;; (time-subtract after-init-time before-init-time))) 611 ;; gcs-done)) 612 ;; (add-hook 'emacs-startup-hook #'efs/display-startup-time)