diff options
| -rw-r--r-- | doom/.config/doom/config.el | 716 | ||||
| -rw-r--r-- | doom/.config/doom/config.org | 1604 | ||||
| -rw-r--r-- | doom/.config/doom/config.org.bak | 1219 | ||||
| -rw-r--r-- | doom/.config/doom/custom.el | 47 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/2026-09-18-213348_1916x1052_scrot.png | bin | 166487 -> 0 bytes | |||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-common.el | 315 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-fall-theme.el | 176 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-spring-theme.el | 176 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-summer-theme.el | 176 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-theme.el | 445 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-winter-theme.el | 176 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/fortune-gold-theme.el | 499 | ||||
| -rw-r--r-- | doom/.config/doom/init.el | 202 | ||||
| -rw-r--r-- | doom/.config/doom/packages.el | 40 | ||||
| -rw-r--r-- | doom/.config/doom/splash.el | 55 |
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 Binary files differdeleted file mode 100644 index 32b4a29..0000000 --- a/doom/.config/doom/extra-themes/2026-09-18-213348_1916x1052_scrot.png +++ /dev/null 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 |
