aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doom/.config/doom/config.el716
-rw-r--r--doom/.config/doom/config.org1604
-rw-r--r--doom/.config/doom/config.org.bak1219
-rw-r--r--doom/.config/doom/custom.el47
-rw-r--r--doom/.config/doom/extra-themes/2026-09-18-213348_1916x1052_scrot.pngbin166487 -> 0 bytes
-rw-r--r--doom/.config/doom/extra-themes/evergarden-common.el315
-rw-r--r--doom/.config/doom/extra-themes/evergarden-fall-theme.el176
-rw-r--r--doom/.config/doom/extra-themes/evergarden-spring-theme.el176
-rw-r--r--doom/.config/doom/extra-themes/evergarden-summer-theme.el176
-rw-r--r--doom/.config/doom/extra-themes/evergarden-theme.el445
-rw-r--r--doom/.config/doom/extra-themes/evergarden-winter-theme.el176
-rw-r--r--doom/.config/doom/extra-themes/fortune-gold-theme.el499
-rw-r--r--doom/.config/doom/init.el202
-rw-r--r--doom/.config/doom/packages.el40
-rw-r--r--doom/.config/doom/splash.el55
15 files changed, 0 insertions, 5846 deletions
diff --git a/doom/.config/doom/config.el b/doom/.config/doom/config.el
deleted file mode 100644
index 6554431..0000000
--- a/doom/.config/doom/config.el
+++ /dev/null
@@ -1,716 +0,0 @@
-(load! "splash")
-(defun +splash-initial-buffer ()
- (splash-screen)
- (get-buffer "*splash*"))
-
-(setq doom-fallback-buffer-name "*splash*" ; make the splash screen be un-killable
- initial-buffer-choice #'+splash-initial-buffer) ; appear on emacs startup
-
-(defadvice! +splash-regenerate-if-missing-a (&rest _)
- :before #'doom-fallback-buffer
- (unless (get-buffer "*splash*")
- (splash-screen)))
-
-(add-to-list 'custom-theme-load-path
- "~/.config/doom/extra-themes/")
-;; (setq doom-theme 'modus-vivendi)
-;; (setq doom-theme 'doric-oak)
-(setq doom-theme 'doric-obsidian)
-;; (setq doom-theme 'tango)
-
-(setq custom-safe-themes t)
-
-(setq doom-font (font-spec :family "Berkeley Mono" :size 13.0))
-
-(setq display-line-numbers-type t)
-
-;; (use-package! mood-line
-;; :config
-;; (mood-line-mode)
-;; :custom
-;; (mood-line-glyph-alist mood-line-glyphs-fira-code))
-
-(use-package! minions
- :config
- (minions-mode 1))
-
-(defun my/split-window-dynamically ()
- "Split the selected window, choosing orientation by its shape."
- (interactive)
- (select-window
- (if (> (window-total-width) (* 2 (window-total-height)))
- (split-window-right)
- (split-window-below))))
-
-(map! :leader "w s" #'my/split-window-dynamically)
-
-(setq scroll-margin 3)
-
-(use-package! breadcrumb
- :defer t
- :hook
- (prog-mode . breadcrumb-mode) ;; make sure its in programming modes
- :config
- (breadcrumb-mode 1))
-
-(setq +zen-mixed-pitch-modes '())
-
-(use-package! vertico-carousel
- :config
- (vertico-carousel-mode 1))
-
-(defun my/hs-eval ()
- (interactive)
- (let* ((src (buffer-file-name))
- (out (file-name-sans-extension src)))
- (when (zerop (call-process-shell-command
- (format "runghc %s" src) nil "*runghc-output*"))
- (let ((buf (make-comint "hs-run" out)))
- (display-buffer buf)))))
-
-(add-hook 'haskell-mode-hook
- (lambda ()
- (local-set-key (kbd "<f5>") #'my/hs-eval)))
-
-(add-to-list 'major-mode-remap-alist '(html-mode . mhtml-ts-mode))
-(add-to-list 'major-mode-remap-alist '(mhtml-mode . mhtml-ts-mode))
-
-(add-to-list 'auto-mode-alist '("\\.html?\\'" . mhtml-ts-mode))
-(add-to-list 'major-mode-remap-alist '(html-mode . mhtml-ts-mode))
-(add-to-list 'major-mode-remap-alist '(mhtml-mode . mhtml-ts-mode))
-
-(advice-add 'web-mode :around
- (lambda (orig &rest args)
- (if (or (null buffer-file-name)
- (string-match-p "\\.html?\\'" buffer-file-name))
- (mhtml-ts-mode)
- (apply orig args))))
-
-(use-package! eglot
- :hook
- (prog-mode . eglot-ensure))
-
-(use-package! eglot-booster
- :after eglot
- :config (eglot-booster-mode))
-
-(after! eglot
- (cl-defmethod eglot-register-capability
- ((_server eglot-lsp-server)
- (method (eql workspace/didChangeWatchedFiles))
- _id
- &key _watchers)
- nil)
-
-(add-to-list 'eglot-server-programs
- '((typescript-ts-mode javascript-mode)
- . ("emacs-lsp-booster" "--" "oxlint" "--lsp"))))
-
-(setq eglot-sync-connect nil
- eglot-connect-timeout 60)
-
-(after! flycheck
- (flycheck-define-checker htmlhint
- "htmlhint for flycheck"
- :command ("htmlhint" "--format" "unix" source)
- :error-patterns
- ((error
- line-start
- (file-name) ":" line ":" column ": "
- (message) line-end))
- :modes (mhtml-ts-mode))
-
-(add-to-list 'flycheck-checkers 'htmlhint)
-
-(flycheck-add-next-checker
- 'javascript-eslint
- 'javascript-oxlint)
-(flycheck-add-next-checker
- 'html-tidy
- 'htmlhint)
-
-(setq flycheck-check-syntax-automatically
- '(save mode-enabled)))
-
-(use-package! apheleia
- :hook
- (prog-mode . apheleia-mode)
-
-:config
-(setf (alist-get 'oxfmt apheleia-formatters)
- '("oxfmt" "--config=.oxfmtrc.json" "--stdin-filepath" filepath))
-
-(dolist (mode '(mhtml-ts-mode html-mode mhtml-mode web-mode css-mode))
- (setf (alist-get mode apheleia-mode-alist) 'oxfmt)))
-
-(add-hook 'mhtml-ts-mode-hook #'apheleia-mode)
-
-(use-package! pinentry
- :config
- (pinentry-start))
-(setq epg-pinentry-mode 'loopback)
-
-(setq auth-sources '("~/.authinfo.gpg"))
-
-(setq auth-source-cache-expiry nil)
-
-(setq gnus-permanently-visible-groups ".")
-
-(evil-set-initial-state 'gnus-browse-mode 'emacs)
-
-(setq user-mail-address "hi@roughlynamed.net" ; my email
- user-full-name "Magdalena Szweda") ; my name
-
-(setq mml-secure-openpgp-signers
- '("B9CF59FE57835F89ECB33FD417CA809770F85511")
- mml-secure-openpgp-sign-with-sender t)
-
-(setq message-signature-file "~/.signature") ; note no trailing slash
-
-(setq gnus-select-method
- '(nnimap "migadu"
- (nnimap-address "imap.migadu.com")
- (nnimap-server-port 993)
- (nnimap-stream ssl)))
-
-(setq smtpmail-smtp-server "smtp.migadu.com"
- smtpmail-smtp-service 465 ; port 465
- smtpmail-stream-type 'ssl
- message-send-mail-function #'smtpmail-send-it
- )
-
-(setq gnus-message-archive-method '(nnimap "migadu") ; use migadu for archiving email
- gnus-message-archive-group "Sent") ; where to put sent mail
-
-(setq gnus-large-newsgroup nil
- gnus-fetch-old-headers t
- nnmail-expiry-target "Trash")
-
-(setq gnus-thread-sort-functions
- '((not gnus-thread-sort-by-date)))
-
-(setq gnus-subthread-sort-functions
- '((not gnus-thread-sort-by-date)))
-(setq gnus-thread-sort-most-recent-first t)
-
-(setq gnus-always-read-dribble-file nil)
-
-(add-hook 'message-send-hook #'mml-secure-message-sign-pgpmime)
-
-(with-eval-after-load "mm-decode"
- (add-to-list 'mm-discouraged-alternatives "text/html")
- (add-to-list 'mm-discouraged-alternatives "text/richtext"))
-
-(map!
- :leader
- :prefix "o"
- :desc "Mail" "m" #'gnus)
-
-(use-package! jabber
- :config
-
-(setq jabber-account-list
- '(
- ;; ("roughlynamed@yax.im")
- ("wildebeest@yax.im")))
-
-(jabber-modeline-mode 1)
-
-:hook
-(kill-emacs . jabber-disconnect))
-
-(map! :leader
- :prefix "j"
- :desc "Connect" "c" #'jabber-connect-all
- :desc "Disconnect" "q" #'jabber-disconnect
- :desc "Dash" "f" #'jabber-roster
- :desc "Reply" "r" #'jabber-chat-reply
- :desc "New chat" "n" #'jabber-chat-with
- :desc "Set status" "s" #'jabber-send-presence)
-
-(add-to-list 'load-path "/home/hi/.config/doom/")
-(use-package! emms
-:commands (emms emms-browser emms-player-mpd-update-all emms-cache-set-from-mpd-all emms emms-pause emms-next emms-previous emms-stop
- emms-random emms-add-directory-tree emms-play-playlist)
-
-:init
-(map! :leader
- (:prefix ("e" . "emms")
- :desc "Browser" "b" #'emms-browser
- :desc "Emms" "e" #'emms
- :desc "Play/pause" "SPC" #'emms-pause
- :desc "Next" "n" #'emms-next
- :desc "Previous" "p" #'emms-previous
- :desc "Stop" "s" #'emms-stop
- :desc "Add" "a" #'emms-add-playlist
- :desc "Clear" "c" #'emms-playlist-clear))
-
-:config
-(require 'emms-setup)
-
-(emms-all)
-
-(require 'emms-player-xmms2)
-(setq
- emms-player-list '(emms-player-xmms2)
-
-emms-lyrics-scroll-p nil
-emms-lyrics-display-on-minibuffer t
-emms-lyrics-display-on-modeline nil
-
-emms-player-mpd-music-directory "~/Music"
-emms-source-file-default-directory (expand-file-name "~/Music/playlists/")
-
-emms-repeat-playlist t
-
-emms-cache-file (concat doom-cache-dir "emms-cache"))
-
-(emms-mode-line-mode 1)
-
-(emms-playing-time-mode 1)
-
-(map! :map emms-browser-mode-map
- :n "RET" #'emms-browser-add-tracks-and-play))
-
-(map!
- :leader
- :prefix "v"
- :desc "vc-edit-next-command" "!" #'vc-edit-next-command
- :desc "diff-hl-show-hunk" "*" #'diff-hl-show-hunk
- :desc "vc-update" "+" #'vc-update
- :desc "diff-hl-goto-hunk" "=" #'diff-hl-diff-goto-hunk
- :desc "vc-revert" "@" #'vc-revert
- :desc "vc-update-change-log" "a" #'vc-update-change-log
- ;; ADD b BINDINGS (branch)
- :desc "vc-dir" "d" #'vc-dir
- :desc "vc-root-diff" "D" #'vc-root-diff
- ;; ADD E BINDINGS
- :desc "annotate" "g" #'vc-annotate
- :desc "ignore" "G" #'vc-ignore
- :desc "region history" "h" #'vc-region-history
- :desc "register" "i" #'vc-register
- :desc "root log incoming" "I" #'vc-root-log-incoming
- :desc "print log" "l" #'vc-print-log
- :desc "print root log" "L" #'vc-print-root-log
- :desc "merge" "m" #'vc-merge
- ;; ADD M BINDINGS
- :desc "diff revert hunk" "n" #'diff-hl-revert-hunk
- :desc "root log outgoing" "O" #'vc-root-log-outgoing
- :desc "push" "p" #'vc-push ; originally P
- :desc "retrieve tag" "r" #'vc-retrieve-tag
- :desc "rename file" "R" #'vc-rename-file
- :desc "create tag" "s" #'vc-create-tag
- :desc "stage dwim (diff hl)" "S" #'diff-hl-stage-dwim
- ;; ADD T BINDINGS
- :desc "vc revert" "u" #'vc-revert ; carried over from the original bindings (repeated by @)
- :desc "vc next action" "v" #'vc-next-action ; run the next logical action
- ;; ADD w BINDINGS
- :desc "revision other window" "~" #'vc-revision-other-window)
-
-(use-package! vc-jj)
-
-(after! vc-jj
- (defvar my/vc-jj-advance-to nil)
-
- (defun my/vc-jj-bookmark-advance (&optional names)
- "Advance the closest bookmarks (or just NAMES) forward."
- (interactive
- (when current-prefix-arg
- (list (completing-read-multiple
- "Advance bookmarks: "
- (vc-jj--process-lines
- nil "bookmark" "list"
- "-T" "if(!self.remote(), self.name() ++ '\n')")))))
- (with-temp-buffer
- (let ((status (apply #'vc-jj--call nil t "bookmark" "advance"
- (append (when my/vc-jj-advance-to
- (list "--to" my/vc-jj-advance-to))
- names))))
- (message "vc-jj: %s" (string-trim (buffer-string)))
- status)))
-
- (defun my/vc-jj--advance-before-push (&rest _)
- (my/vc-jj-bookmark-advance))
- (advice-add 'vc-jj-push :before #'my/vc-jj--advance-before-push)
- (setq my/vc-jj-advance-to "@-")
-
- (defun my/vc-jj-checkin (files comment &optional _rev)
- "Describe @ and start a fresh change."
- (let ((default-directory (vc-jj-root (car files))))
- (vc-jj-modify-change-comment nil "@" comment)
- (vc-jj--command-dispatched nil 0 nil "new" "--quiet")))
- (advice-add 'vc-jj-checkin :override #'my/vc-jj-checkin))
-
-(after! vc-jj
- (add-to-list 'display-buffer-alist
- '("\\`\\*vc-jj : "
- (display-buffer-no-window)
- (allow-no-window . t)))
-
- (defun my/vc-jj--report-push (&rest _)
- (when-let* ((root (vc-jj-root default-directory))
- (buf (get-buffer (format "*vc-jj : %s*" (expand-file-name root))))
- (proc (get-buffer-process buf)))
- (add-function
- :around (process-sentinel proc)
- (lambda (orig p event)
- (unwind-protect (funcall orig p event)
- (when (memq (process-status p) '(exit signal))
- (if (zerop (process-exit-status p))
- (message "vc-jj: push done")
- (message "vc-jj: push FAILED, output below")
- (let ((display-buffer-alist nil))
- (pop-to-buffer buf)))))))))
- (defvar vc--inhibit-async-window)
-
- (defun my/vc-jj--push-no-window (orig &rest args)
- (let ((vc--inhibit-async-window t))
- (apply orig args)))
-
- (advice-add 'vc-jj-push :around #'my/vc-jj--push-no-window)
- (advice-add 'vc-jj-push :after #'my/vc-jj--report-push)
- (define-advice ansi-color-filter-region (:around (fn &rest args) my/vc-jj-writable)
- (let ((inhibit-read-only (or inhibit-read-only
- (string-prefix-p "*vc-jj" (buffer-name)))))
- (apply fn args))))
-
-(setq org-directory "~/org/")
-(setq org-agenda-files "~/org/todo.org")
-
-(after! org
- (setq
- org-startup-folded t ; fold headers on startup
- org-pretty-entities t
- org-hide-emphasis-markers t
- org-auto-align-tags nil
- org-tags-column 0
- org-catch-invisible-edits 'show-and-error
- org-agenda-tags-column 0
- org-capture-templates-contexts nil
- org-insert-heading-respect-content t
- org-special-ctrl-a/e t
- org-return-follows-link t
-
-org-confirm-babel-evaluate nil)
-(org-babel-do-load-languages
- 'org-babel-load-languages
- '((emacs-lisp . t)
- (python . t)
- (C . t)
- (lisp . t))))
-
-(use-package! poly-org
- :hook (org-mode . poly-org-mode))
-
-(add-hook 'org-src-mode-hook #'eglot-ensure)
-
-(setq org-element-use-cache nil)
-
-(add-hook 'org-capture-mode-hook #'delete-other-windows)
-(add-hook 'org-capture-mode-hook
- (lambda () (set-window-dedicated-p (selected-window) nil)))
-
-(after! org-roam
- (setq org-roam-directory (file-truename "~/org/"))
-
-(org-roam-db-autosync-mode)
-
-(defun my/org-roam-short-id ()
- (let ((chars "abcdefghijklmnopqrstuvwxyz0123456789"))
- (apply #'string
- (cl-loop repeat 4
- collect (aref chars (random (length chars)))))))
-
-(setq org-roam-capture-templates
- '(("d" "default" plain
- "* %?"
- :if-new
-
-(file+head
- (lambda () (concat (my/org-roam-short-id) ".org"))
- "#+TITLE: %^{title|Untitled}\n#+FILETAGS: :%^{tags}:\n\n") ; title&tags
- :unnarrowed t)))
-
-(cl-defmethod org-roam-node-file-stem ((node org-roam-node))
- (file-name-base (org-roam-node-file node)))
-
-(setq org-roam-node-display-template
- (concat "${title:*} " (propertize "${file-stem}" 'face 'org-tag)))
-
-(setq org-roam-mode-sections
- '(org-roam-backlinks-section
- org-roam-reflinks-section
- org-roam-unlinked-references-section))
-
-(defun my/org-roam-check-self-link ()
- (when-let* ((node (org-roam-node-at-point))
- (id (org-roam-node-id node)))
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward org-link-any-re nil t)
- (when (string-match-p (regexp-quote id) (match-string 0))
- (message "Warning: self-link detected"))))))
-
-(defun my/org-roam-check-dead-links ()
- (dolist (link (org-roam-db-query
- [:select [dest] :from links
- :where (= source $s1)] (org-roam-id-at-point)))
- (unless (org-roam-db-query [:select id :from nodes :where (= id $s1)] (car link))
- (message "Error: dead link to %s" (car link)))))
-
-(add-hook 'before-save-hook
- (lambda ()
- (when (org-roam-file-p)
- (my/org-roam-check-self-link)
- (my/org-roam-check-dead-links)))
- nil t)
-
-(map!
- :leader
- :prefix ("n r" . "roam")
- :desc "Find node" "f" #'org-roam-node-find ; 'zk edit -i' equivalent
- :desc "Insert node" "i" #'org-roam-node-insert ; link a note
- :desc "Backlinks" "b" #'org-roam-buffer-toggle
- :desc "Capture" "c" #'org-roam-capture ; make a new note
-
-:desc "Graph" "g" #'org-roam-graph ; graph of every note
-
-:desc "Random node" "r" #'org-roam-node-random ; random node
-:desc "Open link" "o" #'org-open-at-point ; open linked note under cursor
-:desc "Jump back" "O" #'org-mark-ring-goto)) ; jump back to previous note after SPC n r o
-
-(with-eval-after-load 'ox-html
- (setq org-html-xml-declaration nil
- org-html-doctype "html5"
- org-html-html5-fancy t
-
-org-html-head-include-default-style nil
-
-org-html-postamble nil))
-
-(use-package! websocket :after org-roam)
-
-(use-package! org-roam-ui
- :after org-roam
- :config
- (setq org-roam-ui-sync-theme t ; use emacs theme
- org-roam-ui-follow t
- org-roam-ui-update-on-save t ; update when a org roam file is saved
- ))
-
-(use-package! org-appear
- :hook (org-mode . org-appear-mode)
- :config
- (setq org-appear-autoemphasis t
- org-appear-autolinks t
- org-appear-autosubmarkers t
- org-appear-autoentities t))
-
-(use-package! org-modern-indent
- :defer t
- :hook (org-mode . org-modern-indent-mode))
-
-(setq eww-search-prefix "https://ecosia.org/search?q=")
-
-(setq eww-download-directory (expand-file-name "~/Downloads/"))
-
-(defun my-browse-url-mpv (url &rest _args)
- "Open URL in mpv."
- (start-process "mpv" nil "mpv" url))
-
-(defun my-browse-url-pdf (url &rest _args)
- "Fetch remote PDF and open in pdf-tools within Emacs."
- (let ((tmp (make-temp-file "emacs-pdf-" nil ".pdf")))
- (url-copy-file url tmp t)
- (find-file-other-window tmp)
- (pdf-view-mode)))
-
-(defun my/eww-download-image-at-point ()
- (interactive)
- (let ((url (or (get-text-property (point) 'image-url)
- (get-text-property (point) 'shr-url))))
- (if (not url)
- (message "No image at point")
- (let* ((filename (file-name-nondirectory (url-filename (url-generic-parse-url url))))
- (dest (expand-file-name filename eww-download-directory)))
- (url-copy-file url dest t)
- (message "Saved: %s" dest)))))
-
-(setq browse-url-handlers
- '(("\\(youtube\\.com\\|youtu\\.be\\|vimeo\\.com\\|twitch\\.tv\\)" . my-browse-url-mpv)
- ("\\.mp4$" . my-browse-url-mpv)
- ("\\.pdf$" . my-browse-url-pdf)
- ("^gemini://" . elpher-browse-url-elpher)
- ("^gopher://" . elpher-browse-url-elpher)
- ("." . eww-browse-url)))
-
-(setq browse-url-secondary-browser-function 'browse-url-generic
- browse-url-generic-program "vivaldi")
-
-(setq shr-width 100)
-(setq shr-max-width 120)
-(setq shr-indentation 4)
-(setq shr-use-fonts nil)
-(setq shr-max-image-size '(800 . 600))
-(setq shr-image-animate t)
-
-(add-hook 'eww-after-render-hook #'eww-readable)
-
-(with-eval-after-load 'eww
- (define-key eww-mode-map (kbd "=") #'text-scale-increase)
- (define-key eww-mode-map (kbd "-") #'text-scale-decrease)
- (define-key eww-mode-map (kbd "0") #'text-scale-adjust)
- (define-key eww-mode-map (kbd "b") #'eww-back-url)
- (define-key eww-mode-map (kbd "a") #'eww-add-bookmark)
- (define-key eww-mode-map (kbd "U") #'shr-copy-url)
- (define-key eww-mode-map (kbd "D") #'my/eww-download-image-at-point)
- (evil-define-key 'normal eww-mode-map
- "b" #'eww-back-url
- "a" #'eww-add-bookmark
- "U" #'shr-copy-url
- "D" #'my/eww-download-image-at-point))
-
-(provide 'browser)
-
-(use-package! elpher)
-
-(map!
- :leader
- :prefix "o g"
- :desc "Elpher" "e" #'elpher
- :desc "Browse Elpher" "b" #'elpher-browse-url-elpher)
-
-(map!
- :leader
- :prefix "o"
- :desc "Woman" "w" #'woman)
-
-(map!
- :leader
- :prefix ("d" . "dired")
- :desc "Dired" "d" #'dired
- :desc "Dired here" "h" #'dired-jump)
-
-(use-package! eat
- :defer t)
-
-(map!
- :leader
- :prefix "o"
- :desc "Open Eat" "e" #'eat-other-window) ; dont steal the current window
-
-(use-package! nov
- :mode ("\\.epub\\'" . nov-mode)
- :config
- (setq nov-text-width 80
- nov-variable-pitch t)
- (add-hook 'nov-mode-hook
- (lambda ()
- (face-remap-add-relative 'variable-pitch
- :family "Georgia" :height 1.3))) ; different font for reading
- (add-hook 'nov-mode-hook #'writeroom-mode) ; center text & stuff
-
-(map! :map nov-mode-map
- :n "i" #'nov-scroll-up ; scroll roughly a page up
- :n "e" #'nov-scroll-down ; scroll roughly a page down
- :n "]" #'nov-next-document
- :n "[" #'nov-previous-document
- :n "t" #'nov-goto-toc))
-
-(with-eval-after-load 'tramp
- (add-to-list 'tramp-methods
- '("doas"
- (tramp-login-program "doas")
- (tramp-login-args (("-u" "%u") ("-s")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-connection-timeout 10))))
-
-(remove-hook 'doom-first-input-hook #'evil-snipe-mode)
-
-(use-package lispyville
- :init
- (general-add-hook '(emacs-lisp-mode-hook lisp-mode-hook) #'lispyville-mode) ;; lispy lisps
- :config
- (lispyville-set-key-theme '(operators c-w additional)))
-
-(after! evil-org
- (evil-define-key 'normal evil-org-mode-map
- "o" #'evil-forward-char))
-
-(evil-define-key '(normal visual operator) 'global
- "n" 'evil-backward-char
- "e" 'evil-next-line
- "i" 'evil-previous-line
- "o" 'evil-forward-char)
-
-(evil-define-key '(normal visual operator) 'global
- "l" 'evil-backward-word-begin
- "L" 'evil-backward-WORD-begin
- "u" 'evil-forward-word-end
- "U" 'evil-forward-WORD-end
- "y" 'evil-forward-word-begin
- "Y" 'evil-forward-WORD-begin)
-
-(with-eval-after-load 'evil-ex
- (define-key evil-ex-completion-map (kbd "C-l") 'left-word)
- (define-key evil-ex-completion-map (kbd "C-y") 'right-word))
-
-(evil-define-key 'normal 'global
- "s" 'evil-insert
- "S" 'evil-insert-line
- "t" 'evil-append
- "T" 'evil-append-line
- "h" 'evil-open-below
- "H" 'evil-open-above)
-
-(evil-define-key '(normal visual) 'global
- "w" 'evil-change
- "W" 'evil-change-line)
-
-(evil-define-key 'normal 'global
- "x" 'evil-delete-char
- "c" 'evil-yank
- "v" 'evil-paste-after
- "X" 'evil-delete-line
- "C" 'evil-yank-line
- "V" 'evil-paste-before)
-
-(evil-define-key 'visual 'global
- "x" 'evil-delete
- "c" 'evil-yank
- "v" 'evil-paste-after)
-
-(evil-define-key 'normal 'global
- "z" 'evil-undo
- "Z" 'evil-redo)
-
-(evil-define-key 'normal 'global
- "a" 'evil-visual-char
- "A" 'evil-visual-line
- "ga" 'evil-visual-restore)
-
-(evil-define-key '(normal visual operator) 'global
- "p" 'evil-find-char-to
- "P" 'evil-find-char-to-backward
- "b" 'evil-repeat-find-char
- "B" 'evil-repeat-find-char-reverse
- "k" 'evil-search-next
- "K" 'evil-search-previous)
-
-(with-eval-after-load 'evil
- (evil-define-key '(operator visual) 'global "r" evil-inner-text-objects-map))
-
-(define-prefix-command 'my-colemak-fold-map)
-(evil-define-key '(normal visual) 'global "j" 'my-colemak-fold-map)
-(define-key my-colemak-fold-map "j" 'evil-scroll-line-to-center)
-(define-key my-colemak-fold-map "n" 'evil-scroll-line-to-top)
-(define-key my-colemak-fold-map "e" 'evil-scroll-line-to-bottom)
-
-(evil-define-key 'normal 'global
- "gK" 'evil-lookup)
-
-(map! :n "SPC w n" #'evil-window-left
- :n "SPC w e" #'evil-window-down
- :n "SPC w i" #'evil-window-up
- :n "SPC w o" #'evil-window-right)
diff --git a/doom/.config/doom/config.org b/doom/.config/doom/config.org
deleted file mode 100644
index 28d95bb..0000000
--- a/doom/.config/doom/config.org
+++ /dev/null
@@ -1,1604 +0,0 @@
-#+TITLE: Literate DOOM Emacs configuration
-#+begin_src emacs-lisp :tangle ~/.config/doom/emms-player-xmms2.el
-;;; emms-player-xmms2.el --- XMMS2 player for EMMS -*- lexical-binding: t; -*-
-
-Emacs is a great operating system.
-But every operating system has 1 essential line of code.
-For us, this line of code is... (drumroll please)
-#+begin_src emacs-lisp
- ;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
-#+end_src
-
-Almost every ~(use-package!)~ block in this literate configuration has a ~(package!)~ block before it, which is tangled into ~$DOOMDIR/packages.el~. This is how Doom Emacs installs it's packages.
-
-
-* TODO Splash screen
-
-Here we load a custom splash screen.
-I still have to put the splash screen source in this org file, but that'll come later
-#+begin_src emacs-lisp
-(load! "splash")
-(defun +splash-initial-buffer ()
- (splash-screen)
- (get-buffer "*splash*"))
-
-(setq doom-fallback-buffer-name "*splash*" ; make the splash screen be un-killable
- initial-buffer-choice #'+splash-initial-buffer) ; appear on emacs startup
-
-(defadvice! +splash-regenerate-if-missing-a (&rest _)
- :before #'doom-fallback-buffer
- (unless (get-buffer "*splash*")
- (splash-screen)))
-#+end_src
-The splash screen doesnt do much, it prints the emacs version and a warranty notice and whatnot. i like it tho!
-
-* UI
-~How Emacs looks!~
-** Theme
-Load the directory with additional, local themes
-This currently mostly loads the emacs port of the Evergarden theme (made by me!)
-at [[https://git.roughlynamed.net/evergarden.git][git.roughlynamed/net/evergarden.git]], also the fortune-gold theme.
-The reason i use modus-vivendi instead of my evergarden port is because i dont like evergarden (dont tell the devs though!), seeing it not have an emacs port just made me sad.
-
-For this to work, we need modus & ef themes installed.
-Doric themes are also nice.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! modus-themes)
-(package! ef-themes)
-(package! doric-themes)
-#+end_src
-
-#+begin_src emacs-lisp
-(add-to-list 'custom-theme-load-path
- "~/.config/doom/extra-themes/")
-;; (setq doom-theme 'modus-vivendi)
-;; (setq doom-theme 'doric-oak)
-(setq doom-theme 'doric-obsidian)
-;; (setq doom-theme 'tango)
-#+end_src
-
-By default, Emacs prompts 2 times when loading a theme, this is annoying so im getting rid of it.
-#+begin_src emacs-lisp
-(setq custom-safe-themes t)
-#+end_src
-** Font
-I use the completely not pirated ~Berkeley Mono~ font. I really like it.
-Sometimes i will use the Commit mono or Cozette! (sometimes!)
-#+begin_src emacs-lisp
-(setq doom-font (font-spec :family "Berkeley Mono" :size 13.0))
-#+end_src
-
-Line numbers! And not relative!
-I dont like rln, i just dont
-#+begin_src emacs-lisp
-(setq display-line-numbers-type t)
-#+end_src
-** Modeline
-
-mood-line is a nice & simple modeline for emacs!
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-;; (package! mood-line)
-#+end_src
-
-#+begin_src emacs-lisp
-;; (use-package! mood-line
-;; :config
-;; (mood-line-mode)
-;; :custom
-;; (mood-line-glyph-alist mood-line-glyphs-fira-code))
-#+end_src
-The above is commented if the below is in action.
-I might try out the default Emacs modeline for a bit sometime, or maybe spacemacs' ~spaceline~
-
-** Minions
-The default Emacs modeline, by default, spills out EVERY minor & major mode into the modeline.
-That's kind of yucky, so the ~minions~ package fixes it by hiding most of them & having a menu for which to show.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! minions)
-#+end_src
-
-Now, let's configure it!
-#+begin_src emacs-lisp
-(use-package! minions
- :config
- (minions-mode 1))
-#+end_src
-
-...Yea that's 'bout it.
-** Custom window management
-I didnt like how in emacs, split windows under ~SPC w s~ just stack, so i made this function to make it dynamic in a fibonnaci-like layout.
-#+begin_src emacs-lisp
-(defun my/split-window-dynamically ()
- "Split the selected window, choosing orientation by its shape."
- (interactive)
- (select-window
- (if (> (window-total-width) (* 2 (window-total-height)))
- (split-window-right)
- (split-window-below))))
-#+end_src
-
-Map the function to override ~SPC w s~
-#+begin_src emacs-lisp
-(map! :leader "w s" #'my/split-window-dynamically)
-#+end_src
-
-** UX ~ UI
-Scroll margin - when the cursor reaches 3 lines above/below the window bottom/top, the window goes down (this happens in helix automatically, but the margin is 5)
-#+begin_src emacs-lisp
-(setq scroll-margin 3)
-#+end_src
-
-** Breadcrumb
-Breadcrumb is a package that shows you where you are in a file at the very top of the window. Editing this section of this file, the breadcrumb shows:
-~stow/d/.config/doom/config.org : UI~,
-this is because we are in the UI section of the file.
-
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! breadcrumb)
-#+end_src
-
-#+begin_src emacs-lisp
-(use-package! breadcrumb
- :defer t
- :hook
- (prog-mode . breadcrumb-mode) ;; make sure its in programming modes
- :config
- (breadcrumb-mode 1))
-#+end_src
-
-** Zen
-the ~zen~ option in Doom Emacs enables ~writeroom~ mode on toggle.
-~writeroom~ centers the buffer, makes it bigger and lets you type away without distractions, or read via ~nov.el~ easier.
-By default, entering ~writeroom~ mode changes the typeface in the buffer.
-I don't like that, especially when im editing source blocks (e.g here). Let's turn it off.
-#+begin_src emacs-lisp
-(setq +zen-mixed-pitch-modes '())
-#+end_src
-** vertico-carousel
-~vertico~ is the equivalent of nvim's ~telescope~ in Emacs.
-#+begin_quote
-~vertico-carousel~ is a display extension for Vertico. It always shows
-the currently selected candidate on the first line of the candidate list,
-then displays the following candidates below it, cycling from the end back
-to the beginning.
--- vertico-carousel README
-#+end_quote
-
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! vertico-carousel
- :recipe (:host github :repo "kn66/vertico-carousel"))
-#+end_src
-#+begin_src emacs-lisp
-(use-package! vertico-carousel
- :config
- (vertico-carousel-mode 1))
-#+end_src
-* LSP
-~M-x vscode~
-** Haskell
-A custom function that runs the current Haskell file with runghc (interpreter instead of a compiler).
-#+begin_src emacs-lisp
-(defun my/hs-eval ()
- (interactive)
- (let* ((src (buffer-file-name))
- (out (file-name-sans-extension src)))
- (when (zerop (call-process-shell-command
- (format "runghc %s" src) nil "*runghc-output*"))
- (let ((buf (make-comint "hs-run" out)))
- (display-buffer buf)))))
-#+end_src
-
-Hook the function up up to f5
-#+begin_src emacs-lisp
-(add-hook 'haskell-mode-hook
- (lambda ()
- (local-set-key (kbd "<f5>") #'my/hs-eval)))
-#+end_src
-
-** HTML
-HTML is a big part of my programming life.
-There are, however, alot of modes for HTML (html-mode, web-mode, mhtml-mode).
-These are all good, but the BEST one by far is ~mhtml-ts-mode~, it outcompetes almost all of the above.
-#+begin_src emacs-lisp
- (add-to-list 'major-mode-remap-alist '(html-mode . mhtml-ts-mode))
- (add-to-list 'major-mode-remap-alist '(mhtml-mode . mhtml-ts-mode))
-#+end_src
-
-web-mode rescans the whole altered block on every edit, which gets slow on HTML with big inline ~<script>~ and ~<style>~ blocks.
-~mhtml-ts-mode~ is built in and tree-sitter based. It needs the html, css and javascript grammars, which ~M-x mhtml-ts-mode-install-parsers~ builds.
-
-Claim =.html= for it, and remap the other HTML modes to it.
-
-#+begin_src emacs-lisp
-(add-to-list 'auto-mode-alist '("\\.html?\\'" . mhtml-ts-mode))
-(add-to-list 'major-mode-remap-alist '(html-mode . mhtml-ts-mode))
-(add-to-list 'major-mode-remap-alist '(mhtml-mode . mhtml-ts-mode))
-#+end_src
-
-Things like ~php~ or ~vue~ call ~web-mode~ directly, and ~mhtml-ts-mode~ doesnt understand those languages, so we make sure that
-those languages get ~web-mode~
-#+begin_src emacs-lisp
-(advice-add 'web-mode :around
- (lambda (orig &rest args)
- (if (or (null buffer-file-name)
- (string-match-p "\\.html?\\'" buffer-file-name))
- (mhtml-ts-mode)
- (apply orig args))))
-#+end_src
-** Eglot
-Eglot is, well, LSP for Emacs!
-It bundles all your LSP's into one big package so you dont have to install everything manually
-Here i hook eglot-ensure into prog-mode.
-eglot-ensure makes sure that eglot is enabled and working when opening a prog-mode buffer now.
-#+begin_src emacs-lisp
-(use-package! eglot
- :hook
- (prog-mode . eglot-ensure))
-#+end_src
-
-Then we can set up ~eglot-booster~, which adds ~emacs-lsp-booster~ integration into eglot.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! eglot-booster
- :recipe (:host github :repo "jdtsmith/eglot-booster"))
-#+end_src
-emacs-lsp-booster, well, boosts lsp (with rust!)
-#+begin_src emacs-lisp
-(use-package! eglot-booster
- :after eglot
- :config (eglot-booster-mode))
-#+end_src
-
-I copied this block from somewhere and have no idea what it does.
-#+begin_src emacs-lisp
-(after! eglot
- (cl-defmethod eglot-register-capability
- ((_server eglot-lsp-server)
- (method (eql workspace/didChangeWatchedFiles))
- _id
- &key _watchers)
- nil)
-
-
- #+end_src
-
- Here we add a custom LSP for typescript and javascript mode.
- Oxlint is a rewrite of ESLint in Rust, Not sure why oxlsp isnt its own tool, but oh well.
- #+begin_src emacs-lisp
- (add-to-list 'eglot-server-programs
- '((typescript-ts-mode javascript-mode)
- . ("emacs-lsp-booster" "--" "oxlint" "--lsp"))))
-
-#+end_src
-
-~eglot-sync-connect~ makes it so that eglot has to catch up and connect before a buffer can be worked on, thats why i set it to nil.
-~eglot-connect-timeout~ just stops trying to connect to eglot after a minute.
-#+begin_src emacs-lisp
-(setq eglot-sync-connect nil
- eglot-connect-timeout 60)
-#+end_src
-
-** Flycheck
-Flycheck is a linter engine for Emacs.
-
-Here i define a new checker for flycheck, htmlhint (which is the linter i most enjoy using).
-Then i hook it into ~web-mode~
-#+begin_src emacs-lisp
-(after! flycheck
- (flycheck-define-checker htmlhint
- "htmlhint for flycheck"
- :command ("htmlhint" "--format" "unix" source)
- :error-patterns
- ((error
- line-start
- (file-name) ":" line ":" column ": "
- (message) line-end))
- :modes (mhtml-ts-mode))
- #+end_src
-
- I then add the new checker to the flycheck checkers (say that 3 times fast)
- #+begin_src emacs-lisp
- (add-to-list 'flycheck-checkers 'htmlhint)
- #+end_src
-
- Here we add additional checkers to flycheck.
- We add ESLint and oxlint, and then another block for html-tidy and the new htmlhint.
- The reason this cant be all in one ~flycheck-add-next-checker~ block is because ~flyckech-add-next-checker~ only takes 2 variables.
- #+begin_src emacs-lisp
- (flycheck-add-next-checker
- 'javascript-eslint
- 'javascript-oxlint)
- (flycheck-add-next-checker
- 'html-tidy
- 'htmlhint)
- #+end_src
-
- We then make flycheck check the file after saving.
- #+begin_src emacs-lisp
- (setq flycheck-check-syntax-automatically
- '(save mode-enabled)))
-#+end_src
-
-** Apheleia
-
-Apheleia is an easy way to format your files in Emacs.
-First we hook apheleia into prog-mode.
-#+begin_src emacs-lisp
-(use-package! apheleia
- :hook
- (prog-mode . apheleia-mode)
- #+end_src
-
- We can then add a new apheleia formatter, in this case oxfmt.
- (why is oxfmt its own tool but oxlsp isnt? why cant it just be ~oxlint --lsp~ and ~oxlint --format~, this is dumb)
- #+begin_src emacs-lisp
- :config
- (setf (alist-get 'oxfmt apheleia-formatters)
- '("oxfmt" "--config=.oxfmtrc.json" "--stdin-filepath" filepath))
- #+end_src
-
- Here we hook the new oxfmt formatter into apheleia:
- #+begin_src emacs-lisp
- (dolist (mode '(mhtml-ts-mode html-mode mhtml-mode web-mode css-mode))
- (setf (alist-get mode apheleia-mode-alist) 'oxfmt)))
- #+end_src
- Let's also hook mhtml-ts-mode into apheleia
-#+begin_src emacs-lisp
- (add-hook 'mhtml-ts-mode-hook #'apheleia-mode)
-#+end_src
-* Email
-~Emacs - prover of Zawinki's law~
-** Auth
-To send mail, we need to log into everything.
-Instead of typing out passwords every time, we use the ~~.authinfo.gpg~ file (can also be without the gpg encryption).
-First we install & set up pinentry.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! pinentry)
-#+end_src
-
-#+begin_src emacs-lisp
-(use-package! pinentry
- :config
- (pinentry-start))
-(setq epg-pinentry-mode 'loopback)
-#+end_src
-To read the file:
-#+begin_src emacs-lisp
-(setq auth-sources '("~/.authinfo.gpg"))
-#+end_src
-Emacs automatically decrypts the file with ~epa~ and ~epg~.
-To make this not expire, we set
-#+begin_src emacs-lisp
-(setq auth-source-cache-expiry nil)
-#+end_src
-
-** Gnus
-Gnus is Emacs's built in Email reader, sender, news viewer and RSS reader.
-But right now we're setting up the Email part.
-
-This makes it so that all subscribed groups are visible, no matter if theres no new messages.
-#+begin_src emacs-lisp
-(setq gnus-permanently-visible-groups ".")
-#+end_src
-
-When browsing gnus, make the mode in evil standard emacs.
-#+begin_src emacs-lisp
-(evil-set-initial-state 'gnus-browse-mode 'emacs)
-#+end_src
-
-Now we configure our user of gnus.
-#+begin_src emacs-lisp
-(setq user-mail-address "hi@roughlynamed.net" ; my email
- user-full-name "Magdalena Szweda") ; my name
-#+end_src
-
-While we're at it, lets point Emacs at my LibrePGP key.
-#+begin_src emacs-lisp
-(setq mml-secure-openpgp-signers
- '("B9CF59FE57835F89ECB33FD417CA809770F85511")
- mml-secure-openpgp-sign-with-sender t)
-#+end_src
-
-We can also set up the signature via the ~.signature~ file instead of encoding it raw into the config.
-#+begin_src emacs-lisp
-(setq message-signature-file "~/.signature") ; note no trailing slash
-#+end_src
-
-Now we can set up the actual mail part.
-I use migadu for my email hosting, provided to me by ~@bas.sh~
-Here we set up IMAP for receiving mail.
-#+begin_src emacs-lisp
-(setq gnus-select-method
- '(nnimap "migadu"
- (nnimap-address "imap.migadu.com")
- (nnimap-server-port 993)
- (nnimap-stream ssl)))
-#+end_src
-
-Once that's done, we can configure the sending (smtp) part.
-#+begin_src emacs-lisp
-(setq smtpmail-smtp-server "smtp.migadu.com"
- smtpmail-smtp-service 465 ; port 465
- smtpmail-stream-type 'ssl
- message-send-mail-function #'smtpmail-send-it
- )
-#+end_src
-
-After that, a little bit more config for UX
-#+begin_src emacs-lisp
-(setq gnus-message-archive-method '(nnimap "migadu") ; use migadu for archiving email
- gnus-message-archive-group "Sent") ; where to put sent mail
-
-(setq gnus-large-newsgroup nil
- gnus-fetch-old-headers t
- nnmail-expiry-target "Trash")
-#+end_src
-
-By default, Gnus puts entries newest last, let's reverse it.
-#+begin_src emacs-lisp
-(setq gnus-thread-sort-functions
- '((not gnus-thread-sort-by-date)))
-
-(setq gnus-subthread-sort-functions
- '((not gnus-thread-sort-by-date)))
-(setq gnus-thread-sort-most-recent-first t)
-#+end_src
-
-What Gnus also does by default is ask to read the .newsrc file, this file is basically an auto-save, 90% of the time you want to read it.
-Let's just disable the prompt on every Gnus startup.
-#+begin_src emacs-lisp
-(setq gnus-always-read-dribble-file nil)
-#+end_src
-
-I like to sign my message with pgp as a way to confirm that its really me sending the email.
-We can do this with the following:
-#+begin_src emacs-lisp
-(add-hook 'message-send-hook #'mml-secure-message-sign-pgpmime)
-#+end_src
-We use pgpmime to put the signature in the MIME header instead of inline PGP blocks.
-
-I'm not a fan of html in my emails as i find it rendering bad and being hard to navigate, so i set it to discourage html and prefer plain text emails.
-#+begin_src emacs-lisp
-(with-eval-after-load "mm-decode"
- (add-to-list 'mm-discouraged-alternatives "text/html")
- (add-to-list 'mm-discouraged-alternatives "text/richtext"))
-#+end_src
-
-While we're at it, let's make opening gnus easier.
-#+begin_src emacs-lisp
-(map!
- :leader
- :prefix "o"
- :desc "Mail" "m" #'gnus)
-#+end_src
-* Jabber
-~Jabber? I hardly know her!~
-
-Excuse the bad pun, jabber.el is a way to use XMPP in Emacs.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! jabber)
-#+end_src
-#+begin_src emacs-lisp
-(use-package! jabber
- :config
- #+end_src
- We point jabber at my XMPP account:
- #+begin_src emacs-lisp
- (setq jabber-account-list
- '(
- ;; ("roughlynamed@yax.im")
- ("wildebeest@yax.im")))
- #+end_src
- And let jabber use the modeline
- #+begin_src emacs-lisp
- (jabber-modeline-mode 1)
- #+end_src
- Now, we can hook jabber to kill itself when emacs dies.
- #+begin_src emacs-lisp
- :hook
- (kill-emacs . jabber-disconnect))
-#+end_src
-As to not rely on ~M-x~ commands, define a binding as so
-#+begin_src emacs-lisp
-(map! :leader
- :prefix "j"
- :desc "Connect" "c" #'jabber-connect-all
- :desc "Disconnect" "q" #'jabber-disconnect
- :desc "Dash" "f" #'jabber-roster
- :desc "Reply" "r" #'jabber-chat-reply
- :desc "New chat" "n" #'jabber-chat-with
- :desc "Set status" "s" #'jabber-send-presence)
-#+end_src
-
-* TODO EMMS
-#+begin_quote
-~Music to my ears~
-#+end_quote
-** TODO EMMS xmms2
-
-This is a project for adding xmms2 support into the Emacs MultiMedia System.
-I plan on getting this into Savannah, then GNU ELPA, or having it merged with the official EMMS repository.
-
-And now, ladies & gentlemen, i present to you a bunch of self-documenting code im too lazy to split up into different source blocks!!!
-#+begin_src emacs-lisp :tangle ~/.config/doom/emms-player-xmms2.el
-;;; emms-player-xmms2.el --- XMMS2 player for EMMS -*- lexical-binding: t; -*-
-
-;; Setup:
-;; (add-to-list 'load-path "/dir/containing/this/file")
-;; (require 'emms-player-xmms2)
-;; (setq emms-player-list '(emms-player-xmms2))
-
-(require 'cl-lib)
-(require 'dbus)
-(require 'emms-player-simple)
-
-(defgroup emms-player-xmms2 nil
- "EMMS player for XMMS2."
- :group 'emms-player
- :prefix "emms-player-xmms2-")
-
-(defcustom emms-player-xmms2-command "xmms2"
- "The xmms2 CLI executable."
- :type 'string)
-
-(defcustom emms-player-xmms2-mpris-service "org.mpris.MediaPlayer2.xmms2"
- "D-Bus name owned by the xmms2 MPRIS bridge."
- :type 'string)
-
-(defcustom emms-player-xmms2-check-interval 1
- "Seconds between playback checks."
- :type 'number)
-
-(defcustom emms-player-xmms2
- (emms-player #'emms-player-xmms2-start
- #'emms-player-xmms2-stop
- #'emms-player-xmms2-playable-p)
- "Parameters for the XMMS2 player."
- :type '(cons symbol alist))
-
-(emms-player-set emms-player-xmms2 'regex
- (emms-player-simple-regexp
- "ogg" "flac" "mp3" "wav" "opus" "m4a" "aac" "mod"))
-(emms-player-set emms-player-xmms2 'pause 'emms-player-xmms2-pause)
-(emms-player-set emms-player-xmms2 'resume 'emms-player-xmms2-resume)
-(emms-player-set emms-player-xmms2 'seek 'emms-player-xmms2-seek)
-(emms-player-set emms-player-xmms2 'seek-to 'emms-player-xmms2-seek-to)
-
-;;; State
-
-(defvar emms-player-xmms2--timer nil)
-(defvar emms-player-xmms2--seen-playing nil
- "Non-nil once XMMS2 has reported Playing/Paused since the last start.
-Guards against reading a stale \"Stopped\" right after starting playback.")
-(defvar emms-player-xmms2--synced nil
- "File names last pushed into XMMS2's playlist, in order.")
-(defvar emms-player-xmms2--tracks nil
- "EMMS tracks mirrored in XMMS2's playlist, in the same order.")
-(defvar emms-player-xmms2--pos nil
- "1-based position XMMS2 was last known to be on.")
-
-;;; Helpers
-
-(defun emms-player-xmms2--run (&rest args)
- "Run the xmms2 CLI with ARGS. Return non-nil on success."
- (zerop (apply #'call-process emms-player-xmms2-command nil nil nil args)))
-
-(defun emms-player-xmms2--state ()
- "Return the MPRIS PlaybackStatus string, or nil if unreachable."
- (ignore-errors
- (dbus-get-property :session emms-player-xmms2-mpris-service
- "/org/mpris/MediaPlayer2"
- "org.mpris.MediaPlayer2.Player" "PlaybackStatus")))
-
-(defun emms-player-xmms2--list-info ()
- "Return (CURRENT-POS . COUNT) parsed from `xmms2 list', or nil on failure.
-CURRENT-POS is the 1-based position of the `->' entry, or nil."
- (with-temp-buffer
- (when (zerop (call-process emms-player-xmms2-command nil t nil "list"))
- (let ((count 0) (pos nil))
- (goto-char (point-min))
- (while (re-search-forward
- "^\\(->\\| \\)\\[\\([0-9]+\\)/[0-9]+\\]" nil t)
- (setq count (1+ count))
- (when (string= (match-string 1) "->")
- (setq pos (string-to-number (match-string 2)))))
- (cons pos count)))))
-
-(defun emms-player-xmms2--name (track)
- "The file name to hand to xmms2 for TRACK."
- (expand-file-name (emms-track-name track)))
-
-(defun emms-player-xmms2--playlist-tracks ()
- "Playable tracks of the current EMMS playlist, in order."
- (with-current-emms-playlist
- (cl-remove-if-not
- #'emms-player-xmms2-playable-p
- (save-excursion
- (nreverse (emms-playlist-tracks-in-region (point-min) (point-max)))))))
-
-(defun emms-player-xmms2--select (track)
- "Move the EMMS selection to TRACK in the current playlist buffer."
- (with-current-emms-playlist
- (goto-char (point-min))
- (let (found)
- (while (and (not found) (not (eobp)))
- (if (eq (ignore-errors (emms-playlist-track-at (point))) track)
- (setq found (point))
- (forward-line 1)))
- (when found (emms-playlist-select found)))))
-
-(defun emms-player-xmms2--cancel-timer ()
- (when emms-player-xmms2--timer
- (cancel-timer emms-player-xmms2--timer)
- (setq emms-player-xmms2--timer nil)))
-
-;;; Following XMMS2
-
-(defun emms-player-xmms2--advanced (pos)
- "XMMS2 moved on to position POS by itself"
- (setq emms-player-xmms2--pos pos)
- (let ((track (nth (1- pos) emms-player-xmms2--tracks)))
- (when track
- (let ((emms-player-stopped-p t)) ; don't let EMMS pick the next track
- (emms-player-stopped))
- (emms-player-xmms2--select track)
- (emms-player-started 'emms-player-xmms2))))
-
-(defun emms-player-xmms2--went-idle (pos)
- "XMMS2 stopped without asking. POS is its marker position"
- (emms-player-xmms2--cancel-timer)
- (setq emms-player-xmms2--seen-playing nil)
- (if (or (null pos) (>= pos (length emms-player-xmms2--tracks)))
- (emms-player-stopped)
- (let ((emms-player-stopped-p t))
- (emms-player-stopped))))
-
-(defun emms-player-xmms2--poll ()
- (let ((state (emms-player-xmms2--state))
- (pos (car (emms-player-xmms2--list-info))))
- (cond ((member state '("Playing" "Paused"))
- (setq emms-player-xmms2--seen-playing t)
- (when (and pos (not (eql pos emms-player-xmms2--pos)))
- (emms-player-xmms2--advanced pos)))
- ((and emms-player-xmms2--seen-playing (equal state "Stopped"))
- (emms-player-xmms2--went-idle pos)))))
-
-;;; EMMS API
-
-(defun emms-player-xmms2-playable-p (track)
- "Return non-nil when can play TRACK."
- (and (eq (emms-track-type track) 'file)
- (string-match (emms-player-get emms-player-xmms2 'regex)
- (emms-track-name track))
- (executable-find emms-player-xmms2-command)
- t))
-
-(defun emms-player-xmms2-start (track)
- "Play TRACK, syncing XMMS2's playlist with EMMS's first if needed."
- (emms-player-xmms2--cancel-timer)
- (setq emms-player-xmms2--seen-playing nil)
- (let* ((tracks (emms-player-xmms2--playlist-tracks))
- (index (cl-position track tracks :test #'eq)))
- (unless index
- (setq tracks (list track) index 0))
- (let* ((names (mapcar #'emms-player-xmms2--name tracks))
- (info (emms-player-xmms2--list-info)))
- (unless (and (equal names emms-player-xmms2--synced)
- info (= (cdr info) (length names)))
- (emms-player-xmms2--run "clear")
- (apply #'emms-player-xmms2--run "add" "-f" names)
- (setq emms-player-xmms2--synced names))
- (setq emms-player-xmms2--tracks tracks
- emms-player-xmms2--pos (1+ index))
- (if (and (emms-player-xmms2--run "jump" (number-to-string (1+ index)))
- (emms-player-xmms2--run "play"))
- (progn
- (emms-player-started 'emms-player-xmms2)
- (setq emms-player-xmms2--timer
- (run-at-time emms-player-xmms2-check-interval
- emms-player-xmms2-check-interval
- #'emms-player-xmms2--poll)))
- (message "XMMS2: could not start %s" (car names))))))
-
-(defun emms-player-xmms2-stop ()
- "Stop playback."
- (interactive)
- (emms-player-xmms2--cancel-timer)
- (setq emms-player-xmms2--seen-playing nil)
- (emms-player-xmms2--run "stop")
- (let ((emms-player-stopped-p t))
- (emms-player-stopped)))
-
-(defun emms-player-xmms2-pause ()
- "Pause playback."
- (interactive)
- (emms-player-xmms2--run "pause"))
-
-(defun emms-player-xmms2-resume ()
- "Resume playback."
- (interactive)
- (emms-player-xmms2--run "play"))
-
-(defun emms-player-xmms2-seek (amount)
- "Seek by AMOUNT seconds."
- (interactive "nSeconds: ")
- (emms-player-xmms2--run "seek" (format "%+d" (round amount))))
-
-(defun emms-player-xmms2-seek-to (pos)
- "Seek to POS seconds from the start of the track."
- (interactive "nSeconds: ")
- (emms-player-xmms2--run "seek" (number-to-string (round pos))))
-
-(defun emms-player-xmms2-resync ()
- "Force the next start to rebuild XMMS2's playlist from EMMS's."
- (interactive)
- (setq emms-player-xmms2--synced nil))
-
-(provide 'emms-player-xmms2)
-
-;;; emms-player-xmms2.el ends here
-
-#+end_src
-
-#+RESULTS:
-: emms-player-xmms2
-
-** EMMS - for real now
-EMMS, the Emacs MultiMedia System (but mostly its just used for music).
-EMMS has a Doom Emacs module, so it doesnt require a ~(package!)~ line
-
-Here we declare the package block and set up the commands.
-~:commands~ in elisp is used to eagerly load functions even when a package is lazy loaded.
-The following makes the commands ~emms~ and ~emms-browser~ available even before emms itself is loaded.
-
-#+begin_src emacs-lisp
- (add-to-list 'load-path "/home/hi/.config/doom/")
-(use-package! emms
-:commands (emms emms-browser emms-player-mpd-update-all emms-cache-set-from-mpd-all emms emms-pause emms-next emms-previous emms-stop
- emms-random emms-add-directory-tree emms-play-playlist)
-#+end_src
-
-Configure the mappings for EMMS
-~:init~ in elisp runs the following code =before= a package is loaded.
-In this case, it makes the emms mappings available right when emacs starts up.
-#+begin_src emacs-lisp
-:init
-(map! :leader
- (:prefix ("e" . "emms")
- :desc "Browser" "b" #'emms-browser
- :desc "Emms" "e" #'emms
- :desc "Play/pause" "SPC" #'emms-pause
- :desc "Next" "n" #'emms-next
- :desc "Previous" "p" #'emms-previous
- :desc "Stop" "s" #'emms-stop
- :desc "Add" "a" #'emms-add-playlist
- :desc "Clear" "c" #'emms-playlist-clear))
-#+end_src
-
-Here we tell EMMS to use the preset configuration loader, this makes it so that i dont have to wire up a bunch of emms submodules myself.
-#+begin_src emacs-lisp
-:config
-(require 'emms-setup)
-#+end_src
-
-We then use ~emms-all~ to load every emms submodule. Possible variations include:
-| Name | What it does |
-|---------------+----------------------------------------------------------------|
-| ~emms-all~ | Loads every EMMS submodule. (browser, cover art, lyrics, etc.) |
-|---------------+----------------------------------------------------------------|
-| ~emms-standard~ | Smaller and more curated subset of features |
-|---------------+----------------------------------------------------------------|
-| ~emms-minimal~ | Very barebones EMMS |
-
-#+begin_src emacs-lisp
-(emms-all)
-#+end_src
-
-Here we tell EMMS to use XMMS2 instead of MPRIS or Mpd.
-#+begin_src emacs-lisp
-
-(require 'emms-player-xmms2)
-(setq
- emms-player-list '(emms-player-xmms2)
- #+end_src
-
- Stop lyrics from scrolling, and have them appear on the minibuffer
- #+begin_src emacs-lisp
- emms-lyrics-scroll-p nil
- emms-lyrics-display-on-minibuffer t
- emms-lyrics-display-on-modeline nil
- #+end_src
- Tell EMMS where MPD's music dir lives, and where its own music dir lives.
- #+begin_src emacs-lisp
- emms-player-mpd-music-directory "~/Music"
- emms-source-file-default-directory (expand-file-name "~/Music/playlists/")
- #+end_src
- Make playlists loop instead of stopping at the last track.
- #+begin_src emacs-lisp
- emms-repeat-playlist t
- #+end_src
-
- Make EMMS use Doom Emacs' cache instead of its own.
- #+begin_src emacs-lisp
- emms-cache-file (concat doom-cache-dir "emms-cache"))
-#+end_src
-
-Turn on the little [ARTIST - ALBUM - TITLE] indicator in the modeline.
-#+begin_src emacs-lisp
-(emms-mode-line-mode 1)
-#+end_src
-
-
-
-LISTENED/LENGTH indicator in the modeline
-#+begin_src emacs-lisp
-(emms-playing-time-mode 1)
-#+end_src
-
-This makes it so that presing RET on a song in normal mode adds the tracks to the playlist and plays it.
-This currently doesnt work.
-#+begin_src emacs-lisp
-(map! :map emms-browser-mode-map
- :n "RET" #'emms-browser-add-tracks-and-play))
-#+end_src
-
-* vc
-#+begin_quote
-Now you don't even need a terminal to do your version control!
-#+end_quote
-** TODO vc :: maps
-Mappings for vc.
-By default, vc bindings are under ~C-x v~, but thats annoying, i'll be binding it under ~SPC v~
-I tried my best to match these to the default bindings under ~C-x v~
-
-#+begin_src emacs-lisp
-(map!
- :leader
- :prefix "v"
- :desc "vc-edit-next-command" "!" #'vc-edit-next-command
- :desc "diff-hl-show-hunk" "*" #'diff-hl-show-hunk
- :desc "vc-update" "+" #'vc-update
- :desc "diff-hl-goto-hunk" "=" #'diff-hl-diff-goto-hunk
- :desc "vc-revert" "@" #'vc-revert
- :desc "vc-update-change-log" "a" #'vc-update-change-log
- ;; ADD b BINDINGS (branch)
- :desc "vc-dir" "d" #'vc-dir
- :desc "vc-root-diff" "D" #'vc-root-diff
- ;; ADD E BINDINGS
- :desc "annotate" "g" #'vc-annotate
- :desc "ignore" "G" #'vc-ignore
- :desc "region history" "h" #'vc-region-history
- :desc "register" "i" #'vc-register
- :desc "root log incoming" "I" #'vc-root-log-incoming
- :desc "print log" "l" #'vc-print-log
- :desc "print root log" "L" #'vc-print-root-log
- :desc "merge" "m" #'vc-merge
- ;; ADD M BINDINGS
- :desc "diff revert hunk" "n" #'diff-hl-revert-hunk
- :desc "root log outgoing" "O" #'vc-root-log-outgoing
- :desc "push" "p" #'vc-push ; originally P
- :desc "retrieve tag" "r" #'vc-retrieve-tag
- :desc "rename file" "R" #'vc-rename-file
- :desc "create tag" "s" #'vc-create-tag
- :desc "stage dwim (diff hl)" "S" #'diff-hl-stage-dwim
- ;; ADD T BINDINGS
- :desc "vc revert" "u" #'vc-revert ; carried over from the original bindings (repeated by @)
- :desc "vc next action" "v" #'vc-next-action ; run the next logical action
- ;; ADD w BINDINGS
- :desc "revision other window" "~" #'vc-revision-other-window)
-#+end_src
-** vc-jj
-~vc-jj~ adds jujutsu integration to Emacs's ~vc~!
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! vc-jj)
-#+END_SRC
-
-Then, we actually enable it.
-#+begin_src emacs-lisp
-(use-package! vc-jj)
-#+end_src
-vc-jj has a bit of a... weird flow, it runs ~jj commit~ instead of ~jj describe~, and doesnt advance bookmarks the way i usually do in my flow.
-
-Here we fix it!
-#+begin_src emacs-lisp
-(after! vc-jj
- (defvar my/vc-jj-advance-to nil)
-
- (defun my/vc-jj-bookmark-advance (&optional names)
- "Advance the closest bookmarks (or just NAMES) forward."
- (interactive
- (when current-prefix-arg
- (list (completing-read-multiple
- "Advance bookmarks: "
- (vc-jj--process-lines
- nil "bookmark" "list"
- "-T" "if(!self.remote(), self.name() ++ '\n')")))))
- (with-temp-buffer
- (let ((status (apply #'vc-jj--call nil t "bookmark" "advance"
- (append (when my/vc-jj-advance-to
- (list "--to" my/vc-jj-advance-to))
- names))))
- (message "vc-jj: %s" (string-trim (buffer-string)))
- status)))
-
- (defun my/vc-jj--advance-before-push (&rest _)
- (my/vc-jj-bookmark-advance))
- (advice-add 'vc-jj-push :before #'my/vc-jj--advance-before-push)
- (setq my/vc-jj-advance-to "@-")
-
- (defun my/vc-jj-checkin (files comment &optional _rev)
- "Describe @ and start a fresh change."
- (let ((default-directory (vc-jj-root (car files))))
- (vc-jj-modify-change-comment nil "@" comment)
- (vc-jj--command-dispatched nil 0 nil "new" "--quiet")))
- (advice-add 'vc-jj-checkin :override #'my/vc-jj-checkin))
-#+end_src
-Now, this opens an ugly buffer in a split window and just... leaves it there.
-A simple fix indeed.
-#+begin_src emacs-lisp
-(after! vc-jj
- (add-to-list 'display-buffer-alist
- '("\\`\\*vc-jj : "
- (display-buffer-no-window)
- (allow-no-window . t)))
-
- (defun my/vc-jj--report-push (&rest _)
- (when-let* ((root (vc-jj-root default-directory))
- (buf (get-buffer (format "*vc-jj : %s*" (expand-file-name root))))
- (proc (get-buffer-process buf)))
- (add-function
- :around (process-sentinel proc)
- (lambda (orig p event)
- (unwind-protect (funcall orig p event)
- (when (memq (process-status p) '(exit signal))
- (if (zerop (process-exit-status p))
- (message "vc-jj: push done")
- (message "vc-jj: push FAILED, output below")
- (let ((display-buffer-alist nil))
- (pop-to-buffer buf)))))))))
- (defvar vc--inhibit-async-window)
-
- (defun my/vc-jj--push-no-window (orig &rest args)
- (let ((vc--inhibit-async-window t))
- (apply orig args)))
-
- (advice-add 'vc-jj-push :around #'my/vc-jj--push-no-window)
- (advice-add 'vc-jj-push :after #'my/vc-jj--report-push)
- (define-advice ansi-color-filter-region (:around (fn &rest args) my/vc-jj-writable)
- (let ((inhibit-read-only (or inhibit-read-only
- (string-prefix-p "*vc-jj" (buffer-name)))))
- (apply fn args))))
-#+end_src
-* Org
-~Protesting for Org README support.~
-Org is Emacs's version of markdown, and is what this file is written in.
-
-Tell org what directory to use
-#+begin_src emacs-lisp
-(setq org-directory "~/org/")
-(setq org-agenda-files "~/org/todo.org")
-#+end_src
-Now it's time to get to the guts; the main org config.
-But first, some good 'ol self-documenting code:
-#+begin_src emacs-lisp
-(after! org
- (setq
- org-startup-folded t ; fold headers on startup
- org-pretty-entities t
- org-hide-emphasis-markers t
- org-auto-align-tags nil
- org-tags-column 0
- org-catch-invisible-edits 'show-and-error
- org-agenda-tags-column 0
- org-capture-templates-contexts nil
- org-insert-heading-respect-content t
- org-special-ctrl-a/e t
- org-return-follows-link t
- #+end_src
- ** Org Babel
- Org babel is Org's version of code blocks.
- Every code block defined above and below is made via org-babel and the following config.
- #+begin_src emacs-lisp
- org-confirm-babel-evaluate nil)
- (org-babel-do-load-languages
- 'org-babel-load-languages
- '((emacs-lisp . t)
- (python . t)
- (C . t)
- (lisp . t))))
-#+end_src
-
-** poly-org
-~poly-org~ lets you use LSP and autocompletion in org code blocks without pressing ~C-c '~
-By default, org lets you 'enter' code blocks with ~C-c '~ and have actual autocompletion/LSP features.
-But, typing that every block is annoying (especially with a literate config), that's why ~poly-org~ does the same thing* as ~C-c '~, but it happens when the cursor hovers over a block.
-
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! poly-org)
-#+end_src
-#+begin_src emacs-lisp
-(use-package! poly-org
- :hook (org-mode . poly-org-mode))
-#+end_src
-
-After that, we still need to add Eglot integration.
-#+begin_src emacs-lisp
-(add-hook 'org-src-mode-hook #'eglot-ensure)
-#+end_src
-
-There's a bug that hits org-lint & poly-org & flycheck about org element's cache, so lets just disable it.
-#+begin_src emacs-lisp
-(setq org-element-use-cache nil)
-#+end_src
-** Org UX
-This makes org capturing much better.
-When capturing a new org note, all windows are deleted, and the capture window is made a dedicated window.
-#+begin_src emacs-lisp
-(add-hook 'org-capture-mode-hook #'delete-other-windows)
-(add-hook 'org-capture-mode-hook
- (lambda () (set-window-dedicated-p (selected-window) nil)))
-#+end_src
-
-** TODO Org roam
-As much as i'd love to put it under its own higher header, that would be nonsensical.
-Org roam is org's way of a Zettelkasten style knowledge place. Something like obsidian, logseq or ~zk~. Another plus is everything lives in a ~SQLite~ database.
-
-Here we unpin org-roam from Doom's version, as it is reccomended for custom configs like this.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(unpin! org-roam)
-#+end_src
-
-Point org-roam at the org directory (declared seperately).
-#+begin_src emacs-lisp
-(after! org-roam
- (setq org-roam-directory (file-truename "~/org/"))
- #+end_src
-
- Make roam sync it's database automatically.
- #+begin_src emacs-lisp
- (org-roam-db-autosync-mode)
- #+end_src
-
- This is a custom function, i made it to mimic how the ~zk~ cli works when making a new note, which is usually a random 4 character string. for example ~zqy2.md~ could be a note.
- #+begin_src emacs-lisp
- (defun my/org-roam-short-id ()
- (let ((chars "abcdefghijklmnopqrstuvwxyz0123456789"))
- (apply #'string
- (cl-loop repeat 4
- collect (aref chars (random (length chars)))))))
-
-
- #+end_src
-
- The template for new org notes.
- #+begin_src emacs-lisp
- (setq org-roam-capture-templates
- '(("d" "default" plain
- "* %?"
- :if-new
- #+end_src
-
- Here we use the function defined above to name the captured org file
- #+begin_src emacs-lisp
- (file+head
- (lambda () (concat (my/org-roam-short-id) ".org"))
- "#+TITLE: %^{title|Untitled}\n#+FILETAGS: :%^{tags}:\n\n") ; title&tags
- :unnarrowed t)))
-
- (cl-defmethod org-roam-node-file-stem ((node org-roam-node))
- (file-name-base (org-roam-node-file node)))
-
- (setq org-roam-node-display-template
- (concat "${title:*} " (propertize "${file-stem}" 'face 'org-tag)))
-
-
- #+end_src
-
- Define sections in roam.
- #+begin_src emacs-lisp
- (setq org-roam-mode-sections
- '(org-roam-backlinks-section
- org-roam-reflinks-section
- org-roam-unlinked-references-section))
- #+end_src
-
- *** Link checking
- Here we have custom functions, mimicking the ~zk~ cli.
- This functions check if an org file has an inserted link to itself.
- #+begin_src emacs-lisp
- (defun my/org-roam-check-self-link ()
- (when-let* ((node (org-roam-node-at-point))
- (id (org-roam-node-id node)))
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward org-link-any-re nil t)
- (when (string-match-p (regexp-quote id) (match-string 0))
- (message "Warning: self-link detected"))))))
-
-
- #+end_src
-
- Check links that dont point to an actual file
- #+begin_src emacs-lisp
- (defun my/org-roam-check-dead-links ()
- (dolist (link (org-roam-db-query
- [:select [dest] :from links
- :where (= source $s1)] (org-roam-id-at-point)))
- (unless (org-roam-db-query [:select id :from nodes :where (= id $s1)] (car link))
- (message "Error: dead link to %s" (car link)))))
- #+end_src
- *** Hooks
- Run the defined above functions before every org file save
- #+begin_src emacs-lisp
- (add-hook 'before-save-hook
- (lambda ()
- (when (org-roam-file-p)
- (my/org-roam-check-self-link)
- (my/org-roam-check-dead-links)))
- nil t)
- #+end_src
- *** Maps
- Define mappings
- #+begin_src emacs-lisp
- (map!
- :leader
- :prefix ("n r" . "roam")
- :desc "Find node" "f" #'org-roam-node-find ; 'zk edit -i' equivalent
- :desc "Insert node" "i" #'org-roam-node-insert ; link a note
- :desc "Backlinks" "b" #'org-roam-buffer-toggle
- :desc "Capture" "c" #'org-roam-capture ; make a new note
- #+end_src
- The org graph requires Graphviz and the ~dot~ executable
- #+begin_src emacs-lisp
- :desc "Graph" "g" #'org-roam-graph ; graph of every note
- #+end_src
- #+begin_src emacs-lisp
- :desc "Random node" "r" #'org-roam-node-random ; random node
- :desc "Open link" "o" #'org-open-at-point ; open linked note under cursor
- :desc "Jump back" "O" #'org-mark-ring-goto)) ; jump back to previous note after SPC n r o
-
-#+end_src
-** ox-html
-~ox-html~ is a way to convert org files into html.
-#+begin_src emacs-lisp
-(with-eval-after-load 'ox-html
- (setq org-html-xml-declaration nil
- org-html-doctype "html5"
- org-html-html5-fancy t
- #+end_src
-
- Dont use ox's default html style
- #+begin_src emacs-lisp
- org-html-head-include-default-style nil
- #+end_src
-
- Dont postamble in generated html
- #+begin_src emacs-lisp
- org-html-postamble nil))
-#+end_src
-
-** org-roam-ui
-~org-roam-ui~ makes a Obsidian-like graph available in the browser.
-It makes a pretty graph of all your notes and puts it at http://localhost:35901.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! org-roam-ui)
-#+end_src
-
-Websocket required
-#+begin_src emacs-lisp
-(use-package! websocket :after org-roam)
-#+end_src
-
-org-roam config
-#+begin_src emacs-lisp
-(use-package! org-roam-ui
- :after org-roam
- :config
- (setq org-roam-ui-sync-theme t ; use emacs theme
- org-roam-ui-follow t
- org-roam-ui-update-on-save t ; update when a org roam file is saved
- ))
-#+end_src
-** org-appear
-Org appear makes it so that inline code blocks (=~~=), words marked verbatim (====) and (hyper)link syntax hide when viewing the file and appear when hovered on for easy editing.
-for example =[[id:xqyz][emacs]]= will become =emacs= when viewing the file, but turn into the original when the cursor is over the text.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! org-appear)
-#+end_src
-
-#+begin_src emacs-lisp
-(use-package! org-appear
- :hook (org-mode . org-appear-mode)
- :config
- (setq org-appear-autoemphasis t
- org-appear-autolinks t
- org-appear-autosubmarkers t
- org-appear-autoentities t))
-#+end_src
-** org-modern-indent
-Because doom's org ~+pretty~ flag turns on org modern, and org-modern is incompatible with ~org-startup-indented~, we use the ~org-indent-modern~ package
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! org-modern-indent
- :recipe (:host github :repo "jdtsmith/org-modern-indent"))
-#+end_src
-#+begin_src emacs-lisp
-(use-package! org-modern-indent
- :defer t
- :hook (org-mode . org-modern-indent-mode))
-#+end_src
-* Eww
-#+begin_quote
-Eww... What browser is that girl using?
-#+end_quote
-
-~eww~ (Emacs Web WOWser) is, well, a web browser in Emacs.
-It only renders HTML and tries its best to render CSS, so javascript is out of the question (hooray!)
-
-~eww~ is fine on its own, but i have a config to make the experience better.
-Here we define what to search with, for me this is Ecosia.
-#+begin_src emacs-lisp
-(setq eww-search-prefix "https://ecosia.org/search?q=")
-#+end_src
-
-Where eww downloads files to.
-#+begin_src emacs-lisp
-(setq eww-download-directory (expand-file-name "~/Downloads/"))
-#+end_src
-** Functions
-Open a link in mpv
-#+begin_src emacs-lisp
-(defun my-browse-url-mpv (url &rest _args)
- "Open URL in mpv."
- (start-process "mpv" nil "mpv" url))
-#+end_src
-
-Open a url in pdf-tools
-#+begin_src emacs-lisp
-(defun my-browse-url-pdf (url &rest _args)
- "Fetch remote PDF and open in pdf-tools within Emacs."
- (let ((tmp (make-temp-file "emacs-pdf-" nil ".pdf")))
- (url-copy-file url tmp t)
- (find-file-other-window tmp)
- (pdf-view-mode)))
-#+end_src
-
-Download an image and put it into ~eww-download-directory~
-#+begin_src emacs-lisp
-(defun my/eww-download-image-at-point ()
- (interactive)
- (let ((url (or (get-text-property (point) 'image-url)
- (get-text-property (point) 'shr-url))))
- (if (not url)
- (message "No image at point")
- (let* ((filename (file-name-nondirectory (url-filename (url-generic-parse-url url))))
- (dest (expand-file-name filename eww-download-directory)))
- (url-copy-file url dest t)
- (message "Saved: %s" dest)))))
-#+end_src
-
-** Config :: Misc
-Use the functions defined above when opening specific links
-#+begin_src emacs-lisp
-(setq browse-url-handlers
- '(("\\(youtube\\.com\\|youtu\\.be\\|vimeo\\.com\\|twitch\\.tv\\)" . my-browse-url-mpv)
- ("\\.mp4$" . my-browse-url-mpv)
- ("\\.pdf$" . my-browse-url-pdf)
- ("^gemini://" . elpher-browse-url-elpher)
- ("^gopher://" . elpher-browse-url-elpher)
- ("." . eww-browse-url)))
-
-#+end_src
-
-Open a url in a secondary program, in my case ~Vivaldi~
-#+begin_src emacs-lisp
-(setq browse-url-secondary-browser-function 'browse-url-generic
- browse-url-generic-program "vivaldi")
-#+end_src
-
-** UI/UX settings
-#+begin_src emacs-lisp
-(setq shr-width 100)
-(setq shr-max-width 120)
-(setq shr-indentation 4)
-(setq shr-use-fonts nil)
-(setq shr-max-image-size '(800 . 600))
-(setq shr-image-animate t)
-#+end_src
-
-Let's make ~eww~ go into readable mode on page enter.
-#+begin_src emacs-lisp
-(add-hook 'eww-after-render-hook #'eww-readable)
-#+end_src
-** Keybindings
-#+begin_src emacs-lisp
-(with-eval-after-load 'eww
- (define-key eww-mode-map (kbd "=") #'text-scale-increase)
- (define-key eww-mode-map (kbd "-") #'text-scale-decrease)
- (define-key eww-mode-map (kbd "0") #'text-scale-adjust)
- (define-key eww-mode-map (kbd "b") #'eww-back-url)
- (define-key eww-mode-map (kbd "a") #'eww-add-bookmark)
- (define-key eww-mode-map (kbd "U") #'shr-copy-url)
- (define-key eww-mode-map (kbd "D") #'my/eww-download-image-at-point)
- (evil-define-key 'normal eww-mode-map
- "b" #'eww-back-url
- "a" #'eww-add-bookmark
- "U" #'shr-copy-url
- "D" #'my/eww-download-image-at-point))
-
-(provide 'browser)
-#+end_src
-
-* Elpher
-#+begin_quote
-Elpher? I hardly know her!
-#+end_quote
-
-Elpher is a way to use the Gemini and Gopher protocols in Emacs.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! elpher)
-#+end_src
-#+begin_src emacs-lisp
-(use-package! elpher)
-#+end_src
-There's not much config needed except 1 (one) binding
-#+begin_src emacs-lisp
-(map!
- :leader
- :prefix "o g"
- :desc "Elpher" "e" #'elpher
- :desc "Browse Elpher" "b" #'elpher-browse-url-elpher)
-#+end_src
-* Packages
-#+BEGIN_QUOTE
-The ones that dont belong
-#+END_QUOTE
-These packages are (mostly) defined in ~packages.el~ and configured here.
-
-** Woman
-~woman~ is a way to view man pages straight in Emacs, without shelling out to the actual ~man~ binary, it stands for ~without man~
-Let's map this to a mnemonic binding, in this case ~Open Woman~
-
-#+begin_src emacs-lisp
-(map!
- :leader
- :prefix "o"
- :desc "Woman" "w" #'woman)
-#+end_src
-** Dired
-~Dired~ (Directory editor) is a way to, well, edit directories (and files!) in Emacs.
-This is similar to ~oil.nvim~
-These are only bindings as dired is pre-installed on Emacs.
-#+begin_src emacs-lisp
-(map!
- :leader
- :prefix ("d" . "dired")
- :desc "Dired" "d" #'dired
- :desc "Dired here" "h" #'dired-jump)
-#+end_src
-~dired~ prompts for the directory to open first, while ~dired-jump~ opens dired in the current directory, pretty neat.
-** eat
-~eat~ (emulate a terminal) is a terminal emulator, in elisp, for emacs!
-It is not available as a doom emacs module, so we declare it manually.
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! eat)
-#+end_src
-#+begin_src emacs-lisp
-(use-package! eat
- :defer t)
-#+end_src
-
-Then we add bindings for ~eat~ as to not have to run ~M-x~ everytime.
-#+begin_src emacs-lisp
-(map!
- :leader
- :prefix "o"
- :desc "Open Eat" "e" #'eat-other-window) ; dont steal the current window
-#+end_src
-
-** nov.el
-#+begin_quote
-This is pushing it.
-#+end_quote
-
-nov.el is a way to read EPUB's in Emacs! because why buy a kindle if you have GNU?
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! nov)
-#+end_src
-
-#+begin_src emacs-lisp
-(use-package! nov
- :mode ("\\.epub\\'" . nov-mode)
- :config
- (setq nov-text-width 80
- nov-variable-pitch t)
- (add-hook 'nov-mode-hook
- (lambda ()
- (face-remap-add-relative 'variable-pitch
- :family "Georgia" :height 1.3))) ; different font for reading
- (add-hook 'nov-mode-hook #'writeroom-mode) ; center text & stuff
- #+end_src
-
- Now let's add some nov mappings
- #+begin_src emacs-lisp
- (map! :map nov-mode-map
- :n "i" #'nov-scroll-up ; scroll roughly a page up
- :n "e" #'nov-scroll-down ; scroll roughly a page down
- :n "]" #'nov-next-document
- :n "[" #'nov-previous-document
- :n "t" #'nov-goto-toc))
-#+end_src
-
-** try
-~try~ is a package that lets you ~try~ out other packages without fully installing them!
-#+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
-(package! try)
-#+end_src
-That's about all ~try~ needs.
-* Tramp
-
-Tramp is a way to edit files via SSH and root owned files in Emacs.
-This section is purely used to help me with editing root owned files, without calling ~doas emacs~ and losing my config
-#+begin_src emacs-lisp
-(with-eval-after-load 'tramp
- (add-to-list 'tramp-methods
- '("doas"
- (tramp-login-program "doas")
- (tramp-login-args (("-u" "%u") ("-s")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-connection-timeout 10))))
-#+end_src
-* Evil
-~Mapping at its finest~
-EVIl mode emulates VIM bindings in Emacs.
-
-Remove ~evil-snipe~ as it conflicts with other bindings
-#+begin_src emacs-lisp
-(remove-hook 'doom-first-input-hook #'evil-snipe-mode)
-#+end_src
-
-** Lispy
-~lispy~[fn:1] is a way to run vim motions in a S-exp aware way.
-As an example , running ~D~ on
-~(message "Get rid of |everything" a b (+ 1 2))~, where ~|~ is the point would ruin the S-exp, but with ~lispy~, this turns into:
-~(message "Get rid of ")~
-Pretty neat, huh?
-#+begin_src emacs-lisp
-(use-package lispyville
- :init
- (general-add-hook '(emacs-lisp-mode-hook lisp-mode-hook) #'lispyville-mode) ;; lispy lisps
- :config
- (lispyville-set-key-theme '(operators c-w additional)))
-#+end_src
-** Colemak
-The biggest block for last.
-This is a custom mapping i made for EVIl mode that takes the bindings from [[https://github.com/kalbasit/vim-colemak][kalbasit/vim-colemak]] and puts them into Emacs.
-I plan on packaging this to [[https://melpa.org][MELPA]] soon.
-
-Make ~o~ go right in org mode (previously ~inserted on newline~)
-#+begin_src emacs-lisp
-(after! evil-org
- (evil-define-key 'normal evil-org-mode-map
- "o" #'evil-forward-char))
-#+end_src
-
-*** Main bindings
-#+begin_src emacs-lisp
-(evil-define-key '(normal visual operator) 'global
- "n" 'evil-backward-char
- "e" 'evil-next-line
- "i" 'evil-previous-line
- "o" 'evil-forward-char)
-#+end_src
-*** Motion
-#+begin_src emacs-lisp
-(evil-define-key '(normal visual operator) 'global
- "l" 'evil-backward-word-begin
- "L" 'evil-backward-WORD-begin
- "u" 'evil-forward-word-end
- "U" 'evil-forward-WORD-end
- "y" 'evil-forward-word-begin
- "Y" 'evil-forward-WORD-begin)
-
-(with-eval-after-load 'evil-ex
- (define-key evil-ex-completion-map (kbd "C-l") 'left-word)
- (define-key evil-ex-completion-map (kbd "C-y") 'right-word))
-
-
-#+end_src
-*** Inserting
-#+begin_src emacs-lisp
-(evil-define-key 'normal 'global
- "s" 'evil-insert
- "S" 'evil-insert-line
- "t" 'evil-append
- "T" 'evil-append-line
- "h" 'evil-open-below
- "H" 'evil-open-above)
-#+end_src
-*** Changing
-#+begin_src emacs-lisp
-(evil-define-key '(normal visual) 'global
- "w" 'evil-change
- "W" 'evil-change-line)
-#+end_src
-*** Editing
-#+begin_src emacs-lisp
-(evil-define-key 'normal 'global
- "x" 'evil-delete-char
- "c" 'evil-yank
- "v" 'evil-paste-after
- "X" 'evil-delete-line
- "C" 'evil-yank-line
- "V" 'evil-paste-before)
-
-(evil-define-key 'visual 'global
- "x" 'evil-delete
- "c" 'evil-yank
- "v" 'evil-paste-after)
-#+end_src
-*** TODO Undo
-Doesnt work in org files
-#+begin_src emacs-lisp
-(evil-define-key 'normal 'global
- "z" 'evil-undo
- "Z" 'evil-redo)
-
-
-#+end_src
-*** Visual
-#+begin_src emacs-lisp
-(evil-define-key 'normal 'global
- "a" 'evil-visual-char
- "A" 'evil-visual-line
- "ga" 'evil-visual-restore)
-
-
-#+end_src
-*** Find/Search
-#+begin_src emacs-lisp
-(evil-define-key '(normal visual operator) 'global
- "p" 'evil-find-char-to
- "P" 'evil-find-char-to-backward
- "b" 'evil-repeat-find-char
- "B" 'evil-repeat-find-char-reverse
- "k" 'evil-search-next
- "K" 'evil-search-previous)
-
-
-#+end_src
-*** Inner change
-#+begin_src emacs-lisp
-(with-eval-after-load 'evil
- (evil-define-key '(operator visual) 'global "r" evil-inner-text-objects-map))
-
-#+end_src
-*** Scroll
-#+begin_src emacs-lisp
-(define-prefix-command 'my-colemak-fold-map)
-(evil-define-key '(normal visual) 'global "j" 'my-colemak-fold-map)
-(define-key my-colemak-fold-map "j" 'evil-scroll-line-to-center)
-(define-key my-colemak-fold-map "n" 'evil-scroll-line-to-top)
-(define-key my-colemak-fold-map "e" 'evil-scroll-line-to-bottom)
-
-
-#+end_src
-*** Lookup
-#+begin_src emacs-lisp
-(evil-define-key 'normal 'global
- "gK" 'evil-lookup)
-
-
-#+end_src
-*** Window management
-#+begin_src emacs-lisp
-(map! :n "SPC w n" #'evil-window-left
- :n "SPC w e" #'evil-window-down
- :n "SPC w i" #'evil-window-up
- :n "SPC w o" #'evil-window-right)
-
-#+end_src
-
-* Footnotes
-
-[fn:1]
-The actual vim motion part is provided by ~lispyville~, which adds evil support into
diff --git a/doom/.config/doom/config.org.bak b/doom/.config/doom/config.org.bak
deleted file mode 100644
index c2ae151..0000000
--- a/doom/.config/doom/config.org.bak
+++ /dev/null
@@ -1,1219 +0,0 @@
-#+TITLE: Doom Emacs configuration
-#+PROPERTY: header-args:emacs-lisp :tangle config.el
-* Foreword
-Hello! This is my literate configuration for Doom Emacs.
-Why literate? because org is cool!
-I use Doom Emacs because it's easy, simple & easy to configure.
-This config will be ported into normal Emacs in the future, but im not planning that for now.
-* Splash screen
-This is my custom splash screen for Emacs.
-#+begin_src emacs-lisp
-(load! "splash")
-(defun +splash-initial-buffer ()
- (splash-screen)
- (get-buffer "*splash*"))
-
-(setq doom-fallback-buffer-name "*splash*"
- initial-buffer-choice #'+splash-initial-buffer)
-
-(defadvice! +splash-regenerate-if-missing-a (&rest _)
- :before #'doom-fallback-buffer
- (unless (get-buffer "*splash*")
- (splash-screen)))
-#+end_src
-The splash screen doesnt do much, it prints the emacs version and a warranty notice and whatnot. i like it tho!
-
-* UI
-~How Emacs looks!~
-** Theme
-Load the directory with additional, local themes
-This currently mostly loads the emacs port of the Evergarden theme (made by me!)
-at [[https://codeberg.org/roughlynamed/emacs-evergarden][roughlynamed/emacs-evergarden]], also the fortune-gold theme.
-The reason i use modus-vivendi instead of my evergarden port is because i dont like evergarden (dont tell the devs though!), seeing it not have an emacs port just made me sad.
-I also use tango from time-to-time, thats the comment.
-#+begin_src emacs-lisp
-(add-to-list 'custom-theme-load-path
- "~/.config/doom/extra-themes/")
-(setq doom-theme 'modus-vivendi)
-;; (setq doom-theme 'tango)
-#+end_src
-
-By default, Emacs prompts 2 times when loading a theme, this is annoying so im getting rid of it.
-#+begin_src emacs-lisp
- (setq custom-safe-themes t)
-#+end_src
-** Font
-I use the completely not pirated ~Berkeley Mono~ font. I really like it.
-Sometimes i will use the Commit mono or Cozette! (sometimes!)
-#+begin_src emacs-lisp
- (setq doom-font (font-spec :family "Berkeley Mono" :size 13.0))
-#+end_src
-
-Line numbers! And not relative!
-I dont like rln, i just dont
-#+begin_src emacs-lisp
- (setq display-line-numbers-type t)
-#+end_src
-** Modeline
-
-mood-line is a nice & simple modeline for emacs!
-#+begin_src emacs-lisp
- (use-package! mood-line
- :config
- (mood-line-mode)
- :custom
- (mood-line-glyph-alist mood-line-glyphs-fira-code))
-#+end_src
-
-** Custom window management
-I didnt like how in emacs, split windows under ~SPC w s~ just stack, so i made this function to make it dynamic in a fibonnaci-like layout.
-#+begin_src emacs-lisp
- (defun my/split-window-dynamically ()
- "Split the selected window, choosing orientation by its shape."
- (interactive)
- (select-window
- (if (> (window-total-width) (* 2 (window-total-height)))
- (split-window-right)
- (split-window-below))))
-#+end_src
-
-Map the function to override ~SPC w s~
-#+begin_src emacs-lisp
- (map! :leader "w s" #'my/split-window-dynamically)
-#+end_src
-
-** UX ~ UI
-Scroll margin - when the cursor reaches 3 lines above/below the window bottom/top, the window goes down (this happens in helix automatically, but the margin is 5)
-#+begin_src emacs-lisp
- (setq scroll-margin 3)
-#+end_src
-
-** Breadcrumb
-Breadcrumb is a package that shows you where you are in a file at the very top of the window. Editing this section of this file, the breadcrumb shows:
-~stow/d/.config/doom/config.org : UI~,
-this is because we are in the UI section of the file.
-#+begin_src emacs-lisp
- (use-package! breadcrumb
- :defer t
- :hook
- (prog-mode . breadcrumb-mode) ;; make sure its in programming modes
- :config
- (breadcrumb-mode 1))
-#+end_src
-
-** Zen
-the ~zen~ option in Doom Emacs enables ~writeroom~ mode on toggle.
-~writeroom~ centers the buffer, makes it bigger and lets you type away without distractions.
-By default, entering ~writeroom~ mode (which i will continue to call ~zen~ mode) changes the typeface in the buffer.
-I don't like that, especially when im editing source blocks (e.g here). Let's turn it off.
-#+begin_src emacs-lisp
- (setq +zen-mixed-pitch-modes '())
-#+end_src
-* Languages & LSP
-~M-x vscode~
-** Haskell
-A custom function that runs the current Haskell file with runghc (interpreter instead of a compiler).
-#+begin_src emacs-lisp
- (defun my/hs-eval ()
- (interactive)
- (let* ((src (buffer-file-name))
- (out (file-name-sans-extension src)))
- (when (zerop (call-process-shell-command
- (format "runghc %s" src) nil "*runghc-output*"))
- (let ((buf (make-comint "hs-run" out)))
- (display-buffer buf)))))
-#+end_src
-
-Hook the function up up to f5
-#+begin_src emacs-lisp
- (add-hook 'haskell-mode-hook
- (lambda ()
- (local-set-key (kbd "<f5>") #'my/hs-eval)))
-#+end_src
-
-** Eglot
-Eglot is, well, LSP for Emacs!
-Here i hook eglot-ensure into prog-mode.
-eglot-ensure makes sure that eglot is enabled and working when opening a prog-mode buffer now.
-#+begin_src emacs-lisp
- (use-package! eglot
- :hook
- (prog-mode . eglot-ensure))
-#+end_src
-
-Then we can set up ~eglot-booster~, which adds ~emacs-lsp-booster~ integration into eglot.
-emacs-lsp-booster, well, boosts lsp (with rust!)
-#+begin_src emacs-lisp
-(use-package! eglot-booster
- :after eglot
- :config (eglot-booster-mode))
-#+end_src
-
-I copied this block from somewhere and have no idea what it does.
-#+begin_src emacs-lisp
- (after! eglot
- (cl-defmethod eglot-register-capability
- ((_server eglot-lsp-server)
- (method (eql workspace/didChangeWatchedFiles))
- _id
- &key _watchers)
- nil)
-
-
-#+end_src
-
-Here we add a custom LSP for typescript and javascript mode.
-Oxlint is a rewrite of ESLint in Rust, Not sure why oxlsp isnt its own tool, but oh well.
-#+begin_src emacs-lisp
-(add-to-list 'eglot-server-programs
- '((typescript-ts-mode javascript-mode)
- . ("emacs-lsp-booster" "--" "oxlint" "--lsp"))))
-
-#+end_src
-
-~eglot-sync-connect~ makes it so that eglot has to catch up and connect before a buffer can be worked on, thats why i set it to nil.
-~eglot-connect-timeout~ just stops trying to connect to eglot after a minute.
-#+begin_src emacs-lisp
- (setq eglot-sync-connect nil
- eglot-connect-timeout 60)
-#+end_src
-
-** Flycheck
-Flycheck is a linter engine for Emacs.
-
-Here i define a new checker for flycheck, htmlhint (which is the linter i most enjoy using).
-Then i hook it into ~web-mode~
-#+begin_src emacs-lisp
- (after! flycheck
- (flycheck-define-checker htmlhint
- "htmlhint for flycheck"
- :command ("htmlhint" "--format" "unix" source)
- :error-patterns
- ((error
- line-start
- (file-name) ":" line ":" column ": "
- (message) line-end))
- :modes (web-mode))
-#+end_src
-
-I then add the new checker to the flycheck checkers (say that 3 times fast)
-#+begin_src emacs-lisp
- (add-to-list 'flycheck-checkers 'htmlhint)
-#+end_src
-
-Here we add additional checkers to flycheck.
-We add ESLint and oxlint, and then another block for html-tidy and the new htmlhint.
-The reason this cant be all in one ~flycheck-add-next-checker~ block is because ~flyckech-add-next-checker~ only takes 2 variables.
-#+begin_src emacs-lisp
- (flycheck-add-next-checker
- 'javascript-eslint
- 'javascript-oxlint)
-(flycheck-add-next-checker
- 'html-tidy
- 'htmlhint)
-#+end_src
-
-We then make flycheck check the file after saving.
-#+begin_src emacs-lisp
- (setq flycheck-check-syntax-automatically
- '(save mode-enabled)))
-#+end_src
-
-** Apheleia
-
-Apheleia is an easy way to format your files in Emacs.
-First we hook apheleia into prog-mode.
-#+begin_src emacs-lisp
-(use-package! apheleia
- :hook (prog-mode . apheleia-mode)
-#+end_src
-
-We can then add a new apheleia formatter, in this case oxfmt.
-(why is oxfmt its own tool but oxlsp isnt? why cant it just be ~oxlint --lsp~ and ~oxlint --format~, this is dumb)
-#+begin_src emacs-lisp
- :config
- (setf (alist-get 'oxfmt apheleia-formatters)
- '("oxfmt" "--config=.oxfmtrc.json" "--stdin-filepath" filepath))
-#+end_src
-
-Here we hook the new oxfmt formatter into:
-#+begin_src emacs-lisp
-(dolist (mode '(html-mode mhtml-mode web-mode css-mode))
- (setf (alist-get mode apheleia-mode-alist) 'oxfmt)))
-#+end_src
-
-* Email
-~Emacs - prover of Zawinki's law~
-** Auth
-To send mail, we need to log into everything.
-Instead of typing out passwords every time, we use the ~~.authinfo.gpg~ file (can also be without the gpg encryption).
-First we set up pinentry.
-#+begin_src emacs-lisp
- (use-package! pinentry
- :config
- (pinentry-start))
- (setq epg-pinentry-mode 'loopback)
-#+end_src
-To read the file:
-#+begin_src emacs-lisp
- (setq auth-sources '("~/.authinfo.gpg"))
-#+end_src
-Emacs automatically decrypts the file with ~epa~ and ~epg~.
-To make this not expire, we set
-#+begin_src emacs-lisp
- (setq auth-source-cache-expiry nil)
-#+end_src
-
-** Gnus
-Gnus is Emacs's built in Email reader, sender, news viewer and RSS reader.
-But right now we're setting up the Email part.
-
-This makes it so that all subscribed groups are visible, no matter if theres no new messages.
-#+begin_src emacs-lisp
- (setq gnus-permanently-visible-groups ".")
-#+end_src
-
-When browsing gnus, make the mode in evil standard emacs.
-#+begin_src emacs-lisp
- (evil-set-initial-state 'gnus-browse-mode 'emacs)
-#+end_src
-
-Now we configure our user of gnus.
-#+begin_src emacs-lisp
- (setq user-mail-address "hi@roughlynamed.net" ; my email
- user-full-name "Magdalena Szweda") ; my name
-#+end_src
-
-While we're at it, lets point Emacs at my LibrePGP key.
-#+begin_src emacs-lisp
- (setq mml-secure-openpgp-signers
- '("B9CF59FE57835F89ECB33FD417CA809770F85511")
- mml-secure-openpgp-sign-with-sender t)
-#+end_src
-
-We can also set up the signature via the ~.signature~ file instead of encoding it raw into the config.
-#+begin_src emacs-lisp
- (setq message-signature-file "~/.signature") ; note no trailing slash
-#+end_src
-
-Now we can set up the actual mail part.
-I use migadu for my email hosting, provided to me by ~@bas.sh~
-Here we set up IMAP for receiving mail.
-#+begin_src emacs-lisp
- (setq gnus-select-method
- '(nnimap "migadu"
- (nnimap-address "imap.migadu.com")
- (nnimap-server-port 993)
- (nnimap-stream ssl)))
-#+end_src
-
-Once that's done, we can configure the sending (smtp) part.
-#+begin_src emacs-lisp
- (setq smtpmail-smtp-server "smtp.migadu.com"
- smtpmail-smtp-service 465 ; port 465
- smtpmail-stream-type 'ssl
- message-send-mail-function #'smtpmail-send-it
- )
-#+end_src
-
-After that, a little bit more config for UX
-#+begin_src emacs-lisp
- (setq gnus-message-archive-method '(nnimap "migadu") ; use migadu for archiving email
- gnus-message-archive-group "Sent") ; where to put sent mail
-
-(setq gnus-large-newsgroup nil
- gnus-fetch-old-headers t
- nnmail-expiry-target "Trash")
-#+end_src
-
-By default, Gnus puts entries newest last, let's reverse it.
-#+begin_src emacs-lisp
-(setq gnus-thread-sort-functions
- '((not gnus-thread-sort-by-date)))
-
-(setq gnus-subthread-sort-functions
- '((not gnus-thread-sort-by-date)))
-(setq gnus-thread-sort-most-recent-first t)
-#+end_src
-
-What Gnus also does by default is ask to read the .newsrc file, this file is basically an auto-save, 90% of the time you want to read it.
-Let's just disable the prompt on every Gnus startup.
-#+begin_src emacs-lisp
- (setq gnus-always-read-dribble-file nil)
-#+end_src
-
-I like to sign my message with pgp as a way to confirm that its really me sending the email.
-We can do this with the following:
-#+begin_src emacs-lisp
- (add-hook 'message-send-hook #'mml-secure-message-sign-pgpmime)
-#+end_src
-We use pgpmime to put the signature in the MIME header instead of inline PGP blocks.
-
-I'm not a fan of html in my emails as i find it rendering bad and being hard to navigate, so i set it to discourage html and prefer plain text emails.
-#+begin_src emacs-lisp
- (with-eval-after-load "mm-decode"
- (add-to-list 'mm-discouraged-alternatives "text/html")
- (add-to-list 'mm-discouraged-alternatives "text/richtext"))
-#+end_src
-* Jabber
-~Jabber? I hardly know her!~
-
-Excuse the bad pun, jabber.el is a way to use XMPP in Emacs.
-#+begin_src emacs-lisp
- (use-package! jabber
- :config
-#+end_src
-We point jabber at my XMPP account:
-#+begin_src emacs-lisp
- (setq jabber-account-list
- '(
- ;; ("roughlynamed@yax.im")
- ("wildebeest@yax.im")))
-#+end_src
-And let jabber use the modeline
-#+begin_src emacs-lisp
- (jabber-modeline-mode 1)
-#+end_src
-Now, we can hook jabber to kill itself when emacs dies.
-#+begin_src emacs-lisp
- :hook
- (kill-emacs . jabber-disconnect))
-#+end_src
-As to not rely on ~M-x~ commands, define a binding as so
-#+begin_src emacs-lisp
- (map! :leader
- :prefix "j"
- :desc "Connect" "c" #'jabber-connect-all
- :desc "Disconnect" "q" #'jabber-disconnect
- :desc "Dash" "f" #'jabber-roster
- :desc "Reply" "r" #'jabber-chat-reply
- :desc "New chat" "n" #'jabber-chat-with
- :desc "Set status" "s" #'jabber-send-presence)
-#+end_src
-
-* EMMS
-#+begin_quote
-~Music to my ears~
-#+end_quote
-
-EMMS, the Emacs MultiMedia System (but mostly its just used for music).
-Now, emms has this issue where mpd and the emms cache fall out of sync. This is a documented issue so lets make them catch up by default.
-
-Let's make a quick helper function.
-#+begin_src emacs-lisp
-(defun emms--wait-for-mpd-update (callback)
- "Poll MPD status until updating_db clears, then call CALLBACK."
- (emms-player-mpd-get-status
- callback
- (lambda (callback info)
- (if (assoc "updating_db" info)
- (run-with-timer 0.5 nil #'emms--wait-for-mpd-update callback)
- (funcall callback)))))
-#+end_src
-
-And wire it into emms
-#+BEGIN_SRC emacs-lisp
-(defun emms-full-resync ()
- "Update MPD's db, then pull it into EMMS's cache, then rebuild the browser."
- (interactive)
- (message "emms: starting mpd db update...")
- (emms-player-mpd-update-all)
- (emms--wait-for-mpd-update
- (lambda ()
- (emms-cache-set-from-mpd-all)
- (dolist (buf (buffer-list))
- (with-current-buffer buf
- (when (derived-mode-p 'emms-browser-mode)
- (revert-buffer))))
- (emms-browser)
- (message "emms: resync done"))))
-#+END_SRC
-
-Declare the package block and set up the commands.
-~:commands~ in elisp is used to eagerly load functions even when a package is lazy loaded.
-The following makes the commands ~emms~ and ~emms-browser~ available even before emms itself is loaded.
-#+begin_src emacs-lisp
- (use-package! emms
- :commands (emms emms-browser emms-player-mpd-update-all emms-cache-set-from-mpd-all)
-#+end_src
-
-Configure the mappings for EMMS
-~:init~ in elisp runs the following code =before= a package is loaded.
-In this case, it makes the emms mappings available right when emacs starts up.
-#+begin_src emacs-lisp
- :init
- (map! :leader
- (:prefix ("e" . "emms")
- :desc "Browser" "b" #'emms-full-resync
- :desc "Playlist" "m" #'emms-playlist-mode-go
- :desc "Play/pause" "SPC" #'emms-pause
- :desc "Next" "n" #'emms-next
- :desc "Previous" "p" #'emms-previous
- :desc "Stop" "s" #'emms-stop
- :desc "Clear" "c" #'emms-playlist-clear))
-#+end_src
-
-Here we tell EMMS to use the preset configuration loader, this makes it so that i dont have to wire up a bunch of emms submodules myself.
-#+begin_src emacs-lisp
- :config
-(require 'emms-setup)
-#+end_src
-
-We then use ~emms-all~ to load every emms submodule. Possible variations include:
-| Name | What it does |
-|---------------+----------------------------------------------------------------|
-| ~emms-all~ | Loads every EMMS submodule. (browser, cover art, lyrics, etc.) |
-|---------------+----------------------------------------------------------------|
-| ~emms-standard~ | Smaller and more curated subset of features |
-|---------------+----------------------------------------------------------------|
-| ~emms-minimal~ | Very barebones EMMS |
-
-#+begin_src emacs-lisp
- (emms-all)
-#+end_src
-
-Here we tell EMMS to use MPD instead of MPRIS.
-#+begin_src emacs-lisp
- (require 'emms-player-mpd)
-(setq emms-player-list '(emms-player-mpd)
- emms-info-functions '(emms-info-mpd)
-#+end_src
-
-
-Here we point EMMS/MPD at the default server and port for MPD
-#+begin_src emacs-lisp
- emms-player-mpd-server-name "localhost"
-emms-player-mpd-server-port "6600"
-#+end_src
-
-Tell EMMS where MPD's music dir lives, and where its own music dir lives.
-#+begin_src emacs-lisp
- emms-player-mpd-music-directory "~/Music"
-emms-source-file-default-directory (expand-file-name "~/Music/")
-#+end_src
-Make playlists loop instead of stopping at the last track.
-#+begin_src emacs-lisp
- emms-repeat-playlist t
-#+end_src
-
-Make EMMS use Doom Emacs' cache instead of its own.
-#+begin_src emacs-lisp
- emms-cache-file (concat doom-cache-dir "emms-cache"))
-#+end_src
-
-Clear the playlist both on EMMS and MPD
-#+begin_src emacs-lisp
- (add-hook 'emms-playlist-cleared-hook #'emms-player-mpd-clear)
-#+end_src
-
-Connect to MPD as soon as this config loads.
-#+begin_src emacs-lisp
- (emms-player-mpd-connect)
-#+end_src
-
-Turn on the little [ARTIST - ALBUM - TITLE] indicator in the modeline.
-#+begin_src emacs-lisp
- (emms-mode-line-mode 1)
-#+end_src
-
-Show lyrics in the buffer whenever its free
-#+begin_src emacs-lisp
- (emms-lyrics-toggle-display-on-minibuffer)
-#+end_src
-
-LISTENED/LENGTH indicator in the modeline
-
-#+begin_src emacs-lisp
- (emms-playing-time-mode 1)
-#+end_src
-
-This makes it so that presing RET on a song in normal mode adds the tracks to the playlist and plays it.
-This currently doesnt work.
-#+begin_src emacs-lisp
- (map! :map emms-browser-mode-map
- :n "RET" #'emms-browser-add-tracks-and-play))
-#+end_src
-
-* Git
-~LEAVE Emacs? You gotta be kidding.~
-** TODO vc :: maps
-Mappings for vc.
-By default, vc bindings are under ~C-x v~, but thats annoying, i'll be binding it under ~SPC v~
-I tried my best to match these to the default bindings under ~C-x v~
-
-#+begin_src emacs-lisp
- (map!
- :leader
- :prefix "v"
- :desc "vc-edit-next-command" "!" #'vc-edit-next-command
- :desc "diff-hl-show-hunk" "*" #'diff-hl-show-hunk
- :desc "vc-update" "+" #'vc-update
- :desc "diff-hl-goto-hunk" "=" #'diff-hl-diff-goto-hunk
- :desc "vc-revert" "@" #'vc-revert
- :desc "vc-update-change-log" "a" #'vc-update-change-log
- ;; ADD b BINDINGS (branch)
- :desc "vc-dir" "d" #'vc-dir
- :desc "vc-root-diff" "D" #'vc-root-diff
- ;; ADD E BINDINGS
- :desc "annotate" "g" #'vc-annotate
- :desc "ignore" "G" #'vc-ignore
- :desc "region history" "h" #'vc-region-history
- :desc "register" "i" #'vc-register
- :desc "root log incoming" "I" #'vc-root-log-incoming
- :desc "print log" "l" #'vc-print-log
- :desc "print root log" "L" #'vc-print-root-log
- :desc "merge" "m" #'vc-merge
- ;; ADD M BINDINGS
- :desc "diff revert hunk" "n" #'diff-hl-revert-hunk
- :desc "root log outgoing" "O" #'vc-root-log-outgoing
- :desc "push" "p" #'vc-push ; originally P
- :desc "retrieve tag" "r" #'vc-retrieve-tag
- :desc "rename file" "R" #'vc-rename-file
- :desc "create tag" "s" #'vc-create-tag
- :desc "stage dwim (diff hl)" #'diff-hl-stage-dwim
- ;; ADD T BINDINGS
- :desc "vc revert" "u" #'vc-revert ; carried over from the original bindings (repeated by @)
- :desc "vc next action" "v" #'vc-next-action ; run the next logical action
- ;; ADD w BINDINGS
- :desc "revision other window" "~" #'vc-revision-other-window)
-#+end_src
-** Majutsu
-I use the JuJutsu version control system.
-I am an old user of ~magit~. Why not use magit for JJ?
-
-Define mappings for the already-installed ~majutsu~
-Open the main majutsu buffer.
-#+begin_src emacs-lisp
- (map!
- :leader
- :prefix "g m"
- :desc "Status" "m" #'majutsu ; default majutsu buffer
- :desc "Describe" "d" #'majutsu-describe ; equivalent of 'jj describe'
- :desc "New" "n" #'majutsu-new ; new jj rev
- :desc "Push" "p" #'majutsu-git-push) ; push to git
-#+end_src
-
-** vc-jj
-~vc-jj~ adds jujutsu integration to Emacs's ~vc~!
-#+begin_src emacs-lisp :tangle no
- ;; required in packages.el
- ;; (package! vc-jj)
-#+END_SRC
-
-~vc-jj~ configures itself into vc by itself, no further configuration is needed
-
-* Org
-~Protesting for Org README support.~
-Org is Emacs's version of markdown, and is what this file is written in.
-
-Tell org what directory to use
-#+begin_src emacs-lisp
- (setq org-directory "~/org/")
-#+end_src
-Now it's time to get to the guts; the main org config.
-But first, some good 'ol self-documenting code:
-#+begin_src emacs-lisp
- (after! org
- (setq
- org-startup-folded t ; fold headers on startup
- org-pretty-entities t
- org-hide-emphasis-markers t
- org-auto-align-tags nil
- org-tags-column 0
- org-catch-invisible-edits 'show-and-error
- org-agenda-tags-column 0
- org-capture-templates-contexts nil
- org-insert-heading-respect-content t
- org-special-ctrl-a/e t
- org-return-follows-link t
-#+end_src
-** Org Babel
-Org babel is Org's version of code blocks.
-Every code block defined above and below is made via org-babel and the following config.
-#+begin_src emacs-lisp
- org-confirm-babel-evaluate nil)
-(org-babel-do-load-languages
-'org-babel-load-languages
-'((emacs-lisp . t)
- (python . t)
- (C . t)
- (lisp . t))))
-#+end_src
-** poly-org
-~poly-org~ lets you use LSP and autocompletion in org code blocks without pressing ~C-c '~
-By default, org lets you 'enter' code blocks with ~C-c '~ and have actual autocompletion/LSP features.
-But, typing that every block is annoying (especially with a literate config), that's why ~poly-org~ does the same thing* as ~C-c '~, but it happens when
-the cursor hovers over a block.
-#+begin_src emacs-lisp
- (use-package! poly-org
- :hook (org-mode . poly-org-mode))
-#+end_src
-
-After that, we still need to add Eglot integration.
-#+begin_src emacs-lisp
- (add-hook 'org-src-mode-hook #'eglot-ensure)
-#+end_src
-
-There's a bug that hits org-lint & poly-org & flycheck about org element's cache, so lets just disable it.
-#+begin_src emacs-lisp
- (setq org-element-use-cache nil)
-#+end_src
-** Org UX
-This makes org capturing much better.
-When capturing a new org note, all windows are deleted, and the capture window is made a dedicated window.
-#+begin_src emacs-lisp
- (add-hook 'org-capture-mode-hook #'delete-other-windows)
- (add-hook 'org-capture-mode-hook
- (lambda () (set-window-dedicated-p (selected-window) nil)))
-#+end_src
-
-** TODO Org roam
-As much as i'd love to put it under its own higher header, that would be nonsensical.
-Org roam is org's way of a Zettelkasten style knowledge place. Something like obsidian, logseq or ~zk~. Another plus is everything lives in a ~SQLite~ database.
-
-Point org-roam at the org directory (declared seperately).
-#+begin_src emacs-lisp
- (after! org-roam
- (setq org-roam-directory (file-truename "~/org/"))
-#+end_src
-
-Make roam sync it's database automatically.
-#+begin_src emacs-lisp
- (org-roam-db-autosync-mode)
-#+end_src
-
-This is a custom function, i made it to mimic how the ~zk~ cli works when making a new note, which is usually a random 4 character string. for example ~zqy2.md~ could be a note.
-#+begin_src emacs-lisp
- (defun my/org-roam-short-id ()
- (let ((chars "abcdefghijklmnopqrstuvwxyz0123456789"))
- (apply #'string
- (cl-loop repeat 4
- collect (aref chars (random (length chars)))))))
-
-
-#+end_src
-
-The template for new org notes.
-#+begin_src emacs-lisp
- (setq org-roam-capture-templates
- '(("d" "default" plain
- "* %?"
- :if-new
-#+end_src
-
-Here we use the function defined above to name the captured org file
-#+begin_src emacs-lisp
- (file+head
- (lambda () (concat (my/org-roam-short-id) ".org"))
- "#+TITLE: %^{title|Untitled}\n#+FILETAGS: :%^{tags}:\n\n") ; title&tags
-:unnarrowed t)))
-
-(cl-defmethod org-roam-node-file-stem ((node org-roam-node))
- (file-name-base (org-roam-node-file node)))
-
-(setq org-roam-node-display-template
- (concat "${title:*} " (propertize "${file-stem}" 'face 'org-tag)))
-
-
-#+end_src
-
-Define sections in roam.
-#+begin_src emacs-lisp
- (setq org-roam-mode-sections
- '(org-roam-backlinks-section
- org-roam-reflinks-section
- org-roam-unlinked-references-section))
-#+end_src
-
-*** Link checking
-Here we have custom functions, mimicking the ~zk~ cli.
-This functions check if an org file has an inserted link to itself.
-#+begin_src emacs-lisp
- (defun my/org-roam-check-self-link ()
- (when-let* ((node (org-roam-node-at-point))
- (id (org-roam-node-id node)))
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward org-link-any-re nil t)
- (when (string-match-p (regexp-quote id) (match-string 0))
- (message "Warning: self-link detected"))))))
-
-
-#+end_src
-
-Check links that dont point to an actual file
-#+begin_src emacs-lisp
- (defun my/org-roam-check-dead-links ()
- (dolist (link (org-roam-db-query
- [:select [dest] :from links
- :where (= source $s1)] (org-roam-id-at-point)))
- (unless (org-roam-db-query [:select id :from nodes :where (= id $s1)] (car link))
- (message "Error: dead link to %s" (car link)))))
-#+end_src
-*** Hooks
-Run the defined above functions before every org file save
-#+begin_src emacs-lisp
- (add-hook 'before-save-hook
- (lambda ()
- (when (org-roam-file-p)
- (my/org-roam-check-self-link)
- (my/org-roam-check-dead-links)))
- nil t)
-#+end_src
-*** Maps
-Define mappings
-#+begin_src emacs-lisp
- (map!
- :leader
- :prefix ("n r" . "roam")
- :desc "Find node" "f" #'org-roam-node-find ; 'zk edit -i' equivalent
- :desc "Insert node" "i" #'org-roam-node-insert ; link a note
- :desc "Backlinks" "b" #'org-roam-buffer-toggle
- :desc "Capture" "c" #'org-roam-capture ; make a new note
-#+end_src
-The org graph requires Graphviz and the ~dot~ executable
-#+begin_src emacs-lisp
- :desc "Graph" "g" #'org-roam-graph ; graph of every note
-#+end_src
-#+begin_src emacs-lisp
- :desc "Random node" "r" #'org-roam-node-random ; random node
-:desc "Open link" "o" #'org-open-at-point ; open linked note under cursor
-:desc "Jump back" "O" #'org-mark-ring-goto)) ; jump back to previous note after SPC n r o
-
-#+end_src
-** ox-html
-~ox-html~ is a way to convert org files into html.
-#+begin_src emacs-lisp
- (with-eval-after-load 'ox-html
- (setq org-html-xml-declaration nil
- org-html-doctype "html5"
- org-html-html5-fancy t
-#+end_src
-
-Dont use ox's default html style
-#+begin_src emacs-lisp
- org-html-head-include-default-style nil
-#+end_src
-
-Dont postamble in generated html
-#+begin_src emacs-lisp
- org-html-postamble nil))
-#+end_src
-
-** org-roam-ui
-~org-roam-ui~ makes a Obsidian-like graph available in the browser.
-It makes a pretty graph of all your notes and puts it at http://localhost:35901.
-
-Required websocket
-#+begin_src emacs-lisp
- (use-package! websocket :after org-roam)
-#+end_src
-
-org-roam config
-#+begin_src emacs-lisp
- (use-package! org-roam-ui
- :after org-roam
- :config
- (setq org-roam-ui-sync-theme t ; use emacs theme
- org-roam-ui-follow t
- org-roam-ui-update-on-save t ; update when a org roam file is saved
- ))
-#+end_src
-** org-appear
-Org appear makes it so that inline code blocks (=~~=), words marked verbatim (====) and (hyper)link syntax hide when viewing the file and appear when hovered on for easy editing.
-for example =[[id:xqyz][emacs]]= will become =emacs= when viewing the file, but turn into the original when the cursor is over the text.
-#+begin_src emacs-lisp
- (use-package! org-appear
- :hook (org-mode . org-appear-mode)
- :config
- (setq org-appear-autoemphasis t
- org-appear-autolinks t
- org-appear-autosubmarkers t
- org-appear-autoentities t))
-#+end_src
-** org-modern-indent
-Because doom's org ~+pretty~ flag turns on org modern, and org-modern is incompatible with ~org-startup-indented~, we use the ~org-indent-modern~ package
-#+begin_src emacs-lisp
-(use-package! org-modern-indent
- :defer t
-:hook (org-mode . org-modern-indent-mode))
-#+end_src
-* Eww
-#+begin_quote
-Eww... What browser is that girl using?
-#+end_quote
-
-~eww~ (Emacs Web WOWser) is, well, a web browser in Emacs.
-It only renders HTML and tries its best to render CSS, so javascript is out of the question (hooray!)
-
-~eww~ is fine on its own, but i have a config to make the experience better.
-Here we define what to search with, for me this is Ecosia.
-#+begin_src emacs-lisp
- (setq eww-search-prefix "https://ecosia.org/search?q=")
-#+end_src
-
-Where eww downloads files to.
-#+begin_src emacs-lisp
- (setq eww-download-directory (expand-file-name "~/Downloads/"))
-#+end_src
-** Functions
-Open a link in mpv
-#+begin_src emacs-lisp
- (defun my-browse-url-mpv (url &rest _args)
- "Open URL in mpv."
- (start-process "mpv" nil "mpv" url))
-#+end_src
-
-Open a url in pdf-tools
-#+begin_src emacs-lisp
- (defun my-browse-url-pdf (url &rest _args)
- "Fetch remote PDF and open in pdf-tools within Emacs."
- (let ((tmp (make-temp-file "emacs-pdf-" nil ".pdf")))
- (url-copy-file url tmp t)
- (find-file-other-window tmp)
- (pdf-view-mode)))
-#+end_src
-
-Download an image and put it into ~eww-download-directory~
-#+begin_src emacs-lisp
- (defun my/eww-download-image-at-point ()
- (interactive)
- (let ((url (or (get-text-property (point) 'image-url)
- (get-text-property (point) 'shr-url))))
- (if (not url)
- (message "No image at point")
- (let* ((filename (file-name-nondirectory (url-filename (url-generic-parse-url url))))
- (dest (expand-file-name filename eww-download-directory)))
- (url-copy-file url dest t)
- (message "Saved: %s" dest)))))
-#+end_src
-
-** Config :: Misc
-Use the functions defined above when opening specific links
-#+begin_src emacs-lisp
- (setq browse-url-handlers
- '(("\\(youtube\\.com\\|youtu\\.be\\|vimeo\\.com\\|twitch\\.tv\\)" . my-browse-url-mpv)
- ("\\.mp4$" . my-browse-url-mpv)
- ("\\.pdf$" . my-browse-url-pdf)
- ("^gemini://" . elpher-browse-url-elpher)
- ("^gopher://" . elpher-browse-url-elpher)
- ("." . eww-browse-url)))
-
-#+end_src
-
-Open a url in a secondary program, in my case ~Vivaldi~
-#+begin_src emacs-lisp
- (setq browse-url-secondary-browser-function 'browse-url-generic
- browse-url-generic-program "vivaldi")
-#+end_src
-
-** UI/UX settings
-#+begin_src emacs-lisp
- (setq shr-width 100)
-(setq shr-max-width 120)
-(setq shr-indentation 4)
-(setq shr-use-fonts nil)
-(setq shr-max-image-size '(800 . 600))
-(setq shr-image-animate t)
-#+end_src
-
-Let's make ~eww~ go into readable mode on page enter.
-#+begin_src emacs-lisp
- (add-hook 'eww-after-render-hook #'eww-readable)
-#+end_src
-** Keybindings
-#+begin_src emacs-lisp
-(with-eval-after-load 'eww
- (define-key eww-mode-map (kbd "=") #'text-scale-increase)
- (define-key eww-mode-map (kbd "-") #'text-scale-decrease)
- (define-key eww-mode-map (kbd "0") #'text-scale-adjust)
- (define-key eww-mode-map (kbd "b") #'eww-back-url)
- (define-key eww-mode-map (kbd "a") #'eww-add-bookmark)
- (define-key eww-mode-map (kbd "U") #'shr-copy-url)
- (define-key eww-mode-map (kbd "D") #'my/eww-download-image-at-point)
- (evil-define-key 'normal eww-mode-map
- "b" #'eww-back-url
- "a" #'eww-add-bookmark
- "U" #'shr-copy-url
- "D" #'my/eww-download-image-at-point))
-
-(provide 'browser)
-#+end_src
-
-* Elpher
-#+begin_quote
-Elpher? I hardly know her!
-#+end_quote
-
-Elpher is a way to use the Gemini and Gopher protocols in Emacs.
-#+begin_src emacs-lisp
-(use-package! elpher)
-#+end_src
-There's not much config needed except 1 (one) binding
-#+begin_src emacs-lisp
- (map!
- :leader
- :prefix "o g"
- :desc "Elpher" "e" #'elpher
- :desc "Browse Elpher" "b" #'elpher-browse-url-elpher)
-#+end_src
-* Packages
-#+BEGIN_QUOTE
-The ones that dont belong
-#+END_QUOTE
-These packages are (mostly) defined in ~packages.el~ and configured here.
-** TODO mosey
-Mosey lets you ~Mosey down~ (get it?) to different points in a code block.
-#+begin_src emacs-lisp
-(use-package! mosey
- :commands (mosey-forward mosey-backward
- mosey-forward-bounce mosey-backward-bounce
- mosey-forward-cycle mosey-backward-cycle))
-#+end_src
-TODO: make this work properly and not just go to the start/end of line
-*** Keybinds
-Keybinds for mosey, under K because m was taken by localleader bindings
-#+begin_src emacs-lisp
-(map! :leader
- (:prefix ("k" . "mosey")
- :desc "Mosey backward" "a" #'mosey-backward-bounce
- :desc "Mosey forward" "e" #'mosey-forward-bounce))
-#+end_src
-
-** Woman
-~woman~ is a way to view man pages straight in Emacs, without shelling out to the actual ~man~ binary, it stands for ~without man~
-Let's map this to a mnemonic binding, in this case ~Open Woman~
-
-#+begin_src emacs-lisp
- (map!
- :leader
- :prefix "o"
- :desc "Woman" "w" #'woman)
-#+end_src
-** Dired
-~Dired~ (Directory editor) is a way to, well, edit directories (and files!) in Emacs.
-This is similar to ~oil.nvim~
-These are only bindings as dired is pre-installed on Emacs.
-#+begin_src emacs-lisp
- (map!
- :leader
- :prefix ("Dired" . "d")
- :desc "Dired" "d" #'dired
- :desc "Dired here" "h" #'dired-jump)
-#+end_src
-~dired~ prompts for the directory to open first, while ~dired-jump~ opens dired in the current directory, pretty neat.
-** eat
-~eat~ (emulate a terminal) is a terminal emulator, in elisp, for emacs!
-It is not available as a doom emacs module, so we declare it manually.
-#+begin_src emacs-lisp
- (use-package! eat
- :defer t)
-#+end_src
-
-Then we add bindings for ~eat~ as to not have to run ~M-x~ everytime.
-#+begin_src emacs-lisp
- (map!
- :leader
- :prefix "o"
- :desc "Open Eat" "e" #'eat-other-window) ; dont steal the current window
-#+end_src
-
-** nov.el
-#+begin_quote
-This is pushing it.
-#+end_quote
-
-nov.el is a way to read EPUB's in Emacs! because why buy a kindle if you have GNU?
-Requires ~(package! nov)~ in packages.el (doom)
-#+begin_src emacs-lisp
-(use-package! nov
- :mode ("\\.epub\\'" . nov-mode)
- :config
- (setq nov-text-width 80
- nov-variable-pitch t)
- (add-hook 'nov-mode-hook
- (lambda ()
- (face-remap-add-relative 'variable-pitch
- :family "Georgia" :height 1.3))) ; different font for reading
- (add-hook 'nov-mode-hook #'writeroom-mode) ; center text & stuff
- #+end_src
-
- Now let's add some nov mappings
- #+begin_src emacs-lisp
- (map! :map nov-mode-map
- :n "i" #'nov-scroll-up ; scroll roughly a page up
- :n "e" #'nov-scroll-down ; scroll roughly a page down
- :n "]" #'nov-next-document
- :n "[" #'nov-previous-document
- :n "t" #'nov-goto-toc))
-#+end_src
-
-* Tramp
-
-Tramp is a way to edit files via SSH and root owned files in Emacs.
-This section is purely used to help me with editing root owned files, without calling ~doas emacs~ and losing my config
-#+begin_src emacs-lisp
-(with-eval-after-load 'tramp
- (add-to-list 'tramp-methods
- '("doas"
- (tramp-login-program "doas")
- (tramp-login-args (("-u" "%u") ("-s")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-connection-timeout 10))))
-#+end_src
-* Evil
-~Mapping at its finest~
-EVIl mode emulates VIM bindings in Emacs.
-
-Remove ~evil-snipe~ as it conflicts with other bindings
-#+begin_src emacs-lisp
- (remove-hook 'doom-first-input-hook #'evil-snipe-mode)
-#+end_src
-
-** Lispy
-~lispy~[fn:1] is a way to run vim motions in a S-exp aware way.
-As an example , running ~D~ on
-~(message "Get rid of |everything" a b (+ 1 2))~, where ~|~ is the point would ruin the S-exp, but with ~lispy~, this turns into:
-~(message "Get rid of ")~
-Pretty neat, huh?
-#+begin_src emacs-lisp
- (use-package lispyville
- :init
- (general-add-hook '(emacs-lisp-mode-hook lisp-mode-hook) #'lispyville-mode) ;; lispy lisps
- :config
- (lispyville-set-key-theme '(operators c-w additional)))
-#+end_src
-** Colemak
-The biggest block for last.
-This is a custom mapping i made for EVIl mode that takes the bindings from [[https://github.com/kalbasit/vim-colemak][kalbasit/vim-colemak]] and puts them into Emacs.
-I plan on packaging this to [[https://melpa.org][MELPA]] soon.
-
-Make ~o~ go right in org mode (previously ~inserted on newline~)
-#+begin_src emacs-lisp
- (after! evil-org
- (evil-define-key 'normal evil-org-mode-map
- "o" #'evil-forward-char))
-#+end_src
-
-*** Main bindings
-#+begin_src emacs-lisp
- (evil-define-key '(normal visual operator) 'global
- "n" 'evil-backward-char
- "e" 'evil-next-line
- "i" 'evil-previous-line
- "o" 'evil-forward-char)
-#+end_src
-*** Motion
-#+begin_src emacs-lisp
- (evil-define-key '(normal visual operator) 'global
- "l" 'evil-backward-word-begin
- "L" 'evil-backward-WORD-begin
- "u" 'evil-forward-word-end
- "U" 'evil-forward-WORD-end
- "y" 'evil-forward-word-begin
- "Y" 'evil-forward-word-begin)
-
-(with-eval-after-load 'evil-ex
- (define-key evil-ex-completion-map (kbd "C-l") 'left-word)
- (define-key evil-ex-completion-map (kbd "C-y") 'right-word))
-
-
-#+end_src
-*** Inserting
-#+begin_src emacs-lisp
- (evil-define-key 'normal 'global
- "s" 'evil-insert
- "S" 'evil-insert-line
- "t" 'evil-append
- "T" 'evil-append-line
- "h" 'evil-open-below
- "H" 'evil-open-above)
-#+end_src
-*** Changing
-#+begin_src emacs-lisp
- (evil-define-key '(normal visual) 'global
- "w" 'evil-change
- "W" 'evil-change-line)
-#+end_src
-*** Editing
-#+begin_src emacs-lisp
- (evil-define-key 'normal 'global
- "x" 'evil-delete-char
- "c" 'evil-yank
- "v" 'evil-paste-after
- "X" 'evil-delete-line
- "C" 'evil-yank-line
- "V" 'evil-paste-before)
-
-(evil-define-key 'visual 'global
- "x" 'evil-delete
- "c" 'evil-yank
- "v" 'evil-paste-after)
-#+end_src
-*** TODO Undo
-Doesnt work in org files
-#+begin_src emacs-lisp
-(evil-define-key 'normal 'global
- "z" 'evil-undo
- "Z" 'evil-redo)
-
-
-#+end_src
-*** Visual
-#+begin_src emacs-lisp
-(evil-define-key 'normal 'global
- "a" 'evil-visual-char
- "A" 'evil-visual-line
- "ga" 'evil-visual-restore)
-
-
-#+end_src
-*** Find/Search
-#+begin_src emacs-lisp
-(evil-define-key '(normal visual operator) 'global
- "p" 'evil-find-char-to
- "P" 'evil-find-char-to-backward
- "b" 'evil-repeat-find-char
- "B" 'evil-repeat-find-char-reverse
- "k" 'evil-search-next
- "K" 'evil-search-previous)
-
-
-#+end_src
-*** Inner change
-#+begin_src emacs-lisp
-(with-eval-after-load 'evil
- (evil-define-key '(operator visual) 'global "r" evil-inner-text-objects-map))
-
-#+end_src
-*** Scroll
-#+begin_src emacs-lisp
-(define-prefix-command 'my-colemak-fold-map)
-(evil-define-key '(normal visual) 'global "j" 'my-colemak-fold-map)
-(define-key my-colemak-fold-map "j" 'evil-scroll-line-to-center)
-(define-key my-colemak-fold-map "n" 'evil-scroll-line-to-top)
-(define-key my-colemak-fold-map "e" 'evil-scroll-line-to-bottom)
-
-
-#+end_src
-*** Lookup
-#+begin_src emacs-lisp
-(evil-define-key 'normal 'global
- "gK" 'evil-lookup)
-
-
-#+end_src
-*** Window management
-#+begin_src emacs-lisp
-(map! :n "SPC w n" #'evil-window-left
- :n "SPC w e" #'evil-window-down
- :n "SPC w i" #'evil-window-up
- :n "SPC w o" #'evil-window-right)
-
-#+end_src
-
-* Footnotes
-
-[fn:1]
-The actual vim motion part is provided by ~lispyville~, which adds evil support into
diff --git a/doom/.config/doom/custom.el b/doom/.config/doom/custom.el
deleted file mode 100644
index f8551a0..0000000
--- a/doom/.config/doom/custom.el
+++ /dev/null
@@ -1,47 +0,0 @@
-;;; -*- lexical-binding: t -*-
-(custom-set-variables
- ;; custom-set-variables was added by Custom.
- ;; If you edit it by hand, you could mess it up, so be careful.
- ;; Your init file should contain only one such instance.
- ;; If there is more than one, they won't work right.
- '(custom-safe-themes
- '("1f326e259bff7e24de2f24bf77b9c21e0ff086ed75705e9f3d4231d7b525b00b"
- "9cacb5cd8f414a2d97dba01dc081ad3184f1bc08b080bd9c56b4f85aab085368"
- "53b86437220a4509257e44e9e537830e2d57e55b0a63b981212c235afb083bea"
- "824954ed6d977d2b0ddf8cf23fcfc59eb3e9cdb72991c7d4591f784a34742526"
- "720838034f1dd3b3da66f6bd4d053ee67c93a747b219d1c546c41c4e425daf93"
- "2d2bdc418a7811a9652729894b3b74679bd8652959e09f1e046081d722d1987e"
- "7c3d62a64bafb2cc95cd2de70f7e4446de85e40098ad314ba2291fc07501b70c"
- "bb18b6d5982beeb76a37ced9211e972f84e8e76af9579456aa8cef794ae0bcb9"
- "5f843ef0d18f55ef9b1e72ac9aaa59efdd698ee31781a86f7a054047a036bd08"
- "d6d569756b04beb0fc7c9ca83d18f61f18875849f4b9a9d34fca0b69056dc4de"
- "e4fc3c202ee94a1570a645ca8b7388f4fe783e52ac47ea141a22bef26e0b2e89"
- "ae62fac1af292396a8e77e48435b41058fda45be24ac79fa40c89e1173b9b2d6"
- "530e730924892af285af79d88339048da48c572a3c974882682eadb9881fb051"
- "b243ec44629b75034c83be3fa411662f89582223012e8f4110a82dc40bf8561a"
- "8c8a79d60815b0c094ed78a6936d80e01404d6ab48f93ce121206eb0d701e6c0"
- "81ce39f63b6a730b1f5f33019100fc087122e5660830121809968c5d2381684d"
- "10e330880269244ae45ae9e02fe6f55766da9e15036e7c7f07d7ce228195deb5"
- "28f3ac0f5fade64dc7e27abe9d32e7d85576c40940977e8e319f25055d3a28b7"
- "967c23e9ba179b80560774419f081df22e7674aac23c5c550b817e4a1ce7d058"
- "456697e914823ee45365b843c89fbc79191fdbaff471b29aad9dcbe0ee1d5641"
- "df8500a3d0f9ba9aeaf8c9a74e108e3eac67ba72e64aceb11e6740edde779f70"
- "a13adebab62892a6749eb620e2331b73c61fde6040e77413b7d7fb199d68ae9e"
- "42b4451c14bde0a78d9b68c199dbd2ec554efec4a2bf3161944e6dbcc2c5a84b"
- "2c68f4cf27b1e5f8c388aee2e9df91eb44092b94c78f6bea1cf411daaf6f1fa9"
- "fb6cab2f9f670e9a65f39475de9a106cc7607f6ea6aec5397eee3950f75911b5"
- "4c6fafeb552599e42567742ca0daa9755545421103a2d9b96407ed94abef15a9"
- "8533fc4f3d5498e100e946bebcaf8ec553ee2b64f19cb2110e95eda0dfa4b854"
- "beb0a691bac517cef04770453967ec4415ade448b51a89c785ad4ef1c332c575"
- "b7970f3f38400138468f7d6dfc25cf3daa79f6e10d4472efa31f23b5b9152e64"
- "be275b45bca52c599b82718759760dbc0e5044b22c7fca0b9b6b36f76d76f5d6"
- "a9eeab09d61fef94084a95f82557e147d9630fbbb82a837f971f83e66e21e5ad" default))
- '(helm-minibuffer-history-key "M-p")
- '(safe-local-variable-directories
- '("/home/sophie/melpa/" "/home/sophie/.config/doom/" "~/.config/emacs/")))
-(custom-set-faces
- ;; custom-set-faces was added by Custom.
- ;; If you edit it by hand, you could mess it up, so be careful.
- ;; Your init file should contain only one such instance.
- ;; If there is more than one, they won't work right.
- )
diff --git a/doom/.config/doom/extra-themes/2026-09-18-213348_1916x1052_scrot.png b/doom/.config/doom/extra-themes/2026-09-18-213348_1916x1052_scrot.png
deleted file mode 100644
index 32b4a29..0000000
--- a/doom/.config/doom/extra-themes/2026-09-18-213348_1916x1052_scrot.png
+++ /dev/null
Binary files differ
diff --git a/doom/.config/doom/extra-themes/evergarden-common.el b/doom/.config/doom/extra-themes/evergarden-common.el
deleted file mode 100644
index 30f0e60..0000000
--- a/doom/.config/doom/extra-themes/evergarden-common.el
+++ /dev/null
@@ -1,315 +0,0 @@
-;;; evergarden-common.el --- Shared engine for the evergarden theme family -*- lexical-binding: t; -*-
-
-;; Author: expansion of the original evergarden theme by @koi.rip
-;; Version: 0.2.0
-;; Package-Requires: ((emacs "28.1") (modus-themes "5.0.0") (ef-themes "2.0.0"))
-;; Keywords: faces, theme
-
-;;; Commentary:
-;; NOT a theme by itself. shared engine for evergarden themes
-;;; Code:
-
-(require 'modus-themes)
-(require 'ef-themes)
-
-(defgroup evergarden-theme nil
- "Cozy evergarden theme family built on Modus and Ef."
- :group 'faces
- :group 'ef-themes
- :prefix "evergarden-")
-
-(defconst evergarden-theme-family 'evergarden-theme)
-
-(defconst evergarden--term-mappings-dark
- '((bg-term-black bg-main)
- (fg-term-black bg-main)
- (bg-term-black-bright overlay0)
- (fg-term-black-bright overlay0)
- (bg-term-white fg-dim)
- (fg-term-white fg-dim)
- (bg-term-white-bright fg-main)
- (fg-term-white-bright fg-main)))
-
-(defconst evergarden--term-mappings-light
- '((bg-term-black fg-main)
- (fg-term-black fg-main)
- (bg-term-black-bright fg-dim)
- (fg-term-black-bright fg-dim)
- (bg-term-white border)
- (fg-term-white border)
- (bg-term-white-bright bg-main)
- (fg-term-white-bright bg-main)))
-
-(defconst evergarden--term-mappings-color
- '((bg-term-red red) (fg-term-red red)
- (bg-term-red-bright red-warmer) (fg-term-red-bright red-warmer)
- (bg-term-green green) (fg-term-green green)
- (bg-term-green-bright green-warmer) (fg-term-green-bright green-warmer)
- (bg-term-yellow yellow) (fg-term-yellow yellow)
- (bg-term-yellow-bright yellow-warmer) (fg-term-yellow-bright yellow-warmer)
- (bg-term-blue blue) (fg-term-blue blue)
- (bg-term-blue-bright blue-warmer) (fg-term-blue-bright blue-warmer)
- (bg-term-magenta magenta) (fg-term-magenta magenta)
- (bg-term-magenta-bright magenta-warmer) (fg-term-magenta-bright magenta-warmer)
- (bg-term-cyan cyan) (fg-term-cyan cyan)
- (bg-term-cyan-bright cyan-warmer) (fg-term-cyan-bright cyan-warmer)))
-
-(defconst evergarden-palette-mappings-partial
- (append
- '(
- (err red)
- (warning yellow)
- (info cyan)
- (underline-err red)
- (underline-warning yellow)
- (underline-note cyan)
- (modeline-err red)
- (modeline-warning yellow)
- (modeline-info cyan)
- (bg-prominent-warning bg-warning)
- (fg-prominent-warning fg-main)
- (bg-prominent-note bg-info)
- (fg-prominent-note fg-main)
-
- (fg-link blue)
- (fg-link-visited magenta)
- (fg-link-symbolic cyan)
- (bg-link unspecified)
- (bg-link-symbolic unspecified)
- (bg-link-visited unspecified)
- (underline-link blue)
- (underline-link-visited magenta)
- (underline-link-symbolic cyan)
-
- (name cyan)
- (keybind green)
- (identifier fg-main)
- (fg-prompt pink)
- (bg-prompt unspecified)
-
- (builtin cyan-cooler)
- (comment overlay2)
- (constant pink)
- (fnname green)
- (fnname-call green-warmer)
- (keyword red)
- (preprocessor cherry)
- (property cyan-cooler)
- (docstring cyan-cooler)
- (docmarkup cyan)
- (string lime)
- (type yellow)
- (variable fg-main)
- (variable-use fg-main)
- (rx-backslash yellow)
- (rx-construct cyan)
-
- (accent-0 green)
- (accent-1 cyan)
- (accent-2 magenta-warmer)
- (accent-3 orange)
-
- (fg-button-active fg-main)
- (fg-button-inactive fg-dim)
- (bg-button-active bg-main)
- (bg-button-inactive bg-dim)
- (fg-region fg-main)
- (bg-mark-delete bg-red-subtle)
- (fg-mark-delete red)
- (bg-mark-select bg-yellow-subtle)
- (fg-mark-select yellow)
- (bg-mark-other bg-cyan-subtle)
- (fg-mark-other cyan)
-
- (date-common cyan)
- (date-deadline red)
- (date-deadline-subtle red-faint)
- (date-event fg-alt)
- (date-holiday red-warmer)
- (date-holiday-other magenta-warmer)
- (date-now fg-main)
- (date-range fg-alt)
- (date-scheduled green)
- (date-scheduled-subtle green-faint)
- (date-weekday blue)
- (date-weekend red-faint)
-
- (fg-prose-code green-cooler)
- (prose-done green)
- (fg-prose-macro green)
- (prose-metadata fg-dim)
- (prose-metadata-value fg-alt)
- (prose-table fg-alt)
- (prose-table-formula cyan)
- (prose-tag yellow-faint)
- (prose-todo cyan)
- (fg-prose-verbatim magenta-warmer)
-
- (mail-cite-0 green)
- (mail-cite-1 cyan)
- (mail-cite-2 magenta-warmer)
- (mail-cite-3 red-warmer)
- (mail-part cyan)
- (mail-recipient blue)
- (mail-subject green)
- (mail-other fg-alt)
-
- (bg-search-static bg-cyan-subtle)
- (bg-search-current bg-blue-intense)
- (bg-search-lazy bg-blue-subtle)
- (bg-search-replace bg-red-intense)
-
- (bg-search-rx-group-0 bg-green-intense)
- (bg-search-rx-group-1 bg-magenta-intense)
- (bg-search-rx-group-2 bg-cyan-intense)
- (bg-search-rx-group-3 bg-red-intense)
-
- (bg-space-err bg-red-intense)
- (bg-space bg-main)
- (fg-space border)
-
- (fringe bg-main)
- (fg-line-number-active overlay1)
- (fg-line-number-inactive surface1)
- (bg-line-number-active bg-hl-line)
- (bg-line-number-inactive bg-main)
-
- (bg-tab-bar overlay1)
- (bg-tab-current bg-main)
- (bg-tab-other surface2)
-
- (bg-prominent-err bg-err)
- (fg-prominent-err err)
- (fg-paren-match fg-main)
- (underline-paren-match unspecified)
- (bg-active-argument bg-active)
- (fg-active-argument green)
- (bg-active-value bg-green-subtle)
- (fg-active-value green)
-
- (bg-prose-block-delimiter bg-prose-block)
- (fg-prose-block-delimiter fg-dim)
- (bg-prose-block-contents bg-prose-block)
- (bg-prose-code unspecified)
- (bg-prose-macro unspecified)
- (bg-prose-verbatim unspecified)
-
- (fg-completion-match-0 green)
- (fg-completion-match-1 cyan)
- (fg-completion-match-2 magenta-warmer)
- (fg-completion-match-3 orange)
- (bg-completion-match-0 unspecified)
- (bg-completion-match-1 unspecified)
- (bg-completion-match-2 unspecified)
- (bg-completion-match-3 unspecified)
- (bg-completion bg-dim)
- (fg-search-current fg-main)
-
- (rainbow-0 green)
- (rainbow-1 cyan)
- (rainbow-2 magenta)
- (rainbow-3 blue)
- (rainbow-4 orange)
- (rainbow-5 red)
- (rainbow-6 yellow)
- (rainbow-7 fg-alt)
- (rainbow-8 fg-dim)
-
- (fg-heading-0 green)
- (fg-heading-1 green)
- (fg-heading-2 cyan)
- (fg-heading-3 magenta)
- (fg-heading-4 blue)
- (fg-heading-5 orange)
- (fg-heading-6 red)
- (fg-heading-7 fg-alt)
- (fg-heading-8 fg-dim)
- (bg-heading-0 unspecified)
- (bg-heading-1 bg-green-nuanced)
- (bg-heading-2 unspecified)
- (bg-heading-3 bg-magenta-nuanced)
- (bg-heading-4 bg-blue-nuanced)
- (bg-heading-5 unspecified)
- (bg-heading-6 bg-red-nuanced)
- (bg-heading-7 unspecified)
- (bg-heading-8 unspecified)
- (overline-heading-0 green)
- (overline-heading-1 green)
- (overline-heading-2 cyan)
- (overline-heading-3 magenta)
- (overline-heading-4 blue)
- (overline-heading-5 orange)
- (overline-heading-6 red)
- (overline-heading-7 unspecified)
- (overline-heading-8 unspecified))
- evergarden--term-mappings-color))
-
-(defconst evergarden-custom-faces
- '(`(corfu-default ((,c :inherit modus-themes-fixed-pitch
- :background ,bg-dim
- :foreground ,fg-main)))
- `(corfu-current ((,c :background ,bg-green-intense
- :foreground ,fg-main
- :extend t
- :box (:line-width -1 :color ,green)
- :weight semi-bold)))
- `(corfu-border ((,c :background ,border
- :foreground ,border)))
- `(corfu-bar ((,c :background ,green)))
- `(corfu-popupinfo ((,c :background ,bg-dim
- :foreground ,fg-main)))))
-
-(defun evergarden--ensure-modus-theme-metadata (name family description mode palette-sym overrides-sym)
- (unless (plist-get (get name 'theme-properties) :modus-core-palette)
- (modus-themes-declare name family description mode palette-sym nil overrides-sym)
- (modus-themes-register name)))
-
-(defun evergarden-build-theme (flavor-name palette-partial mode)
- (let* ((flavor-str (symbol-name flavor-name))
- (description (format "Cozy evergarden dark theme, %s flavor."
- (capitalize (substring flavor-str (length "evergarden-")))))
- (palette-sym (intern (concat flavor-str "-palette")))
- (overrides-sym (intern (concat flavor-str "-palette-overrides")))
- (term-mappings (if (eq mode 'dark)
- evergarden--term-mappings-dark
- evergarden--term-mappings-light)))
- (eval
- `(progn
- (defcustom ,overrides-sym nil
- ,(format "Overrides for `%s'.
-
-Each element should have the form (NAME VALUE), where NAME is a palette
-entry from `%s' and VALUE is either another palette symbol or a color
-string."
- palette-sym palette-sym)
- :group 'evergarden-theme
- :package-version '(evergarden-theme . "0.2.0")
- :type '(repeat (list symbol (choice symbol string))))
-
- (defconst ,palette-sym
- (modus-themes-generate-palette
- ',palette-partial
- ',(if (eq mode 'dark) 'cool 'warm)
- nil
- (append evergarden-palette-mappings-partial
- ',term-mappings
- ef-themes-palette-common))
- ,(format "Full palette for `%s'." flavor-name))
-
- (evergarden--ensure-modus-theme-metadata
- ',flavor-name 'evergarden-theme ,description ',mode ',palette-sym ',overrides-sym)
-
- (modus-themes-theme
- ',flavor-name 'evergarden-theme ,description ',mode
- ',palette-sym nil ',overrides-sym 'evergarden-custom-faces))
- t)))
-
-;;;###autoload
-(when load-file-name
- (add-to-list 'custom-theme-load-path
- (file-name-as-directory
- (file-name-directory load-file-name))))
-
-(provide 'evergarden-common)
-
-;;; evergarden-common.el ends here
diff --git a/doom/.config/doom/extra-themes/evergarden-fall-theme.el b/doom/.config/doom/extra-themes/evergarden-fall-theme.el
deleted file mode 100644
index 30d6a89..0000000
--- a/doom/.config/doom/extra-themes/evergarden-fall-theme.el
+++ /dev/null
@@ -1,176 +0,0 @@
-;;; evergarden-fall-theme.el --- Evergarden, Fall flavor -*- lexical-binding: t; -*-
-
-;; Author: expansion of the original evergarden theme by @koi.rip
-;; Version: 0.2.0
-;; Package-Requires: ((emacs "28.1") (modus-themes "5.0.0") (ef-themes "2.0.0"))
-;; Keywords: faces, theme
-
-;;; Commentary:
-;; Fall evergarden
-
-;;; Code:
-
-(unless (featurep 'evergarden-common)
- (let ((common (locate-file "evergarden-common"
- (append (seq-filter #'stringp custom-theme-load-path)
- load-path)
- '(".el" ".elc" ""))))
- (if common
- (load common)
- (error "evergarden-common.el not found; add its directory to `custom-theme-load-path'"))))
-
-(defconst evergarden-fall-palette-partial
- '(
- ;; Core backgrounds / foregrounds
- (cursor "#fae6ef")
- (bg-main "#232a2e")
- (bg-dim "#2b3337")
- (bg-alt "#374145")
- (fg-main "#f8f9e8")
- (fg-dim "#adc9bc")
- (fg-alt "#96b4aa")
- (bg-active "#4a585c")
- (bg-inactive "#2b3337")
- (border "#58686d")
-
- ;; Fall's own named palette (from the whiskers color table)
- (bg-hl "#4a585c")
- (bg-prose-block "#2a3338")
- (red "#f57f82")
- (orange "#f7a182")
- (yellow "#f5d098")
- (lime "#dbe6af")
- (green "#cbe3b3")
- (aqua "#b3e3ca")
- (skye "#b3e6db")
- (snow "#afd9e6")
- (blue "#b2caed")
- (purple "#d2bdf3")
- (pink "#f3c0e5")
- (cherry "#fae6ef")
- (text "#f8f9e8")
- (subtext1 "#adc9bc")
- (subtext0 "#96b4aa")
- (overlay2 "#839e9a")
- (overlay1 "#6f8788")
- (overlay0 "#58686d")
- (surface2 "#4a585c")
- (surface1 "#374145")
- (surface0 "#2b3337")
- (base "#232a2e")
- (mantle "#1c2225")
- (crust "#171c1f")
-
- ;; Red family
- (red-warmer "#f6788f")
- (red-cooler "#f48f76")
- (red-faint "#d07073")
-
- ;; Green family
- (green-warmer "#dbe6af")
- (green-cooler "#bae1af")
- (green-faint "#b1c999")
-
- ;; Yellow family
- (yellow-warmer "#f6c498")
- (yellow-cooler "#f1dc97")
- (yellow-faint "#d5b585")
-
- ;; Blue family
- (blue-warmer "#afd9e6")
- (blue-cooler "#aeb8ec")
- (blue-faint "#98aed0")
-
- ;; Magenta/purple family
- (magenta "#d2bdf3")
- (magenta-warmer "#f3c0e5")
- (magenta-cooler "#dcb8f2")
- (magenta-faint "#b5a0d8")
-
- ;; Cyan family
- (cyan "#b3e3ca")
- (cyan-warmer "#b3e3bf")
- (cyan-cooler "#b3e6db")
- (cyan-faint "#97c7ae")
-
- ;; Intense/Subtle/Nuanced backgrounds
- (bg-red-intense "#d79d9f")
- (bg-red-subtle "#cca8a9")
- (bg-red-nuanced "#c5afb0")
- (bg-green-intense "#cbe1b5")
- (bg-green-subtle "#cbd8be")
- (bg-green-nuanced "#cbd3c3")
- (bg-yellow-intense "#deccb0")
- (bg-yellow-subtle "#d5cab9")
- (bg-yellow-nuanced "#d0c9be")
- (bg-blue-intense "#bccce4")
- (bg-blue-subtle "#c4cedc")
- (bg-blue-nuanced "#c8ced8")
- (bg-magenta-intense "#d4c8e8")
- (bg-magenta-subtle "#d6cee2")
- (bg-magenta-nuanced "#d7d2de")
- (bg-cyan-intense "#b5e1ca")
- (bg-cyan-subtle "#bed8cb")
- (bg-cyan-nuanced "#c3d3cb")
-
- ;; Graph colors
- (bg-graph-red-0 "#e09497")
- (bg-graph-red-1 "#d69ea0")
- (bg-graph-green-0 "#cbe8ae")
- (bg-graph-green-1 "#cbe0b6")
- (bg-graph-yellow-0 "#e6cda8")
- (bg-graph-yellow-1 "#ddcbb1")
- (bg-graph-blue-0 "#b6cbea")
- (bg-graph-blue-1 "#bdcce3")
- (bg-graph-magenta-0 "#d3c3ed")
- (bg-graph-magenta-1 "#d4c8e8")
- (bg-graph-cyan-0 "#aee8ca")
- (bg-graph-cyan-1 "#b6e0ca")
-
- ;; Diff
- (bg-added "#cbe1b5")
- (bg-added-faint "#cbd8be")
- (bg-added-refine "#cbdcba")
- (bg-added-fringe "#cbe8ae")
- (fg-added "#cbe3b3")
- (fg-added-intense "#8bcd49")
-
- (bg-changed "#deccb0")
- (bg-changed-faint "#d5cab9")
- (bg-changed-refine "#d9cbb5")
- (bg-changed-fringe "#e6cda8")
- (fg-changed "#f1dc97")
- (fg-changed-intense "#efbd19")
-
- (bg-removed "#d79d9f")
- (bg-removed-faint "#cca8a9")
- (bg-removed-refine "#d0a4a5")
- (bg-removed-fringe "#e09497")
- (fg-removed "#f57f82")
- (fg-removed-intense "#ef050d")
-
- (bg-diff-context "#4a585c")
-
- ;; UI chrome
- (bg-mode-line-active "#435053")
- (fg-mode-line-active "#f8f9e8")
- (bg-mode-line-inactive "#2b3337")
- (fg-mode-line-inactive "#adc9bc")
- (border-mode-line-active "#cbe3b3")
- (border-mode-line-inactive "#58686d")
- (bg-completion "#2b3337")
- (bg-hover "#4a585c")
- (bg-hover-secondary "#c4cedc")
- (bg-hl-line "#2b3337")
- (bg-paren-match "#f7a182")
- (bg-err "#d79d9f")
- (bg-warning "#deccb0")
- (bg-info "#b5e1ca")
- (bg-region "#374145"))
- "Base palette entries for `evergarden-fall', generated by whiskers.")
-
-(evergarden-build-theme 'evergarden-fall evergarden-fall-palette-partial 'dark)
-
-(provide 'evergarden-fall-theme)
-
-;;; evergarden-fall-theme.el ends here
diff --git a/doom/.config/doom/extra-themes/evergarden-spring-theme.el b/doom/.config/doom/extra-themes/evergarden-spring-theme.el
deleted file mode 100644
index 181dae9..0000000
--- a/doom/.config/doom/extra-themes/evergarden-spring-theme.el
+++ /dev/null
@@ -1,176 +0,0 @@
-;;; evergarden-spring-theme.el --- Evergarden, Spring flavor -*- lexical-binding: t; -*-
-
-;; Author: expansion of the original evergarden theme by @koi.rip
-;; Version: 0.2.0
-;; Package-Requires: ((emacs "28.1") (modus-themes "5.0.0") (ef-themes "2.0.0"))
-;; Keywords: faces, theme
-
-;;; Commentary:
-;; Spring evergarden
-
-;;; Code:
-
-(unless (featurep 'evergarden-common)
- (let ((common (locate-file "evergarden-common"
- (append (seq-filter #'stringp custom-theme-load-path)
- load-path)
- '(".el" ".elc" ""))))
- (if common
- (load common)
- (error "evergarden-common.el not found; add its directory to `custom-theme-load-path'"))))
-
-(defconst evergarden-spring-palette-partial
- '(
- ;; Core backgrounds / foregrounds
- (cursor "#fae6ef")
- (bg-main "#2b3438")
- (bg-dim "#343e43")
- (bg-alt "#3e4a4f")
- (fg-main "#f8f9e8")
- (fg-dim "#adc9bc")
- (fg-alt "#96b4aa")
- (bg-active "#4a585c")
- (bg-inactive "#343e43")
- (border "#58686d")
-
- ;; Spring's own named palette (from the whiskers color table)
- (bg-hl "#4a585c")
- (bg-prose-block "#323d42")
- (red "#f57f82")
- (orange "#f7a182")
- (yellow "#f5d098")
- (lime "#dbe6af")
- (green "#cbe3b3")
- (aqua "#b3e3ca")
- (skye "#b3e6db")
- (snow "#afd9e6")
- (blue "#b2caed")
- (purple "#d2bdf3")
- (pink "#f3c0e5")
- (cherry "#fae6ef")
- (text "#f8f9e8")
- (subtext1 "#adc9bc")
- (subtext0 "#96b4aa")
- (overlay2 "#839e9a")
- (overlay1 "#6f8788")
- (overlay0 "#58686d")
- (surface2 "#4a585c")
- (surface1 "#3e4a4f")
- (surface0 "#343e43")
- (base "#2b3438")
- (mantle "#232a2e")
- (crust "#1c2225")
-
- ;; Red family
- (red-warmer "#f6788f")
- (red-cooler "#f48f76")
- (red-faint "#d07073")
-
- ;; Green family
- (green-warmer "#dbe6af")
- (green-cooler "#bae1af")
- (green-faint "#b1c999")
-
- ;; Yellow family
- (yellow-warmer "#f6c498")
- (yellow-cooler "#f1dc97")
- (yellow-faint "#d5b585")
-
- ;; Blue family
- (blue-warmer "#afd9e6")
- (blue-cooler "#aeb8ec")
- (blue-faint "#98aed0")
-
- ;; Magenta/purple family
- (magenta "#d2bdf3")
- (magenta-warmer "#f3c0e5")
- (magenta-cooler "#dcb8f2")
- (magenta-faint "#b5a0d8")
-
- ;; Cyan family
- (cyan "#b3e3ca")
- (cyan-warmer "#b3e3bf")
- (cyan-cooler "#b3e6db")
- (cyan-faint "#97c7ae")
-
- ;; Intense/Subtle/Nuanced backgrounds
- (bg-red-intense "#d79d9f")
- (bg-red-subtle "#cca8a9")
- (bg-red-nuanced "#c5afb0")
- (bg-green-intense "#cbe1b5")
- (bg-green-subtle "#cbd8be")
- (bg-green-nuanced "#cbd3c3")
- (bg-yellow-intense "#deccb0")
- (bg-yellow-subtle "#d5cab9")
- (bg-yellow-nuanced "#d0c9be")
- (bg-blue-intense "#bccce4")
- (bg-blue-subtle "#c4cedc")
- (bg-blue-nuanced "#c8ced8")
- (bg-magenta-intense "#d4c8e8")
- (bg-magenta-subtle "#d6cee2")
- (bg-magenta-nuanced "#d7d2de")
- (bg-cyan-intense "#b5e1ca")
- (bg-cyan-subtle "#bed8cb")
- (bg-cyan-nuanced "#c3d3cb")
-
- ;; Graph colors
- (bg-graph-red-0 "#e09497")
- (bg-graph-red-1 "#d69ea0")
- (bg-graph-green-0 "#cbe8ae")
- (bg-graph-green-1 "#cbe0b6")
- (bg-graph-yellow-0 "#e6cda8")
- (bg-graph-yellow-1 "#ddcbb1")
- (bg-graph-blue-0 "#b6cbea")
- (bg-graph-blue-1 "#bdcce3")
- (bg-graph-magenta-0 "#d3c3ed")
- (bg-graph-magenta-1 "#d4c8e8")
- (bg-graph-cyan-0 "#aee8ca")
- (bg-graph-cyan-1 "#b6e0ca")
-
- ;; Diff
- (bg-added "#cbe1b5")
- (bg-added-faint "#cbd8be")
- (bg-added-refine "#cbdcba")
- (bg-added-fringe "#cbe8ae")
- (fg-added "#cbe3b3")
- (fg-added-intense "#8bcd49")
-
- (bg-changed "#deccb0")
- (bg-changed-faint "#d5cab9")
- (bg-changed-refine "#d9cbb5")
- (bg-changed-fringe "#e6cda8")
- (fg-changed "#f1dc97")
- (fg-changed-intense "#efbd19")
-
- (bg-removed "#d79d9f")
- (bg-removed-faint "#cca8a9")
- (bg-removed-refine "#d0a4a5")
- (bg-removed-fringe "#e09497")
- (fg-removed "#f57f82")
- (fg-removed-intense "#ef050d")
-
- (bg-diff-context "#4a585c")
-
- ;; UI chrome
- (bg-mode-line-active "#435053")
- (fg-mode-line-active "#f8f9e8")
- (bg-mode-line-inactive "#343e43")
- (fg-mode-line-inactive "#adc9bc")
- (border-mode-line-active "#cbe3b3")
- (border-mode-line-inactive "#58686d")
- (bg-completion "#343e43")
- (bg-hover "#4a585c")
- (bg-hover-secondary "#c4cedc")
- (bg-hl-line "#343e43")
- (bg-paren-match "#f7a182")
- (bg-err "#d79d9f")
- (bg-warning "#deccb0")
- (bg-info "#b5e1ca")
- (bg-region "#3e4a4f"))
- "Base palette entries for `evergarden-spring', generated by whiskers.")
-
-(evergarden-build-theme 'evergarden-spring evergarden-spring-palette-partial 'dark)
-
-(provide 'evergarden-spring-theme)
-
-;;; evergarden-spring-theme.el ends here
diff --git a/doom/.config/doom/extra-themes/evergarden-summer-theme.el b/doom/.config/doom/extra-themes/evergarden-summer-theme.el
deleted file mode 100644
index 7d518ed..0000000
--- a/doom/.config/doom/extra-themes/evergarden-summer-theme.el
+++ /dev/null
@@ -1,176 +0,0 @@
-;;; evergarden-summer-theme.el --- Evergarden, Summer flavor -*- lexical-binding: t; -*-
-
-;; Author: expansion of the original evergarden theme by @koi.rip
-;; Version: 0.2.0
-;; Package-Requires: ((emacs "28.1") (modus-themes "5.0.0") (ef-themes "2.0.0"))
-;; Keywords: faces, theme
-
-;;; Commentary:
-;; Summer evergarden
-
-;;; Code:
-
-(unless (featurep 'evergarden-common)
- (let ((common (locate-file "evergarden-common"
- (append (seq-filter #'stringp custom-theme-load-path)
- load-path)
- '(".el" ".elc" ""))))
- (if common
- (load common)
- (error "evergarden-common.el not found; add its directory to `custom-theme-load-path'"))))
-
-(defconst evergarden-summer-palette-partial
- '(
- ;; Core backgrounds / foregrounds
- (cursor "#c29fb2")
- (bg-main "#f5efe6")
- (bg-dim "#ede8dd")
- (bg-alt "#e6e1d3")
- (fg-main "#2b3034")
- (fg-dim "#455355")
- (fg-alt "#576869")
- (bg-active "#ceccbd")
- (bg-inactive "#ede8dd")
- (border "#acb5a4")
-
- ;; Summer's own named palette (from the whiskers color table)
- (bg-hl "#ceccbd")
- (bg-prose-block "#f2ebe0")
- (red "#c58687")
- (orange "#c69883")
- (yellow "#c4aa80")
- (lime "#abb182")
- (green "#91a77a")
- (aqua "#74a48b")
- (skye "#719f96")
- (snow "#7799a3")
- (blue "#8294ad")
- (purple "#a897b8")
- (pink "#c499b8")
- (cherry "#c29fb2")
- (text "#2b3034")
- (subtext1 "#455355")
- (subtext0 "#576869")
- (overlay2 "#707d76")
- (overlay1 "#829084")
- (overlay0 "#acb5a4")
- (surface2 "#ceccbd")
- (surface1 "#e6e1d3")
- (surface0 "#ede8dd")
- (base "#f5efe6")
- (mantle "#f2eae1")
- (crust "#e8ded5")
-
- ;; Red family
- (red-warmer "#c5818c")
- (red-cooler "#c28e80")
- (red-faint "#cdb3b3")
-
- ;; Green family
- (green-warmer "#abb182")
- (green-cooler "#89aa7e")
- (green-faint "#abb6a0")
-
- ;; Yellow family
- (yellow-warmer "#c6a17e")
- (yellow-cooler "#c2b588")
- (yellow-faint "#cbbfad")
-
- ;; Blue family
- (blue-warmer "#7799a3")
- (blue-cooler "#868eb0")
- (blue-faint "#abb2bd")
-
- ;; Magenta/purple family
- (magenta "#a897b8")
- (magenta-warmer "#c499b8")
- (magenta-cooler "#b39bbb")
- (magenta-faint "#c4beca")
-
- ;; Cyan family
- (cyan "#74a48b")
- (cyan-warmer "#74a480")
- (cyan-cooler "#719f96")
- (cyan-faint "#9cb4a8")
-
- ;; Intense/Subtle/Nuanced backgrounds
- (bg-red-intense "#d3797b")
- (bg-red-subtle "#ca8284")
- (bg-red-nuanced "#c58788")
- (bg-green-intense "#93c85a")
- (bg-green-subtle "#92bd65")
- (bg-green-nuanced "#92b76b")
- (bg-yellow-intense "#d1ad73")
- (bg-yellow-subtle "#c7ab7d")
- (bg-yellow-nuanced "#c2aa82")
- (bg-blue-intense "#648fcc")
- (bg-blue-subtle "#6f91c1")
- (bg-blue-nuanced "#7492bc")
- (bg-magenta-intense "#a97cd4")
- (bg-magenta-subtle "#a985cb")
- (bg-magenta-nuanced "#a98ac6")
- (bg-cyan-intense "#52c68a")
- (bg-cyan-subtle "#5eba8a")
- (bg-cyan-nuanced "#64b48b")
-
- ;; Graph colors
- (bg-graph-red-0 "#c58788")
- (bg-graph-red-1 "#c58788")
- (bg-graph-green-0 "#92b76b")
- (bg-graph-green-1 "#92b76b")
- (bg-graph-yellow-0 "#c2aa82")
- (bg-graph-yellow-1 "#c2aa82")
- (bg-graph-blue-0 "#7492bc")
- (bg-graph-blue-1 "#7492bc")
- (bg-graph-magenta-0 "#a98ac6")
- (bg-graph-magenta-1 "#a98ac6")
- (bg-graph-cyan-0 "#64b48b")
- (bg-graph-cyan-1 "#64b48b")
-
- ;; Diff
- (bg-added "#93c85a")
- (bg-added-faint "#92bd65")
- (bg-added-refine "#93c161")
- (bg-added-fringe "#92b76b")
- (fg-added "#91a77a")
- (fg-added-intense "#6c894d")
-
- (bg-changed "#d1ad73")
- (bg-changed-faint "#c7ab7d")
- (bg-changed-refine "#cbac79")
- (bg-changed-fringe "#c2aa82")
- (fg-changed "#c2b588")
- (fg-changed-intense "#b29c4c")
-
- (bg-removed "#d3797b")
- (bg-removed-faint "#ca8284")
- (bg-removed-refine "#cd7e80")
- (bg-removed-fringe "#c58788")
- (fg-removed "#c58687")
- (fg-removed-intense "#b7494b")
-
- (bg-diff-context "#ceccbd")
-
- ;; UI chrome
- (bg-mode-line-active "#c8c5b4")
- (fg-mode-line-active "#2b3034")
- (bg-mode-line-inactive "#ede8dd")
- (fg-mode-line-inactive "#455355")
- (border-mode-line-active "#91a77a")
- (border-mode-line-inactive "#acb5a4")
- (bg-completion "#ede8dd")
- (bg-hover "#ceccbd")
- (bg-hover-secondary "#6f91c1")
- (bg-hl-line "#ede8dd")
- (bg-paren-match "#c69883")
- (bg-err "#d3797b")
- (bg-warning "#d1ad73")
- (bg-info "#52c68a")
- (bg-region "#e6e1d3"))
- "Base palette entries for `evergarden-summer', generated by whiskers.")
-
-(evergarden-build-theme 'evergarden-summer evergarden-summer-palette-partial 'light)
-
-(provide 'evergarden-summer-theme)
-
-;;; evergarden-summer-theme.el ends here
diff --git a/doom/.config/doom/extra-themes/evergarden-theme.el b/doom/.config/doom/extra-themes/evergarden-theme.el
deleted file mode 100644
index 1cd0824..0000000
--- a/doom/.config/doom/extra-themes/evergarden-theme.el
+++ /dev/null
@@ -1,445 +0,0 @@
-;;; evergarden-theme.el --- Cozy evergarden dark theme -*- lexical-binding: t; -*-
-
-;; Author: expansion of the original evergarden theme by @koi.rip
-;; Version: 0.1.0
-;; Package-Requires: ((emacs "28.1") (modus-themes "5.0.0") (ef-themes "2.0.0"))
-;; Keywords: faces, theme
-
-;;; Commentary:
-;; The evergarden theme (https://evergarden.moe), ported to Emacs and based on ef/modus themes
-
-;;; Code:
-
-(require 'modus-themes)
-(require 'ef-themes)
-
-(defgroup evergarden-theme nil
- "Cozy evergarden dark theme built on Modus and Ef."
- :group 'faces
- :group 'ef-themes
- :prefix "evergarden-")
-
-(defconst evergarden-theme-description
- "Cozy evergarden dark theme with forest-green accents."
- "Documentation string for the `evergarden' theme.")
-
-(defconst evergarden-theme-name 'evergarden
- "Theme symbol for `evergarden'.")
-
-(defconst evergarden-theme-family 'evergarden-theme
- "Theme family symbol for `evergarden'.")
-
-(defconst evergarden-theme-background-mode 'dark
- "Background mode for `evergarden'.")
-
-(defconst evergarden-palette-partial
- '(
- (cursor "#FAE6EF")
- (bg-main "#232A2E")
- (bg-dim "#2B3337")
- (bg-alt "#374145")
- (fg-main "#F8F9E8")
- (fg-dim "#ADC9BC")
- (fg-alt "#96B4AA")
- (bg-active "#4A585C")
- (bg-inactive "#2B3337")
- (border "#58686D")
-
- (bg-hl "#4A585C")
- (bg-prose-block "#2A3237")
- (red "#F57F82")
- (orange "#F7A182")
- (yellow "#F5D098")
- (lime "#DBE6AF")
- (green "#CBE3B3")
- (aqua "#B3E3CA")
- (skye "#B3E6DB")
- (snow "#AFD9E6")
- (blue "#B2CAED")
- (purple "#D2BDF3")
- (pink "#F3C0E5")
- (cherry "#FAE6EF")
- (subtext1 "#ADC9BC")
- (subtext0 "#96B4AA")
- (overlay2 "#839E9A")
- (overlay1 "#6F8788")
- (overlay0 "#58686D")
- (surface2 "#4A585C")
- (surface1 "#374145")
- (surface0 "#2B3337")
- (mantle "#1C2225")
- (crust "#171C1F")
-
- (red-warmer "#F6798F")
- (red-cooler "#F68F74")
- (red-faint "#D07173")
-
- (green-warmer "#DBE6AF")
- (green-cooler "#BBE2AF")
- (green-faint "#B2C49F")
-
- (yellow-warmer "#F6C497")
- (yellow-cooler "#F2DC96")
- (yellow-faint "#D4B586")
-
- (blue-warmer "#AFD9E6")
- (blue-cooler "#AEB9EC")
- (blue-faint "#9AAFCD")
-
- (magenta "#D2BDF3")
- (magenta-warmer "#F3C0E5")
- (magenta-cooler "#DCB9F2")
- (magenta-faint "#B6A0D8")
-
- (cyan "#B3E3CA")
- (cyan-warmer "#B3E3BF")
- (cyan-cooler "#B3E6DB")
- (cyan-faint "#9DC1AE")
-
- (bg-red-intense "#6D2C2E")
- (bg-green-intense "#4D6D2C")
- (bg-yellow-intense "#6D532C")
- (bg-blue-intense "#2C476D")
- (bg-magenta-intense "#452C6D")
- (bg-cyan-intense "#2C6D4B")
-
- (bg-red-subtle "#482A2B")
- (bg-green-subtle "#39482A")
- (bg-yellow-subtle "#483C2A")
- (bg-blue-subtle "#2A3748")
- (bg-magenta-subtle "#362A48")
- (bg-cyan-subtle "#2A4839")
-
- (bg-red-nuanced "#372828")
- (bg-green-nuanced "#2F3728")
- (bg-yellow-nuanced "#373128")
- (bg-blue-nuanced "#282E37")
- (bg-magenta-nuanced "#2D2837")
- (bg-cyan-nuanced "#28372F")
-
- (bg-graph-red-0 "#A63033")
- (bg-graph-red-1 "#6B2E2F")
- (bg-graph-green-0 "#6BA630")
- (bg-graph-green-1 "#4D6B2E")
- (bg-graph-yellow-0 "#A67730")
- (bg-graph-yellow-1 "#6B532E")
- (bg-graph-blue-0 "#3060A6")
- (bg-graph-blue-1 "#2E476B")
- (bg-graph-magenta-0 "#5E30A6")
- (bg-graph-magenta-1 "#462E6B")
- (bg-graph-cyan-0 "#30A669")
- (bg-graph-cyan-1 "#2E6B4B")
- (bg-added "#4D6D2C")
- (bg-added-faint "#39482A")
- (bg-added-refine "#577B32")
- (bg-added-fringe "#4D6B2E")
- (fg-added "#CBE3B3")
- (fg-added-intense "#8BCC4A")
- (bg-changed "#6D532C")
- (bg-changed-faint "#483C2A")
- (bg-changed-refine "#7B5E32")
- (bg-changed-fringe "#6B532E")
- (fg-changed "#F2DC96")
- (fg-changed-intense "#F69D18")
- (bg-removed "#6D2C2E")
- (bg-removed-faint "#482A2B")
- (bg-removed-refine "#7B3234")
- (bg-removed-fringe "#6B2E2F")
- (fg-removed "#F57F82")
- (fg-removed-intense "#F41A20")
- (bg-diff-context "#4A585C")
- (bg-mode-line-active "#455356")
- (fg-mode-line-active "#F8F9E8")
- (bg-mode-line-inactive "#2B3337")
- (fg-mode-line-inactive "#ADC9BC")
- (border-mode-line-active "#CBE3B3")
- (border-mode-line-inactive "#58686D")
- (bg-completion "#374145")
- (bg-hover "#4A585C")
- (bg-hover-secondary "#2B3646")
- (bg-hl-line "#4A585C")
- (bg-paren-match "#604D2E")
- (bg-err "#6D2C2E")
- (bg-warning "#6D532C")
- (bg-info "#2C6D4B")
- (bg-region "#4A585C"))
- "Base palette entries for `evergarden'.")
-
-(defconst evergarden-palette-mappings-partial
- '(
- (err red)
- (warning orange)
- (info cyan)
- (underline-err red)
- (underline-warning orange)
- (underline-note cyan)
- (modeline-err red)
- (modeline-warning yellow)
- (modeline-info cyan)
- (bg-prominent-warning bg-warning)
- (fg-prominent-warning fg-main)
- (bg-prominent-note bg-info)
- (fg-prominent-note fg-main)
- (fg-link blue)
- (fg-link-visited magenta)
- (fg-link-symbolic cyan)
- (bg-link unspecified)
- (bg-link-symbolic unspecified)
- (bg-link-visited unspecified)
- (underline-link blue)
- (underline-link-visited magenta)
- (underline-link-symbolic cyan)
- (name cyan)
- (keybind green)
- (identifier fg-main)
- (fg-prompt green)
- (bg-prompt unspecified)
- (builtin cyan-cooler)
- (comment fg-dim)
- (constant magenta-cooler)
- (fnname cyan)
- (fnname-call cyan-warmer)
- (keyword red)
- (preprocessor green)
- (property fg-main)
- (docstring fg-dim)
- (docmarkup green-cooler)
- (string green-warmer)
- (type yellow)
- (variable blue)
- (variable-use blue)
- (rx-backslash orange)
- (rx-construct magenta)
- (accent-0 green)
- (accent-1 cyan)
- (accent-2 magenta-warmer)
- (accent-3 orange)
- (fg-button-active fg-main)
- (fg-button-inactive fg-dim)
- (bg-button-active bg-main)
- (bg-button-inactive bg-dim)
- (fg-region fg-main)
- (bg-mark-delete bg-red-subtle)
- (fg-mark-delete red)
- (bg-mark-select bg-green-subtle)
- (fg-mark-select green)
- (bg-mark-other bg-cyan-subtle)
- (fg-mark-other cyan)
- (date-common cyan)
- (date-deadline red)
- (date-deadline-subtle red-faint)
- (date-event fg-alt)
- (date-holiday red-warmer)
- (date-holiday-other magenta-warmer)
- (date-now fg-main)
- (date-range fg-alt)
- (date-scheduled green)
- (date-scheduled-subtle green-faint)
- (date-weekday blue)
- (date-weekend red-faint)
- (fg-prose-code green-cooler)
- (prose-done green)
- (fg-prose-macro green)
- (prose-metadata fg-dim)
- (prose-metadata-value fg-alt)
- (prose-table fg-alt)
- (prose-table-formula cyan)
- (prose-tag yellow-faint)
- (prose-todo red)
- (fg-prose-verbatim magenta-warmer)
- (mail-cite-0 green)
- (mail-cite-1 cyan)
- (mail-cite-2 magenta-warmer)
- (mail-cite-3 red-warmer)
- (mail-part cyan)
- (mail-recipient blue)
- (mail-subject green)
- (mail-other fg-alt)
- (bg-search-static bg-cyan-subtle)
- (bg-search-current bg-green-intense)
- (bg-search-lazy bg-green-subtle)
- (bg-search-replace bg-red-intense)
- (bg-search-rx-group-0 bg-green-intense)
- (bg-search-rx-group-1 bg-magenta-intense)
- (bg-search-rx-group-2 bg-cyan-intense)
- (bg-search-rx-group-3 bg-red-intense)
- (bg-space-err bg-red-intense)
- (bg-space bg-main)
- (fg-space border)
- (fringe bg-main)
- (fg-line-number-active green)
- (fg-line-number-inactive overlay1)
- (bg-line-number-active bg-hl-line)
- (bg-line-number-inactive bg-main)
- (bg-tab-bar bg-dim)
- (bg-tab-current bg-main)
- (bg-tab-other bg-dim)
- (bg-prominent-err bg-err)
- (fg-prominent-err err)
- (fg-paren-match fg-main)
- (underline-paren-match unspecified)
- (bg-active-argument bg-active)
- (fg-active-argument green)
- (bg-active-value bg-green-subtle)
- (fg-active-value green)
- (bg-prose-block-delimiter bg-prose-block)
- (fg-prose-block-delimiter fg-dim)
- (bg-prose-block-contents bg-prose-block)
- (bg-prose-code unspecified)
- (bg-prose-macro unspecified)
- (bg-prose-verbatim unspecified)
- (fg-completion-match-0 green)
- (fg-completion-match-1 cyan)
- (fg-completion-match-2 magenta-warmer)
- (fg-completion-match-3 orange)
- (bg-completion-match-0 unspecified)
- (bg-completion-match-1 unspecified)
- (bg-completion-match-2 unspecified)
- (bg-completion-match-3 unspecified)
- (bg-completion bg-dim)
- (fg-search-current fg-main)
- (bg-term-black bg-main)
- (fg-term-black bg-main)
- (bg-term-black-bright overlay0)
- (fg-term-black-bright overlay0)
- (bg-term-red red)
- (fg-term-red red)
- (bg-term-red-bright red-warmer)
- (fg-term-red-bright red-warmer)
- (bg-term-green green)
- (fg-term-green green)
- (bg-term-green-bright green-warmer)
- (fg-term-green-bright green-warmer)
- (bg-term-yellow yellow)
- (fg-term-yellow yellow)
- (bg-term-yellow-bright yellow-warmer)
- (fg-term-yellow-bright yellow-warmer)
- (bg-term-blue blue)
- (fg-term-blue blue)
- (bg-term-blue-bright blue-warmer)
- (fg-term-blue-bright blue-warmer)
- (bg-term-magenta magenta)
- (fg-term-magenta magenta)
- (bg-term-magenta-bright magenta-warmer)
- (fg-term-magenta-bright magenta-warmer)
- (bg-term-cyan cyan)
- (fg-term-cyan cyan)
- (bg-term-cyan-bright cyan-warmer)
- (fg-term-cyan-bright cyan-warmer)
- (bg-term-white fg-dim)
- (fg-term-white fg-dim)
- (bg-term-white-bright fg-main)
- (fg-term-white-bright fg-main)
- (rainbow-0 green)
- (rainbow-1 cyan)
- (rainbow-2 magenta)
- (rainbow-3 blue)
- (rainbow-4 orange)
- (rainbow-5 red)
- (rainbow-6 yellow)
- (rainbow-7 fg-alt)
- (rainbow-8 fg-dim)
- (fg-heading-0 green)
- (fg-heading-1 green)
- (fg-heading-2 cyan)
- (fg-heading-3 magenta)
- (fg-heading-4 blue)
- (fg-heading-5 orange)
- (fg-heading-6 red)
- (fg-heading-7 fg-alt)
- (fg-heading-8 fg-dim)
- (bg-heading-0 unspecified)
- (bg-heading-1 bg-green-nuanced)
- (bg-heading-2 unspecified)
- (bg-heading-3 bg-magenta-nuanced)
- (bg-heading-4 bg-blue-nuanced)
- (bg-heading-5 unspecified)
- (bg-heading-6 bg-red-nuanced)
- (bg-heading-7 unspecified)
- (bg-heading-8 unspecified)
- (overline-heading-0 green)
- (overline-heading-1 green)
- (overline-heading-2 cyan)
- (overline-heading-3 magenta)
- (overline-heading-4 blue)
- (overline-heading-5 orange)
- (overline-heading-6 red)
- (overline-heading-7 unspecified)
- (overline-heading-8 unspecified))
- "Semantic color mappings for `evergarden'.")
-
-(defcustom evergarden-palette-overrides nil
- "Overrides for `evergarden-palette'.
-
-Each element should have the form (NAME VALUE), where NAME is a palette
-entry from `evergarden-palette' and VALUE is either another palette symbol
-or a color string."
- :group 'evergarden-theme
- :package-version '(evergarden-theme . "0.1.0")
- :type '(repeat (list symbol (choice symbol string))))
-
-(defconst evergarden-palette
- (modus-themes-generate-palette
- evergarden-palette-partial
- 'cool
- nil
- (append evergarden-palette-mappings-partial ef-themes-palette-common))
- "Full palette for `evergarden'.")
-
-(defconst evergarden-custom-faces
- '(`(corfu-default ((,c :inherit modus-themes-fixed-pitch
- :background ,bg-dim
- :foreground ,fg-main)))
- `(corfu-current ((,c :background ,bg-green-intense
- :foreground ,fg-main
- :extend t
- :box (:line-width -1 :color ,green)
- :weight semi-bold)))
- `(corfu-border ((,c :background ,border
- :foreground ,border)))
- `(corfu-bar ((,c :background ,green)))
- `(corfu-popupinfo ((,c :background ,bg-dim
- :foreground ,fg-main))))
- "Additional face overrides for `evergarden'.
-
-Prefer palette entries and semantic mappings first.
-Use direct face overrides only for targeted package cases where the
-inherited mapping does not provide enough contrast.")
-
-(defun evergarden--ensure-modus-theme-metadata ()
- "Declare `evergarden' as a Modus-derived theme when reloading in-session.
-
-If an `evergarden' theme object already exists in the session, ensure it
-still has the theme properties that `modus-themes-theme' expects."
- (unless (plist-get (get evergarden-theme-name 'theme-properties) :modus-core-palette)
- (modus-themes-declare
- evergarden-theme-name
- evergarden-theme-family
- evergarden-theme-description
- evergarden-theme-background-mode
- 'evergarden-palette
- nil
- 'evergarden-palette-overrides)
- (modus-themes-register evergarden-theme-name)))
-
-(evergarden--ensure-modus-theme-metadata)
-
-(modus-themes-theme
- evergarden-theme-name
- evergarden-theme-family
- evergarden-theme-description
- evergarden-theme-background-mode
- 'evergarden-palette
- nil
- 'evergarden-palette-overrides
- 'evergarden-custom-faces)
-
-;;;###autoload
-(when load-file-name
- (add-to-list 'custom-theme-load-path
- (file-name-as-directory
- (file-name-directory load-file-name))))
-
-(provide 'evergarden-theme)
-
-;;; evergarden-theme.el ends here
diff --git a/doom/.config/doom/extra-themes/evergarden-winter-theme.el b/doom/.config/doom/extra-themes/evergarden-winter-theme.el
deleted file mode 100644
index b3dc7e7..0000000
--- a/doom/.config/doom/extra-themes/evergarden-winter-theme.el
+++ /dev/null
@@ -1,176 +0,0 @@
-;;; evergarden-winter-theme.el --- Evergarden, Winter flavor -*- lexical-binding: t; -*-
-
-;; Author: expansion of the original evergarden theme by @koi.rip
-;; Version: 0.2.0
-;; Package-Requires: ((emacs "28.1") (modus-themes "5.0.0") (ef-themes "2.0.0"))
-;; Keywords: faces, theme
-
-;;; Commentary:
-;; Winter evergarden
-
-;;; Code:
-
-(unless (featurep 'evergarden-common)
- (let ((common (locate-file "evergarden-common"
- (append (seq-filter #'stringp custom-theme-load-path)
- load-path)
- '(".el" ".elc" ""))))
- (if common
- (load common)
- (error "evergarden-common.el not found; add its directory to `custom-theme-load-path'"))))
-
-(defconst evergarden-winter-palette-partial
- '(
- ;; Core backgrounds / foregrounds
- (cursor "#fae6ef")
- (bg-main "#1e2528")
- (bg-dim "#262f33")
- (bg-alt "#374145")
- (fg-main "#f8f9e8")
- (fg-dim "#adc9bc")
- (fg-alt "#96b4aa")
- (bg-active "#4a585c")
- (bg-inactive "#262f33")
- (border "#58686d")
-
- ;; Winter's own named palette (from the whiskers color table)
- (bg-hl "#4a585c")
- (bg-prose-block "#252d31")
- (red "#f57f82")
- (orange "#f7a182")
- (yellow "#f5d098")
- (lime "#dbe6af")
- (green "#cbe3b3")
- (aqua "#b3e3ca")
- (skye "#b3e6db")
- (snow "#afd9e6")
- (blue "#b2caed")
- (purple "#d2bdf3")
- (pink "#f3c0e5")
- (cherry "#fae6ef")
- (text "#f8f9e8")
- (subtext1 "#adc9bc")
- (subtext0 "#96b4aa")
- (overlay2 "#839e9a")
- (overlay1 "#6f8788")
- (overlay0 "#58686d")
- (surface2 "#4a585c")
- (surface1 "#374145")
- (surface0 "#262f33")
- (base "#1e2528")
- (mantle "#191e21")
- (crust "#171c1f")
-
- ;; Red family
- (red-warmer "#f6788f")
- (red-cooler "#f48f76")
- (red-faint "#d07073")
-
- ;; Green family
- (green-warmer "#dbe6af")
- (green-cooler "#bae1af")
- (green-faint "#b1c999")
-
- ;; Yellow family
- (yellow-warmer "#f6c498")
- (yellow-cooler "#f1dc97")
- (yellow-faint "#d5b585")
-
- ;; Blue family
- (blue-warmer "#afd9e6")
- (blue-cooler "#aeb8ec")
- (blue-faint "#98aed0")
-
- ;; Magenta/purple family
- (magenta "#d2bdf3")
- (magenta-warmer "#f3c0e5")
- (magenta-cooler "#dcb8f2")
- (magenta-faint "#b5a0d8")
-
- ;; Cyan family
- (cyan "#b3e3ca")
- (cyan-warmer "#b3e3bf")
- (cyan-cooler "#b3e6db")
- (cyan-faint "#97c7ae")
-
- ;; Intense/Subtle/Nuanced backgrounds
- (bg-red-intense "#d79d9f")
- (bg-red-subtle "#cca8a9")
- (bg-red-nuanced "#c5afb0")
- (bg-green-intense "#cbe1b5")
- (bg-green-subtle "#cbd8be")
- (bg-green-nuanced "#cbd3c3")
- (bg-yellow-intense "#deccb0")
- (bg-yellow-subtle "#d5cab9")
- (bg-yellow-nuanced "#d0c9be")
- (bg-blue-intense "#bccce4")
- (bg-blue-subtle "#c4cedc")
- (bg-blue-nuanced "#c8ced8")
- (bg-magenta-intense "#d4c8e8")
- (bg-magenta-subtle "#d6cee2")
- (bg-magenta-nuanced "#d7d2de")
- (bg-cyan-intense "#b5e1ca")
- (bg-cyan-subtle "#bed8cb")
- (bg-cyan-nuanced "#c3d3cb")
-
- ;; Graph colors
- (bg-graph-red-0 "#e09497")
- (bg-graph-red-1 "#d69ea0")
- (bg-graph-green-0 "#cbe8ae")
- (bg-graph-green-1 "#cbe0b6")
- (bg-graph-yellow-0 "#e6cda8")
- (bg-graph-yellow-1 "#ddcbb1")
- (bg-graph-blue-0 "#b6cbea")
- (bg-graph-blue-1 "#bdcce3")
- (bg-graph-magenta-0 "#d3c3ed")
- (bg-graph-magenta-1 "#d4c8e8")
- (bg-graph-cyan-0 "#aee8ca")
- (bg-graph-cyan-1 "#b6e0ca")
-
- ;; Diff
- (bg-added "#cbe1b5")
- (bg-added-faint "#cbd8be")
- (bg-added-refine "#cbdcba")
- (bg-added-fringe "#cbe8ae")
- (fg-added "#cbe3b3")
- (fg-added-intense "#8bcd49")
-
- (bg-changed "#deccb0")
- (bg-changed-faint "#d5cab9")
- (bg-changed-refine "#d9cbb5")
- (bg-changed-fringe "#e6cda8")
- (fg-changed "#f1dc97")
- (fg-changed-intense "#efbd19")
-
- (bg-removed "#d79d9f")
- (bg-removed-faint "#cca8a9")
- (bg-removed-refine "#d0a4a5")
- (bg-removed-fringe "#e09497")
- (fg-removed "#f57f82")
- (fg-removed-intense "#ef050d")
-
- (bg-diff-context "#4a585c")
-
- ;; UI chrome
- (bg-mode-line-active "#435053")
- (fg-mode-line-active "#f8f9e8")
- (bg-mode-line-inactive "#262f33")
- (fg-mode-line-inactive "#adc9bc")
- (border-mode-line-active "#cbe3b3")
- (border-mode-line-inactive "#58686d")
- (bg-completion "#262f33")
- (bg-hover "#4a585c")
- (bg-hover-secondary "#c4cedc")
- (bg-hl-line "#262f33")
- (bg-paren-match "#f7a182")
- (bg-err "#d79d9f")
- (bg-warning "#deccb0")
- (bg-info "#b5e1ca")
- (bg-region "#374145"))
- "Base palette entries for `evergarden-winter', generated by whiskers.")
-
-(evergarden-build-theme 'evergarden-winter evergarden-winter-palette-partial 'dark)
-
-(provide 'evergarden-winter-theme)
-
-;;; evergarden-winter-theme.el ends here
diff --git a/doom/.config/doom/extra-themes/fortune-gold-theme.el b/doom/.config/doom/extra-themes/fortune-gold-theme.el
deleted file mode 100644
index 51d6ee9..0000000
--- a/doom/.config/doom/extra-themes/fortune-gold-theme.el
+++ /dev/null
@@ -1,499 +0,0 @@
-;;; fortune-gold-theme.el --- Warm fortune-inspired light theme -*- lexical-binding: t; -*-
-
-;; Author: nobu43
-;; Version: 0.1.0
-;; Package-Requires: ((emacs "28.1") (modus-themes "5.0.0") (ef-themes "2.0.0"))
-;; Keywords: faces, theme
-
-;;; Commentary:
-;;
-;; A warm light theme built on the `modus-themes' engine and the `ef-themes'
-;; palette semantics.
-;;
-;; The palette follows a fortune-oriented direction: yellow/gold is the primary
-;; accent, warm white and beige form the base, while water blue, lavender, pink,
-;; red, orange, silver, and restrained green support syntax and status faces.
-;; Syntax colors are intentionally kept close to WCAG AA contrast against the
-;; main background so they remain vivid while readable.
-
-;;; Code:
-
-(require 'modus-themes)
-(require 'ef-themes)
-
-(defgroup fortune-gold-theme nil
- "Warm fortune-inspired light theme built on Modus and Ef."
- :group 'faces
- :group 'ef-themes
- :prefix "fortune-gold-")
-
-(defconst fortune-gold-theme-description
- "Warm fortune-inspired light theme with gold accents."
- "Documentation string for the `fortune-gold' theme.")
-
-(defconst fortune-gold-theme-name 'fortune-gold
- "Theme symbol for `fortune-gold'.")
-
-(defconst fortune-gold-theme-family 'fortune-gold-theme
- "Theme family symbol for `fortune-gold'.")
-
-(defconst fortune-gold-theme-background-mode 'light
- "Background mode for `fortune-gold'.")
-
-(defconst fortune-gold-palette-partial
- '(;; Core backgrounds / foregrounds
- (cursor "#8A6500")
- (bg-main "#FBF7ED")
- (bg-dim "#F1E6CC")
- (bg-alt "#EAD9A7")
- (fg-main "#3C3529")
- (fg-dim "#756D61")
- (fg-alt "#68727C")
- (bg-active "#F6EDDA")
- (bg-inactive "#F1E6CC")
- (border "#D8CAA9")
-
- ;; Fortune-specific helper colors
- (bg-hl "#F6EDDA")
- (bg-prose-block "#F8F1E3")
- (gold-soft "#D4AA34")
- (gold-strong "#8A6500")
- (water-soft "#1B7888")
- (navy-soft "#416B9D")
- (lavender-soft "#7C59A7")
- (pink-soft "#95587B")
- (red-soft "#A84B44")
- (orange-soft "#9C5A2D")
- (green-soft "#5B744E")
- (silver-soft "#68727C")
-
- ;; Red family: warnings and removal
- (red "#A84B44")
- (red-warmer "#B05245")
- (red-cooler "#8F3C4D")
- (red-faint "#C98478")
-
- ;; Green family: success only; kept muted by design
- (green "#5B744E")
- (green-warmer "#687A3D")
- (green-cooler "#4F735F")
- (green-faint "#8FA482")
-
- ;; Yellow family: primary lucky color
- (yellow "#8A6500")
- (yellow-warmer "#8F6900")
- (yellow-cooler "#806027")
- (yellow-faint "#B98D1D")
-
- ;; Blue family: water blue and navy, not plain vivid blue
- (blue "#416B9D")
- (blue-warmer "#4C639A")
- (blue-cooler "#315F94")
- (blue-faint "#7897BB")
-
- ;; Magenta/purple family: lavender and pink support
- (magenta "#7C59A7")
- (magenta-warmer "#95587B")
- (magenta-cooler "#6E5395")
- (magenta-faint "#B28DC0")
-
- ;; Cyan family: water color for function names and info
- (cyan "#1B7888")
- (cyan-warmer "#2C7F89")
- (cyan-cooler "#0F6F80")
- (cyan-faint "#77AAB0")
-
- ;; Intense backgrounds
- (bg-red-intense "#ECC8BD")
- (bg-green-intense "#DCE7BF")
- (bg-yellow-intense "#E9D28A")
- (bg-blue-intense "#D6E3EF")
- (bg-magenta-intense "#E7D7EC")
- (bg-cyan-intense "#D4E8EA")
-
- ;; Subtle backgrounds
- (bg-red-subtle "#F5E2DB")
- (bg-green-subtle "#ECF1DC")
- (bg-yellow-subtle "#F1E6CC")
- (bg-blue-subtle "#E6EEF5")
- (bg-magenta-subtle "#F0E6F2")
- (bg-cyan-subtle "#E4F0F1")
-
- ;; Nuanced backgrounds for headings and lightly accented surfaces
- (bg-red-nuanced "#F3E9E2")
- (bg-green-nuanced "#EEF0E2")
- (bg-yellow-nuanced "#F6EDDA")
- (bg-blue-nuanced "#E9EEF2")
- (bg-magenta-nuanced "#F1E9F0")
- (bg-cyan-nuanced "#E7F0EF")
-
- ;; Graph colors for org-habit and chart-like faces
- (bg-graph-red-0 "#D58B7D")
- (bg-graph-red-1 "#E7B9AF")
- (bg-graph-green-0 "#90A576")
- (bg-graph-green-1 "#BACAA0")
- (bg-graph-yellow-0 "#D4AA34")
- (bg-graph-yellow-1 "#E2C467")
- (bg-graph-blue-0 "#7FA0C3")
- (bg-graph-blue-1 "#B3C8DB")
- (bg-graph-magenta-0 "#B48CC0")
- (bg-graph-magenta-1 "#D5BEDB")
- (bg-graph-cyan-0 "#80B0B8")
- (bg-graph-cyan-1 "#B4D0D3")
-
- ;; Diff
- (bg-added "#DCE7BF")
- (bg-added-faint "#ECF1DC")
- (bg-added-refine "#CADAA2")
- (bg-added-fringe "#90A576")
- (fg-added "#5B744E")
- (fg-added-intense "#49613D")
-
- (bg-changed "#E9D28A")
- (bg-changed-faint "#F1E6CC")
- (bg-changed-refine "#DDBD5F")
- (bg-changed-fringe "#D4AA34")
- (fg-changed "#806027")
- (fg-changed-intense "#6D500F")
-
- (bg-removed "#ECC8BD")
- (bg-removed-faint "#F5E2DB")
- (bg-removed-refine "#DDA99B")
- (bg-removed-fringe "#D58B7D")
- (fg-removed "#A84B44")
- (fg-removed-intense "#8F3C4D")
-
- (bg-diff-context "#F6EDDA")
-
- ;; UI chrome
- (bg-mode-line-active "#EADFC9")
- (fg-mode-line-active "#3C3529")
- (bg-mode-line-inactive "#F1E6CC")
- (fg-mode-line-inactive "#756D61")
- (border-mode-line-active "#8A6500")
- (border-mode-line-inactive "#D8CAA9")
- (bg-completion "#F1E6CC")
- (bg-hover "#F6EDDA")
- (bg-hover-secondary "#E6EEF5")
- (bg-hl-line "#F6EDDA")
- (bg-paren-match "#E9D28A")
- (bg-err "#ECC8BD")
- (bg-warning "#E9D28A")
- (bg-info "#D4E8EA")
- (bg-region "#E9D28A"))
- "Base palette entries for `fortune-gold'.")
-
-(defconst fortune-gold-palette-mappings-partial
- '(;; Status
- (err red)
- (warning orange-soft)
- (info cyan)
- (underline-err red)
- (underline-warning orange-soft)
- (underline-note cyan)
- (modeline-err red)
- (modeline-warning yellow)
- (modeline-info cyan)
- (bg-prominent-warning bg-warning)
- (fg-prominent-warning fg-main)
- (bg-prominent-note bg-info)
- (fg-prominent-note fg-main)
-
- ;; Links
- (fg-link blue)
- (fg-link-visited magenta)
- (fg-link-symbolic cyan)
- (bg-link unspecified)
- (bg-link-symbolic unspecified)
- (bg-link-visited unspecified)
- (underline-link blue)
- (underline-link-visited magenta)
- (underline-link-symbolic cyan)
-
- ;; Identifiers & prompt
- (name cyan)
- (keybind yellow)
- (identifier fg-main)
- (fg-prompt yellow)
- (bg-prompt unspecified)
-
- ;; Code syntax
- (builtin magenta-warmer)
- (comment fg-dim)
- (constant yellow-cooler)
- (fnname cyan)
- (fnname-call cyan-warmer)
- (keyword yellow-warmer)
- (preprocessor yellow)
- (property fg-main)
- (docstring fg-dim)
- (docmarkup yellow-cooler)
- (string magenta)
- (type yellow-cooler)
- (variable blue)
- (variable-use blue)
- (rx-backslash orange-soft)
- (rx-construct magenta)
-
- ;; Accents
- (accent-0 yellow)
- (accent-1 cyan)
- (accent-2 magenta-warmer)
- (accent-3 orange-soft)
-
- ;; Buttons / selections
- (fg-button-active fg-main)
- (fg-button-inactive fg-dim)
- (bg-button-active bg-main)
- (bg-button-inactive bg-dim)
- (fg-region fg-main)
- (bg-mark-delete bg-red-subtle)
- (fg-mark-delete red)
- (bg-mark-select bg-yellow-subtle)
- (fg-mark-select yellow)
- (bg-mark-other bg-cyan-subtle)
- (fg-mark-other cyan)
-
- ;; Dates
- (date-common cyan)
- (date-deadline red)
- (date-deadline-subtle red-faint)
- (date-event fg-alt)
- (date-holiday red-warmer)
- (date-holiday-other magenta-warmer)
- (date-now fg-main)
- (date-range fg-alt)
- (date-scheduled yellow)
- (date-scheduled-subtle yellow-faint)
- (date-weekday blue)
- (date-weekend red-faint)
-
- ;; Prose / markup
- (fg-prose-code yellow-cooler)
- (prose-done green)
- (fg-prose-macro yellow)
- (prose-metadata fg-dim)
- (prose-metadata-value fg-alt)
- (prose-table fg-alt)
- (prose-table-formula cyan)
- (prose-tag yellow-faint)
- (prose-todo red)
- (fg-prose-verbatim magenta-warmer)
-
- ;; Mail
- (mail-cite-0 yellow)
- (mail-cite-1 cyan)
- (mail-cite-2 magenta-warmer)
- (mail-cite-3 red-warmer)
- (mail-part cyan)
- (mail-recipient blue)
- (mail-subject yellow)
- (mail-other fg-alt)
-
- ;; Search
- (bg-search-static bg-cyan-subtle)
- (bg-search-current bg-yellow-intense)
- (bg-search-lazy bg-yellow-subtle)
- (bg-search-replace bg-red-intense)
-
- (bg-search-rx-group-0 bg-yellow-intense)
- (bg-search-rx-group-1 bg-magenta-intense)
- (bg-search-rx-group-2 bg-cyan-intense)
- (bg-search-rx-group-3 bg-red-intense)
-
- (bg-space-err bg-red-intense)
- (bg-space bg-main)
- (fg-space border)
-
- ;; Line numbers & fringe
- (fringe bg-main)
- (fg-line-number-active yellow)
- (fg-line-number-inactive silver-soft)
- (bg-line-number-active bg-hl-line)
- (bg-line-number-inactive bg-main)
-
- ;; Structural surfaces
- (bg-tab-bar bg-dim)
- (bg-tab-current bg-main)
- (bg-tab-other bg-dim)
-
- ;; Matching / prompts / emphasis
- (bg-prominent-err bg-err)
- (fg-prominent-err err)
- (fg-paren-match fg-main)
- (underline-paren-match unspecified)
- (bg-active-argument bg-active)
- (fg-active-argument yellow)
- (bg-active-value bg-yellow-subtle)
- (fg-active-value yellow)
-
- ;; Prose blocks
- (bg-prose-block-delimiter bg-prose-block)
- (fg-prose-block-delimiter fg-dim)
- (bg-prose-block-contents bg-prose-block)
- (bg-prose-code unspecified)
- (bg-prose-macro unspecified)
- (bg-prose-verbatim unspecified)
-
- ;; Completion / search
- (fg-completion-match-0 yellow)
- (fg-completion-match-1 cyan)
- (fg-completion-match-2 magenta-warmer)
- (fg-completion-match-3 orange-soft)
- (bg-completion-match-0 unspecified)
- (bg-completion-match-1 unspecified)
- (bg-completion-match-2 unspecified)
- (bg-completion-match-3 unspecified)
- (bg-completion bg-dim)
- (fg-search-current fg-main)
-
- ;; Terminal
- (bg-term-black fg-main)
- (fg-term-black fg-main)
- (bg-term-black-bright fg-dim)
- (fg-term-black-bright fg-dim)
- (bg-term-red red)
- (fg-term-red red)
- (bg-term-red-bright red-warmer)
- (fg-term-red-bright red-warmer)
- (bg-term-green green)
- (fg-term-green green)
- (bg-term-green-bright green-warmer)
- (fg-term-green-bright green-warmer)
- (bg-term-yellow yellow)
- (fg-term-yellow yellow)
- (bg-term-yellow-bright yellow-warmer)
- (fg-term-yellow-bright yellow-warmer)
- (bg-term-blue blue)
- (fg-term-blue blue)
- (bg-term-blue-bright blue-warmer)
- (fg-term-blue-bright blue-warmer)
- (bg-term-magenta magenta)
- (fg-term-magenta magenta)
- (bg-term-magenta-bright magenta-warmer)
- (fg-term-magenta-bright magenta-warmer)
- (bg-term-cyan cyan)
- (fg-term-cyan cyan)
- (bg-term-cyan-bright cyan-warmer)
- (fg-term-cyan-bright cyan-warmer)
- (bg-term-white border)
- (fg-term-white border)
- (bg-term-white-bright bg-main)
- (fg-term-white-bright bg-main)
-
- ;; Rainbow / heading order
- (rainbow-0 yellow)
- (rainbow-1 cyan)
- (rainbow-2 magenta)
- (rainbow-3 blue)
- (rainbow-4 orange-soft)
- (rainbow-5 red)
- (rainbow-6 green)
- (rainbow-7 fg-alt)
- (rainbow-8 fg-dim)
-
- ;; Headings
- (fg-heading-0 yellow)
- (fg-heading-1 yellow)
- (fg-heading-2 cyan)
- (fg-heading-3 magenta)
- (fg-heading-4 blue)
- (fg-heading-5 orange-soft)
- (fg-heading-6 red-soft)
- (fg-heading-7 fg-alt)
- (fg-heading-8 fg-dim)
- (bg-heading-0 unspecified)
- (bg-heading-1 bg-yellow-nuanced)
- (bg-heading-2 unspecified)
- (bg-heading-3 bg-magenta-nuanced)
- (bg-heading-4 bg-blue-nuanced)
- (bg-heading-5 unspecified)
- (bg-heading-6 bg-red-nuanced)
- (bg-heading-7 unspecified)
- (bg-heading-8 unspecified)
- (overline-heading-0 yellow)
- (overline-heading-1 yellow)
- (overline-heading-2 cyan)
- (overline-heading-3 magenta)
- (overline-heading-4 blue)
- (overline-heading-5 orange-soft)
- (overline-heading-6 red-soft)
- (overline-heading-7 unspecified)
- (overline-heading-8 unspecified))
- "Semantic color mappings for `fortune-gold'.")
-
-(defcustom fortune-gold-palette-overrides nil
- "Overrides for `fortune-gold-palette'.
-
-Each element should have the form (NAME VALUE), where NAME is a palette
-entry from `fortune-gold-palette' and VALUE is either another palette symbol
-or a color string."
- :group 'fortune-gold-theme
- :package-version '(fortune-gold-theme . "0.1.0")
- :type '(repeat (list symbol (choice symbol string))))
-
-(defconst fortune-gold-palette
- (modus-themes-generate-palette
- fortune-gold-palette-partial
- 'warm
- nil
- (append fortune-gold-palette-mappings-partial ef-themes-palette-common))
- "Full palette for `fortune-gold'.")
-
-(defconst fortune-gold-custom-faces
- '(`(corfu-default ((,c :inherit modus-themes-fixed-pitch
- :background ,bg-dim
- :foreground ,fg-main)))
- `(corfu-current ((,c :background ,bg-yellow-intense
- :foreground ,fg-main
- :extend t
- :box (:line-width -1 :color ,yellow)
- :weight semi-bold)))
- `(corfu-border ((,c :background ,border
- :foreground ,border)))
- `(corfu-bar ((,c :background ,yellow)))
- `(corfu-popupinfo ((,c :background ,bg-dim
- :foreground ,fg-main))))
- "Additional face overrides for `fortune-gold'.
-
-Prefer palette entries and semantic mappings first.
-Use direct face overrides only for targeted package cases where the
-inherited mapping does not provide enough contrast.")
-
-(defun fortune-gold--ensure-modus-theme-metadata ()
- "Declare `fortune-gold' as a Modus-derived theme when reloading in-session.
-
-If a `fortune-gold' theme object already exists in the session, ensure it still
-has the theme properties that `modus-themes-theme' expects."
- (unless (plist-get (get fortune-gold-theme-name 'theme-properties) :modus-core-palette)
- (modus-themes-declare
- fortune-gold-theme-name
- fortune-gold-theme-family
- fortune-gold-theme-description
- fortune-gold-theme-background-mode
- 'fortune-gold-palette
- nil
- 'fortune-gold-palette-overrides)
- (modus-themes-register fortune-gold-theme-name)))
-
-(fortune-gold--ensure-modus-theme-metadata)
-
-(modus-themes-theme
- fortune-gold-theme-name
- fortune-gold-theme-family
- fortune-gold-theme-description
- fortune-gold-theme-background-mode
- 'fortune-gold-palette
- nil
- 'fortune-gold-palette-overrides
- 'fortune-gold-custom-faces)
-
-;;;###autoload
-(when load-file-name
- (add-to-list 'custom-theme-load-path
- (file-name-as-directory
- (file-name-directory load-file-name))))
-
-(provide 'fortune-gold-theme)
-
-;;; fortune-gold-theme.el ends here
diff --git a/doom/.config/doom/init.el b/doom/.config/doom/init.el
deleted file mode 100644
index 14d48a5..0000000
--- a/doom/.config/doom/init.el
+++ /dev/null
@@ -1,202 +0,0 @@
-;;; $DOOMDIR/init.el -*- lexical-binding: t; -*-
-
-(doom! :input
- ;;bidi ; (tfel ot) thgir etirw uoy gnipleh
- ;;chinese
- ;;japanese
- ;;layout ; auie,ctsrnm is the superior home row
-
- :completion
- ;; company ; the ultimate code completion backend
- (corfu
- +orderless
- +icons
- +dabbrev) ; complete with cap(f), cape and a flying feather!
- ;; (helm
- ;; +fuzzy
- ;; +icons
- ;; +childframe) ; the *other* search engine for love and life
- ;;ido ; the other *other* search engine for love and life
- ;;ivy ; a search engine for love and life
- (vertico
- +icons
- +childframe) ; the search engine of the future
-
- :ui
- ;;deft ; notational velocity for Emacs
- doom ; what makes DOOM look the way it does
- ;;dashboard ; a nifty splash screen for Emacs
- doom-quit ; DOOM quit-message prompts when you quit Emacs
- ;;(emoji +unicode) ; 🙂
- hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
- ;;indent-guides ; highlighted indent columns
- ;;ligatures ; ligatures and symbols to make your code pretty again
- ;;minimap ; show a map of the code on the side
- ;; modeline ; snazzy, Atom-inspired modeline, plus API
- ;;nav-flash ; blink cursor line after big motions
- ;;neotree ; a project drawer, like NERDTree for vim
- ophints ; highlight the region an operation acts on
- (popup +defaults) ; tame sudden yet inevitable temporary windows
- ;;smooth-scroll ; So smooth you won't believe it's not butter
- ;; tabs ; a tab bar for Emacs
- ;;treemacs ; a project drawer, like neotree but cooler
- ;;unicode ; extended unicode support for various languages
- (vc-gutter +pretty) ; vcs diff in the fringe
- vi-tilde-fringe ; fringe tildes to mark beyond EOB
- ;;window-select ; visually switch windows
- workspaces ; tab emulation, persistence & separate workspaces
- zen ; distraction-free coding or writing
-
- :editor
- (evil +everywhere) ; come to the dark side, we have cookies
- file-templates ; auto-snippets for empty files
- fold ; (nigh) universal code folding
- (format +onsave) ; automated prettiness
- ;;god ; run Emacs commands without modifier keys
- lispy ; vim for lisp, for people who don't like vim
- ;;multiple-cursors ; editing in many places at once
- ;;objed ; text object editing for the innocent
- ;;parinfer ; turn lisp into python, sort of
- ;;rotate-text ; cycle region at point between text candidates
- snippets ; my elves. They type so I don't have to
- (whitespace +guess +trim) ; a butler for your whitespace
- ;;word-wrap ; soft wrapping with language-aware indent
-
- :emacs
- dired ; making dired pretty [functional]
- electric ; smarter, keyword-based electric-indent
- eww ; the internet is gross
- ibuffer ; interactive buffer management
- ;; tramp ; remote files at your arthritic fingertips
- undo ; persistent, smarter undo for your inevitable mistakes
- vc ; version-control and Emacs, sitting in a tree
-
- :term
- eshell ; the elisp shell that works everywhere
- ;;shell ; simple shell REPL for Emacs
- ;;term ; basic terminal emulator for Emacs
- ;;vterm ; almost the best terminal emulation in Emacs
- ;; ghostel ; the best terminal emulation in Emacs
-
- :checkers
- syntax ; tasing you for every semicolon you forget
- ;;(spell +flyspell) ; tasing you for misspelling mispelling
- ;;grammar ; tasing grammar mistake every you make
-
- :tools
- ;;ansible
- ;;biblio ; Writes a PhD for you (citation needed)
- ;;collab ; buffers with friends
- ;;debugger ; stepping through code, to help you add bugs
- ;;direnv
- ;;docker
- editorconfig ; let someone else argue about tabs vs spaces
- ;;ein ; tame Jupyter notebooks with emacs
- (eval +overlay) ; run code, run (also, repls)
- lookup ; navigate your code and its documentation
- (lsp +eglot) ; M-x vscode
- ;;magit ; a git porcelain for Emacs
- ;;make ; run make tasks from Emacs
- ;;pass ; password manager for nerds
- pdf ; pdf enhancements
- ;;terraform ; infrastructure as code
- ;;tmux ; an API for interacting with tmux
- tree-sitter ; syntax and parsing, sitting in a tree...
- ;;upload ; map local to remote projects via ssh/ftp
-
- :os
- (:if (featurep :system 'macos) macos) ; improve compatibility with macOS
- ;;tty ; improve the terminal Emacs experience
-
- :lang
- ;;ada ; In strong typing we (blindly) trust
- ;;(agda +local) ; types of types of types of types...
- ;;beancount ; mind the GAAP
- ;;(cc +lsp) ; C > C++ == 1
- ;;clojure ; java with a lisp
- ;;common-lisp ; if you've seen one lisp, you've seen them all
- ;;coq ; proofs-as-programs
- ;;crystal ; ruby at the speed of c
- ;;csharp ; unity, .NET, and mono shenanigans
- ;;data ; config/data formats
- ;;(dart +flutter) ; paint ui and not much else
- ;;dhall
- ;;elixir ; erlang done right
- ;;elm ; care for a cup of TEA?
- emacs-lisp ; drown in parentheses
- ;;erlang ; an elegant language for a more civilized age
- ;;ess ; emacs speaks statistics
- ;;factor
- ;;faust ; dsp, but you get to keep your soul
- ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER)
- ;;fsharp ; ML stands for Microsoft's Language
- ;;fstar ; (dependent) types and (monadic) effects and Z3
- ;;gdscript ; the language you waited for
- ;;(go +lsp) ; the hipster dialect
- ;;(graphql +lsp) ; Give queries a REST
- (haskell +lsp) ; a language that's lazier than I am
- ;;hy ; readability of scheme w/ speed of python
- ;;idris ; a language you can depend on
- ;;json ; At least it ain't XML
- ;;janet ; Fun fact: Janet is me!
- ;;(java +lsp) ; the poster child for carpal tunnel syndrome
- javascript ; all(hope(abandon(ye(who(enter(here))))))
- ;;julia ; a better, faster MATLAB
- ;;kotlin ; a better, slicker Java(Script)
- ;;latex ; writing papers in Emacs has never been so fun
- ;;lean ; for folks with too much to prove
- ;;ledger ; be audit you can be
- ;;lua ; one-based indices? one-based indices
- markdown ; writing docs for people to ignore
- ;;nim ; python + lisp at the speed of c
- ;;nix ; I hereby declare "nix geht mehr!"
- ;;ocaml ; an objective camel
- ;;odin ; C, minus its footguns
- (org
- +roam
- +pandoc
- +dragndrop
- +pretty) ; organize your plain life in plain text
- php ; perl's insecure younger brother
- ;;plantuml ; diagrams for confusing people more
- ;;graphviz ; diagrams for confusing yourself even more
- ;;purescript ; javascript, but functional
- ;;python ; beautiful is better than ugly
- ;;qt ; the 'cutest' gui framework ever
- ;;racket ; a DSL for DSLs
- ;;raku ; the artist formerly known as perl6
- ;;rest ; Emacs as a REST client
- ;;rst ; ReST in peace
- ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
- ;;(rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
- ;;scad ; trust the preview, regret the render
- ;;scala ; java, but good
- ;;(scheme +guile) ; a fully conniving family of lisps
- sh ; she sells {ba,z,fi}sh shells on the C xor
- ;;sml
- ;;solidity ; do you need a blockchain? No.
- ;;swift ; who asked for emoji variables?
- ;;terra ; Earth and Moon in alignment for performance.
- web ; the tubes
- ;;yaml ; JSON, but readable
- ;;zig ; C, but simpler
-
- :email
- ;;(mu4e +org +gmail)
- ;;notmuch
- ;;(wanderlust +gmail)
-
- :app
- ;;calendar
- emms
- ;;everywhere ; *leave* Emacs!? You must be joking
- ;;irc ; how neckbeards socialize
- ;;(rss +org) ; emacs as an RSS reader
-
- :config
- literate
- (default +bindings +smartparens))
-
-;; If you're a dark-mode user who suffers from the "flash of white Emacs" when
-;; you first open Emacs, uncomment this (and adjust the color as you like).
-;; (add-to-list 'initial-frame-alist '(background-color . "#000000"))
diff --git a/doom/.config/doom/packages.el b/doom/.config/doom/packages.el
deleted file mode 100644
index 62cf1cd..0000000
--- a/doom/.config/doom/packages.el
+++ /dev/null
@@ -1,40 +0,0 @@
-(package! modus-themes)
-(package! ef-themes)
-(package! doric-themes)
-
-;; (package! mood-line)
-
-(package! minions)
-
-(package! breadcrumb)
-
-(package! vertico-carousel
- :recipe (:host github :repo "kn66/vertico-carousel"))
-
-(package! eglot-booster
- :recipe (:host github :repo "jdtsmith/eglot-booster"))
-
-(package! pinentry)
-
-(package! jabber)
-
-(package! vc-jj)
-
-(package! poly-org)
-
-(unpin! org-roam)
-
-(package! org-roam-ui)
-
-(package! org-appear)
-
-(package! org-modern-indent
- :recipe (:host github :repo "jdtsmith/org-modern-indent"))
-
-(package! elpher)
-
-(package! eat)
-
-(package! nov)
-
-(package! try)
diff --git a/doom/.config/doom/splash.el b/doom/.config/doom/splash.el
deleted file mode 100644
index fbb304e..0000000
--- a/doom/.config/doom/splash.el
+++ /dev/null
@@ -1,55 +0,0 @@
-;;; $DOOMDIR/splash.el -*- lexical-binding: t; -*-
-
-
-(defun splash--center (str width)
- "Return STR centered in WIDTH columns."
- (let ((pad (max 0 (/ (- width (string-width str)) 2))))
- (concat (make-string pad ?\s) str)))
-
-(defun splash-screen ()
- "Show the splash screen."
- (interactive)
- (let ((buf (get-buffer-create "*splash*")))
- (with-current-buffer buf
- (let ((inhibit-read-only t))
- (erase-buffer)
- (setq cursor-type nil)
- (let* ((height (- (window-body-height nil) 1))
- (width (window-body-width nil))
- (pad-top (- (/ height 2) 1))
- (pad-bottom (- height (/ height 2) 3))
- (emacs-str (format "GNU Emacs version %d.%d"
- emacs-major-version
- emacs-minor-version)))
- (insert (make-string pad-top ?\n))
- (insert (splash--center "www.gnu.org" width) "\n")
- (insert (splash--center emacs-str width) "\n")
- (insert (splash--center "A free/libre editor" width) "\n")
- (insert (make-string pad-bottom ?\n))
- (insert (splash--center "GNU Emacs comes with ABSOLUTELY NO WARRANTY" width) "\n")
- (insert (splash--center "Copyright (C) 2026 Free Software Foundation, Inc." width) "\n"))
- (goto-char (point-min))
- (read-only-mode 1)
- (use-local-map (make-sparse-keymap))))))
-
-(defun splash-screen-kill ()
- "Kill the splash buffer."
- (interactive)
- (when (get-buffer "*splash*")
- (kill-buffer "*splash*")))
-
-(if (daemonp)
- (add-hook 'server-after-make-frame-hook
- (lambda ()
- (run-with-timer 0.15 nil #'splash-screen)))
- (when (and (not (member "-no-splash" command-line-args))
- (not (member "--file" command-line-args))
- (not (member "--insert" command-line-args))
- (not (member "--find-file" command-line-args)))
- (add-hook 'window-setup-hook #'splash-screen)
- (setq inhibit-startup-screen t
- inhibit-startup-message t
- inhibit-startup-echo-area-message t)))
-
-(provide 'splash-screen)
-;;; splash.el ends here