dotfiles

my active dotfiles
git clone git://git.jakekoroman.com/dotfiles
Log | Files | Refs | README

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)