diff options
| author | Magdalena Szweda <hi@roughlynamed.net> | 2026-09-23 19:38:14 +0200 |
|---|---|---|
| committer | Magdalena Szweda <hi@roughlynamed.net> | 2026-09-25 19:09:39 +0200 |
| commit | 568475983d15f81dff7b1d70276c77b1b994ce6e (patch) | |
| tree | 7e9b38150afd7b9356784fe77a82d74fe4a429bb /doom/.config | |
| parent | 524c54becb6e2b2a1c8c03207a13f5d23debb86a (diff) | |
fuckton of shit, mainly switch from helm + company -> vertico + corfu/cape
Diffstat (limited to 'doom/.config')
| -rw-r--r-- | doom/.config/doom/config.el | 163 | ||||
| -rw-r--r-- | doom/.config/doom/config.org | 637 | ||||
| -rw-r--r-- | doom/.config/doom/custom.el | 18 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-common.el | 89 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-fall-theme.el | 19 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-spring-theme.el | 19 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-summer-theme.el | 19 | ||||
| -rw-r--r-- | doom/.config/doom/extra-themes/evergarden-winter-theme.el | 19 | ||||
| -rw-r--r-- | doom/.config/doom/init.el | 94 | ||||
| -rw-r--r-- | doom/.config/doom/packages.el | 9 |
10 files changed, 586 insertions, 500 deletions
diff --git a/doom/.config/doom/config.el b/doom/.config/doom/config.el index 9c8abba..ba72ebf 100644 --- a/doom/.config/doom/config.el +++ b/doom/.config/doom/config.el @@ -16,15 +16,17 @@ (setq doom-theme 'modus-vivendi) ;; (setq doom-theme 'tango) +(setq custom-safe-themes t) + (setq doom-font (font-spec :family "Berkeley Mono" :size 12.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)) +:config +(mood-line-mode) +:custom +(mood-line-glyph-alist mood-line-glyphs-fira-code)) (defun my/split-window-dynamically () "Split the selected window, choosing orientation by its shape." @@ -45,6 +47,8 @@ :config (breadcrumb-mode 1)) +(setq +zen-mixed-pitch-modes '()) + (defun my/hs-eval () (interactive) (let* ((src (buffer-file-name)) @@ -87,13 +91,6 @@ (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))) @@ -134,20 +131,29 @@ 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 + 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")) + (add-to-list 'mm-discouraged-alternatives "text/html") + (add-to-list 'mm-discouraged-alternatives "text/richtext")) (use-package! jabber :config @@ -227,19 +233,30 @@ emms-cache-file (concat doom-cache-dir "emms-cache")) (after! org (setq - org-startup-indented t - org-startup-folded t ; fold headers on startup + 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)))) +'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) (add-hook 'org-capture-mode-hook #'delete-other-windows) (add-hook 'org-capture-mode-hook @@ -257,14 +274,14 @@ org-confirm-babel-evaluate nil) collect (aref chars (random (length chars))))))) (setq org-roam-capture-templates - '(("d" "default" plain - "* %?" - :if-new + '(("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))) + (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))) @@ -278,27 +295,27 @@ org-confirm-babel-evaluate nil) 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")))))) + (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))))) + (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) + (lambda () + (when (org-roam-file-p) + (my/org-roam-check-self-link) + (my/org-roam-check-dead-links))) + nil t) (map! :leader @@ -331,7 +348,7 @@ org-html-postamble nil)) (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) @@ -341,6 +358,10 @@ org-html-postamble nil)) 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/")) @@ -403,6 +424,12 @@ org-html-postamble nil)) (use-package! elpher) +(map! + :leader + :prefix "o g" + :desc "Elpher" "e" #'elpher + :desc "Browse Elpher" "b" #'elpher-browse-url-elpher) + (use-package! mosey :commands (mosey-forward mosey-backward mosey-forward-bounce mosey-backward-bounce @@ -413,14 +440,10 @@ org-html-postamble nil)) :desc "Mosey backward" "a" #'mosey-backward-bounce :desc "Mosey forward" "e" #'mosey-forward-bounce)) -(use-package! aggressive-indent - :config - (global-aggressive-indent-mode 1)) ; use aggressive-indent everywhere - (map! :leader :prefix "o" - :desc "Woman" "w" #'helm-man-woman) + :desc "Woman" "w" #'woman) (map! :leader @@ -428,8 +451,22 @@ org-html-postamble nil)) :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 + (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)) @@ -441,12 +478,12 @@ org-html-postamble nil)) "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) + "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) @@ -465,12 +502,12 @@ org-html-postamble nil)) "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) + "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 diff --git a/doom/.config/doom/config.org b/doom/.config/doom/config.org index 74578e0..5e2ae0b 100644 --- a/doom/.config/doom/config.org +++ b/doom/.config/doom/config.org @@ -1,9 +1,10 @@ #+TITLE: Doom Emacs configuration #+PROPERTY: header-args:emacs-lisp :tangle config.el -* TODO Foreword +* 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 @@ -36,23 +37,28 @@ I also use tango from time-to-time, thats the comment. (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 font (sometimes!) #+begin_src emacs-lisp -(setq doom-font (font-spec :family "Berkeley Mono" :size 12.0)) + (setq doom-font (font-spec :family "Berkeley Mono" :size 12.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) + (setq display-line-numbers-type t) #+end_src ** Modeline -The emacs mood line, It's nice and simple which i adore. -I might have to try out the default modeline from Emacs sometime though. + +mood-line is a nice & simple modeline for emacs! #+begin_src emacs-lisp -(use-package! mood-line + (use-package! mood-line :config (mood-line-mode) :custom @@ -62,24 +68,24 @@ I might have to try out the default modeline from Emacs sometime though. ** 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)))) + (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) + (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) + (setq scroll-margin 3) #+end_src ** Breadcrumb @@ -87,35 +93,42 @@ Breadcrumb is a package that shows you where you are in a file at the very top o ~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)) + (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))))) + (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 -** TODO make this a ~SPC~-based binding 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))) + (add-hook 'haskell-mode-hook + (lambda () + (local-set-key (kbd "<f5>") #'my/hs-eval))) #+end_src ** Eglot @@ -123,17 +136,17 @@ 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)) + (use-package! eglot + :hook + (prog-mode . eglot-ensure)) #+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 (method (eql workspace/didChangeWatchedFiles)) id &key watchers) - nil) + (after! eglot + (cl-defmethod eglot-register-capability + (server (method (eql workspace/didChangeWatchedFiles)) id &key watchers) + nil) #+end_src @@ -148,8 +161,8 @@ Oxlint is a rewrite of ESLint in Rust, Not sure why oxlsp isnt its own tool, but ~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) + (setq eglot-sync-connect nil + eglot-connect-timeout 60) #+end_src ** Flycheck @@ -158,33 +171,33 @@ 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)) + (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) + (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 ++begin_src emacs-lisp (flycheck-add-next-checker 'javascript-eslint 'javascript-oxlint) - (flycheck-add-next-checker - 'html-tidy - 'htmlhint) +(flycheck-add-next-checker + 'html-tidy + 'htmlhint) #+end_src We then make flycheck check the file after saving. @@ -227,12 +240,12 @@ 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). To read the file: #+begin_src emacs-lisp -(setq auth-sources '("~/.authinfo.gpg")) + (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) + (setq auth-source-cache-expiry nil) #+end_src ** Gnus @@ -240,105 +253,124 @@ 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 ".") + (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) + (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 + (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 - '("3258B28C124AB0891D6C9E929B72909EEF00CBD0") - mml-secure-openpgp-sign-with-sender t) + (setq mml-secure-openpgp-signers + '("3258B28C124AB0891D6C9E929B72909EEF00CBD0") + 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 + (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))) + (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 -) + (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-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) + (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")) + (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 + (use-package! jabber + :config #+end_src We point jabber at my XMPP account: #+begin_src emacs-lisp -(setq jabber-account-list - '(("roughlynamed@yax.im"))) + (setq jabber-account-list + '(("roughlynamed@yax.im"))) #+end_src And let jabber use the modeline #+begin_src emacs-lisp -(jabber-modeline-mode 1) + (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)) + :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) + (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 @@ -350,8 +382,8 @@ 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) + (use-package! emms + :commands (emms emms-browser) #+end_src Configure the mappings for EMMS @@ -374,7 +406,7 @@ In this case, it makes the emms mappings available right when emacs starts up. 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) +(require 'emms-setup) #+end_src We then use ~emms-all~ to load every emms submodule. Possible variations include: @@ -393,63 +425,63 @@ We then use ~emms-all~ to load every emms submodule. Possible variations include 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) +(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-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-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 + 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")) + 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) + (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) + (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) + (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) + (emms-lyrics-toggle-display-on-minibuffer) #+end_src LISTENED/LENGTH indicator in the modeline + #+begin_src emacs-lisp -(emms-playing-time-mode 1) + (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)) + (map! :map emms-browser-mode-map + :n "RET" #'emms-browser-add-tracks-and-play)) #+end_src * Git @@ -461,13 +493,13 @@ 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 + (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 * Org @@ -476,40 +508,58 @@ 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-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-indented t - org-startup-folded t ; fold headers on startup - org-pretty-entities t - org-hide-emphasis-markers t - org-capture-templates-contexts nil + (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)))) + 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 ** 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))) + (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 @@ -518,8 +568,8 @@ Org roam is org's way of a Zettelkasten style knowledge place. Something like ob Point org-roam at the org directory (declared seperately). #+begin_src emacs-lisp -(after! org-roam - (setq org-roam-directory (file-truename "~/org/")) + (after! org-roam + (setq org-roam-directory (file-truename "~/org/")) #+end_src Make roam sync it's database automatically. @@ -540,7 +590,7 @@ This is a custom function, i made it to mimic how the ~zk~ cli works when making The template for new org notes. #+begin_src emacs-lisp -(setq org-roam-capture-templates + (setq org-roam-capture-templates '(("d" "default" plain "* %?" :if-new @@ -548,16 +598,16 @@ The template for new org notes. 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))) + (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))) +(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-node-display-template + (concat "${title:*} " (propertize "${file-stem}" 'face 'org-tag))) #+end_src @@ -574,7 +624,7 @@ Define sections in roam. 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 () + (defun my/org-roam-check-self-link () (when-let* ((node (org-roam-node-at-point)) (id (org-roam-node-id node))) (save-excursion @@ -588,7 +638,7 @@ This functions check if an org file has an inserted link to itself. Check links that dont point to an actual file #+begin_src emacs-lisp -(defun my/org-roam-check-dead-links () + (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))) @@ -598,7 +648,7 @@ Check links that dont point to an actual file *** Hooks Run the defined above functions before every org file save #+begin_src emacs-lisp -(add-hook 'before-save-hook + (add-hook 'before-save-hook (lambda () (when (org-roam-file-p) (my/org-roam-check-self-link) @@ -618,31 +668,31 @@ Define mappings #+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 + :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 + :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 + (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 + org-html-head-include-default-style nil #+end_src Dont postamble in generated html #+begin_src emacs-lisp - org-html-postamble nil)) + org-html-postamble nil)) #+end_src ** org-roam-ui @@ -651,102 +701,110 @@ 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) + (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 -)) + (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)) + (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 -~Eww... What browser is that girl using?~ +#+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!) -emms is fine on its own, but i have a config to make the experience better. +~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=") + (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/")) + (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)) + (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))) + (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))))) + (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))) + (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") + (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-width 100) (setq shr-max-width 120) (setq shr-indentation 4) (setq shr-use-fonts nil) @@ -774,13 +832,22 @@ Open a url in a secondary program, in my case ~Vivaldi~ #+end_src * Elpher -~Elpher Leaves Protocols Hanging as Eternally Relevant~ +#+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 -That's about... all the config this package needs. +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 ~The ones that dont belong~ @@ -803,48 +870,65 @@ Keybinds for mosey, under K because m was taken by localleader bindings :desc "Mosey forward" "e" #'mosey-forward-bounce)) #+end_src -** aggressive-indent -~aggressive-indent~ is a package that makes sure every line is indented properly. -It follows its own indentation, and forces (very aggressively) for lines to stay on there, live, while editing. -#+begin_src emacs-lisp -(use-package! aggressive-indent - :config - (global-aggressive-indent-mode 1)) ; use aggressive-indent everywhere -#+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~ -Because i use Helm, im using the pre-configured Helm version +Let's map this to a mnemonic binding, in this case ~Open Woman~ + #+begin_src emacs-lisp -(map! - :leader - :prefix "o" - :desc "Woman" "w" #'helm-man-woman) + (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" - :desc "Dired" "d" #'dired - :desc "Dired here" "h" #'dired-jump) + (map! + :leader + :prefix "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 * 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) + (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. @@ -852,28 +936,28 @@ 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)) + (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 + (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) + (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) @@ -883,31 +967,29 @@ Make ~o~ go right in org mode (previously ~inserted on newline~) #+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) + (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) - - + (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 '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 @@ -975,3 +1057,8 @@ Doesnt work in org files :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 index 3fb66f9..f8551a0 100644 --- a/doom/.config/doom/custom.el +++ b/doom/.config/doom/custom.el @@ -5,7 +5,23 @@ ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(custom-safe-themes - '("10e330880269244ae45ae9e02fe6f55766da9e15036e7c7f07d7ce228195deb5" + '("1f326e259bff7e24de2f24bf77b9c21e0ff086ed75705e9f3d4231d7b525b00b" + "9cacb5cd8f414a2d97dba01dc081ad3184f1bc08b080bd9c56b4f85aab085368" + "53b86437220a4509257e44e9e537830e2d57e55b0a63b981212c235afb083bea" + "824954ed6d977d2b0ddf8cf23fcfc59eb3e9cdb72991c7d4591f784a34742526" + "720838034f1dd3b3da66f6bd4d053ee67c93a747b219d1c546c41c4e425daf93" + "2d2bdc418a7811a9652729894b3b74679bd8652959e09f1e046081d722d1987e" + "7c3d62a64bafb2cc95cd2de70f7e4446de85e40098ad314ba2291fc07501b70c" + "bb18b6d5982beeb76a37ced9211e972f84e8e76af9579456aa8cef794ae0bcb9" + "5f843ef0d18f55ef9b1e72ac9aaa59efdd698ee31781a86f7a054047a036bd08" + "d6d569756b04beb0fc7c9ca83d18f61f18875849f4b9a9d34fca0b69056dc4de" + "e4fc3c202ee94a1570a645ca8b7388f4fe783e52ac47ea141a22bef26e0b2e89" + "ae62fac1af292396a8e77e48435b41058fda45be24ac79fa40c89e1173b9b2d6" + "530e730924892af285af79d88339048da48c572a3c974882682eadb9881fb051" + "b243ec44629b75034c83be3fa411662f89582223012e8f4110a82dc40bf8561a" + "8c8a79d60815b0c094ed78a6936d80e01404d6ab48f93ce121206eb0d701e6c0" + "81ce39f63b6a730b1f5f33019100fc087122e5660830121809968c5d2381684d" + "10e330880269244ae45ae9e02fe6f55766da9e15036e7c7f07d7ce228195deb5" "28f3ac0f5fade64dc7e27abe9d32e7d85576c40940977e8e319f25055d3a28b7" "967c23e9ba179b80560774419f081df22e7674aac23c5c550b817e4a1ce7d058" "456697e914823ee45365b843c89fbc79191fdbaff471b29aad9dcbe0ee1d5641" diff --git a/doom/.config/doom/extra-themes/evergarden-common.el b/doom/.config/doom/extra-themes/evergarden-common.el index 749bcda..30f0e60 100644 --- a/doom/.config/doom/extra-themes/evergarden-common.el +++ b/doom/.config/doom/extra-themes/evergarden-common.el @@ -6,8 +6,7 @@ ;; Keywords: faces, theme ;;; Commentary: -;; this is NOT a theme in itself - +;; NOT a theme by itself. shared engine for evergarden themes ;;; Code: (require 'modus-themes) @@ -19,8 +18,7 @@ :group 'ef-themes :prefix "evergarden-") -(defconst evergarden-theme-family 'evergarden-theme - "Shared theme family symbol for every evergarden flavor.") +(defconst evergarden-theme-family 'evergarden-theme) (defconst evergarden--term-mappings-dark '((bg-term-black bg-main) @@ -30,10 +28,7 @@ (bg-term-white fg-dim) (fg-term-white fg-dim) (bg-term-white-bright fg-main) - (fg-term-white-bright fg-main)) - "ANSI black/white terminal mapping for dark-background flavors. -Anchors \"black\" to the darkest neutrals and \"white\" to the lightest, -the same relationship a light theme uses just inverted.") + (fg-term-white-bright fg-main))) (defconst evergarden--term-mappings-light '((bg-term-black fg-main) @@ -43,9 +38,7 @@ the same relationship a light theme uses just inverted.") (bg-term-white border) (fg-term-white border) (bg-term-white-bright bg-main) - (fg-term-white-bright bg-main)) - "ANSI black/white terminal mapping for the light-background flavor (summer). -Matches fortune-gold-theme.el's light-theme convention.") + (fg-term-white-bright bg-main))) (defconst evergarden--term-mappings-color '((bg-term-red red) (fg-term-red red) @@ -59,19 +52,16 @@ Matches fortune-gold-theme.el's light-theme convention.") (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)) - "ANSI colored-slot terminal mapping, identical for every flavor. -Left as true family colors (not the green signature) since ANSI red should -stay red, ANSI blue should stay blue, etc., regardless of flavor.") + (bg-term-cyan-bright cyan-warmer) (fg-term-cyan-bright cyan-warmer))) (defconst evergarden-palette-mappings-partial (append '( (err red) - (warning orange) + (warning yellow) (info cyan) (underline-err red) - (underline-warning orange) + (underline-warning yellow) (underline-note cyan) (modeline-err red) (modeline-warning yellow) @@ -94,25 +84,25 @@ stay red, ANSI blue should stay blue, etc., regardless of flavor.") (name cyan) (keybind green) (identifier fg-main) - (fg-prompt green) + (fg-prompt pink) (bg-prompt unspecified) (builtin cyan-cooler) - (comment fg-dim) - (constant magenta-cooler) - (fnname cyan) - (fnname-call cyan-warmer) + (comment overlay2) + (constant pink) + (fnname green) + (fnname-call green-warmer) (keyword red) - (preprocessor green) - (property fg-main) - (docstring fg-dim) - (docmarkup green-cooler) - (string green-warmer) + (preprocessor cherry) + (property cyan-cooler) + (docstring cyan-cooler) + (docmarkup cyan) + (string lime) (type yellow) - (variable blue) - (variable-use blue) - (rx-backslash orange) - (rx-construct magenta) + (variable fg-main) + (variable-use fg-main) + (rx-backslash yellow) + (rx-construct cyan) (accent-0 green) (accent-1 cyan) @@ -126,8 +116,8 @@ stay red, ANSI blue should stay blue, etc., regardless of flavor.") (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-select bg-yellow-subtle) + (fg-mark-select yellow) (bg-mark-other bg-cyan-subtle) (fg-mark-other cyan) @@ -152,7 +142,7 @@ stay red, ANSI blue should stay blue, etc., regardless of flavor.") (prose-table fg-alt) (prose-table-formula cyan) (prose-tag yellow-faint) - (prose-todo red) + (prose-todo cyan) (fg-prose-verbatim magenta-warmer) (mail-cite-0 green) @@ -165,8 +155,8 @@ stay red, ANSI blue should stay blue, etc., regardless of flavor.") (mail-other fg-alt) (bg-search-static bg-cyan-subtle) - (bg-search-current bg-green-intense) - (bg-search-lazy bg-green-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) @@ -179,14 +169,14 @@ stay red, ANSI blue should stay blue, etc., regardless of flavor.") (fg-space border) (fringe bg-main) - (fg-line-number-active green) - (fg-line-number-inactive overlay1) + (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 bg-dim) + (bg-tab-bar overlay1) (bg-tab-current bg-main) - (bg-tab-other bg-dim) + (bg-tab-other surface2) (bg-prominent-err bg-err) (fg-prominent-err err) @@ -252,10 +242,8 @@ stay red, ANSI blue should stay blue, etc., regardless of flavor.") (overline-heading-6 red) (overline-heading-7 unspecified) (overline-heading-8 unspecified)) - evergarden--term-mappings-color) - "Semantic color mappings shared by every evergarden flavor. -Only references palette symbol names, never literal hex, so the exact same -list works whether the active flavor's palette is dark or light.") + evergarden--term-mappings-color)) + (defconst evergarden-custom-faces '(`(corfu-default ((,c :inherit modus-themes-fixed-pitch :background ,bg-dim @@ -270,24 +258,13 @@ list works whether the active flavor's palette is dark or light.") `(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) - "Declare NAME as a Modus-derived theme when reloading in-session. -FAMILY, DESCRIPTION, MODE, PALETTE-SYM and OVERRIDES-SYM are forwarded to -`modus-themes-declare', matching what `modus-themes-theme' expects to find -if the theme object already exists in the current session." +(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) - "Register and define one evergarden flavor. - -FLAVOR-NAME is a symbol like `evergarden-fall'. PALETTE-PARTIAL is that -flavor's base palette (its own analogue of one spring.lua/summer.lua/ -fall.lua/winter.lua table, plus the warmer/cooler/faint/intense/subtle/ -nuanced variants Modus needs). MODE is `dark' or `light' and selects which -of `evergarden--term-mappings-dark'/`-light' gets appended." (let* ((flavor-str (symbol-name flavor-name)) (description (format "Cozy evergarden dark theme, %s flavor." (capitalize (substring flavor-str (length "evergarden-"))))) diff --git a/doom/.config/doom/extra-themes/evergarden-fall-theme.el b/doom/.config/doom/extra-themes/evergarden-fall-theme.el index e0903c2..30d6a89 100644 --- a/doom/.config/doom/extra-themes/evergarden-fall-theme.el +++ b/doom/.config/doom/extra-themes/evergarden-fall-theme.el @@ -6,21 +6,10 @@ ;; Keywords: faces, theme ;;; Commentary: -;; -;; The Fall flavor of evergarden -- generated by whiskers from -;; the shared color table, same as lua/evergarden/palettes/fall.lua. -;; All the actual face wiring lives in evergarden-common.el; this file only -;; supplies Fall's own colors. DO NOT EDIT BY HAND -- edit the -;; .tera template and re-run whiskers instead. +;; Fall evergarden ;;; Code: -;; Not `(file-name-directory (or load-file-name buffer-file-name))' -- -;; both can be nil depending on how the loader gets here (byte-compile -;; caches, `eval-buffer', some straight.el paths), which signals -;; `(wrong-type-argument stringp nil)'. `custom-theme-load-path' is -;; reliably populated by the time any theme file loads (it's how this -;; file was found in the first place), so search that instead. (unless (featurep 'evergarden-common) (let ((common (locate-file "evergarden-common" (append (seq-filter #'stringp custom-theme-load-path) @@ -172,12 +161,12 @@ (bg-completion "#2b3337") (bg-hover "#4a585c") (bg-hover-secondary "#c4cedc") - (bg-hl-line "#4a585c") - (bg-paren-match "#deccb0") + (bg-hl-line "#2b3337") + (bg-paren-match "#f7a182") (bg-err "#d79d9f") (bg-warning "#deccb0") (bg-info "#b5e1ca") - (bg-region "#cbe1b5")) + (bg-region "#374145")) "Base palette entries for `evergarden-fall', generated by whiskers.") (evergarden-build-theme 'evergarden-fall evergarden-fall-palette-partial 'dark) diff --git a/doom/.config/doom/extra-themes/evergarden-spring-theme.el b/doom/.config/doom/extra-themes/evergarden-spring-theme.el index 4ce3f85..181dae9 100644 --- a/doom/.config/doom/extra-themes/evergarden-spring-theme.el +++ b/doom/.config/doom/extra-themes/evergarden-spring-theme.el @@ -6,21 +6,10 @@ ;; Keywords: faces, theme ;;; Commentary: -;; -;; The Spring flavor of evergarden -- generated by whiskers from -;; the shared color table, same as lua/evergarden/palettes/spring.lua. -;; All the actual face wiring lives in evergarden-common.el; this file only -;; supplies Spring's own colors. DO NOT EDIT BY HAND -- edit the -;; .tera template and re-run whiskers instead. +;; Spring evergarden ;;; Code: -;; Not `(file-name-directory (or load-file-name buffer-file-name))' -- -;; both can be nil depending on how the loader gets here (byte-compile -;; caches, `eval-buffer', some straight.el paths), which signals -;; `(wrong-type-argument stringp nil)'. `custom-theme-load-path' is -;; reliably populated by the time any theme file loads (it's how this -;; file was found in the first place), so search that instead. (unless (featurep 'evergarden-common) (let ((common (locate-file "evergarden-common" (append (seq-filter #'stringp custom-theme-load-path) @@ -172,12 +161,12 @@ (bg-completion "#343e43") (bg-hover "#4a585c") (bg-hover-secondary "#c4cedc") - (bg-hl-line "#4a585c") - (bg-paren-match "#deccb0") + (bg-hl-line "#343e43") + (bg-paren-match "#f7a182") (bg-err "#d79d9f") (bg-warning "#deccb0") (bg-info "#b5e1ca") - (bg-region "#cbe1b5")) + (bg-region "#3e4a4f")) "Base palette entries for `evergarden-spring', generated by whiskers.") (evergarden-build-theme 'evergarden-spring evergarden-spring-palette-partial 'dark) diff --git a/doom/.config/doom/extra-themes/evergarden-summer-theme.el b/doom/.config/doom/extra-themes/evergarden-summer-theme.el index 0557283..7d518ed 100644 --- a/doom/.config/doom/extra-themes/evergarden-summer-theme.el +++ b/doom/.config/doom/extra-themes/evergarden-summer-theme.el @@ -6,21 +6,10 @@ ;; Keywords: faces, theme ;;; Commentary: -;; -;; The Summer flavor of evergarden -- generated by whiskers from -;; the shared color table, same as lua/evergarden/palettes/summer.lua. -;; All the actual face wiring lives in evergarden-common.el; this file only -;; supplies Summer's own colors. DO NOT EDIT BY HAND -- edit the -;; .tera template and re-run whiskers instead. +;; Summer evergarden ;;; Code: -;; Not `(file-name-directory (or load-file-name buffer-file-name))' -- -;; both can be nil depending on how the loader gets here (byte-compile -;; caches, `eval-buffer', some straight.el paths), which signals -;; `(wrong-type-argument stringp nil)'. `custom-theme-load-path' is -;; reliably populated by the time any theme file loads (it's how this -;; file was found in the first place), so search that instead. (unless (featurep 'evergarden-common) (let ((common (locate-file "evergarden-common" (append (seq-filter #'stringp custom-theme-load-path) @@ -172,12 +161,12 @@ (bg-completion "#ede8dd") (bg-hover "#ceccbd") (bg-hover-secondary "#6f91c1") - (bg-hl-line "#ceccbd") - (bg-paren-match "#d1ad73") + (bg-hl-line "#ede8dd") + (bg-paren-match "#c69883") (bg-err "#d3797b") (bg-warning "#d1ad73") (bg-info "#52c68a") - (bg-region "#93c85a")) + (bg-region "#e6e1d3")) "Base palette entries for `evergarden-summer', generated by whiskers.") (evergarden-build-theme 'evergarden-summer evergarden-summer-palette-partial 'light) diff --git a/doom/.config/doom/extra-themes/evergarden-winter-theme.el b/doom/.config/doom/extra-themes/evergarden-winter-theme.el index e353f3a..b3dc7e7 100644 --- a/doom/.config/doom/extra-themes/evergarden-winter-theme.el +++ b/doom/.config/doom/extra-themes/evergarden-winter-theme.el @@ -6,21 +6,10 @@ ;; Keywords: faces, theme ;;; Commentary: -;; -;; The Winter flavor of evergarden -- generated by whiskers from -;; the shared color table, same as lua/evergarden/palettes/winter.lua. -;; All the actual face wiring lives in evergarden-common.el; this file only -;; supplies Winter's own colors. DO NOT EDIT BY HAND -- edit the -;; .tera template and re-run whiskers instead. +;; Winter evergarden ;;; Code: -;; Not `(file-name-directory (or load-file-name buffer-file-name))' -- -;; both can be nil depending on how the loader gets here (byte-compile -;; caches, `eval-buffer', some straight.el paths), which signals -;; `(wrong-type-argument stringp nil)'. `custom-theme-load-path' is -;; reliably populated by the time any theme file loads (it's how this -;; file was found in the first place), so search that instead. (unless (featurep 'evergarden-common) (let ((common (locate-file "evergarden-common" (append (seq-filter #'stringp custom-theme-load-path) @@ -172,12 +161,12 @@ (bg-completion "#262f33") (bg-hover "#4a585c") (bg-hover-secondary "#c4cedc") - (bg-hl-line "#4a585c") - (bg-paren-match "#deccb0") + (bg-hl-line "#262f33") + (bg-paren-match "#f7a182") (bg-err "#d79d9f") (bg-warning "#deccb0") (bg-info "#b5e1ca") - (bg-region "#cbe1b5")) + (bg-region "#374145")) "Base palette entries for `evergarden-winter', generated by whiskers.") (evergarden-build-theme 'evergarden-winter evergarden-winter-palette-partial 'dark) diff --git a/doom/.config/doom/init.el b/doom/.config/doom/init.el index 394574f..14d48a5 100644 --- a/doom/.config/doom/init.el +++ b/doom/.config/doom/init.el @@ -7,71 +7,79 @@ ;;layout ; auie,ctsrnm is the superior home row :completion - company ; the ultimate code completion backend - ;; (corfu +orderless) ; complete with cap(f), cape and a flying feather! - helm ; the *other* search engine for love and life + ;; 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 ; the search engine of the future + (vertico + +icons + +childframe) ; the search engine of the future :ui ;;deft ; notational velocity for Emacs - doom ; what makes DOOM look the way it does + 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 + doom-quit ; DOOM quit-message prompts when you quit Emacs ;;(emoji +unicode) ; 🙂 - hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + 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 + ;; 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 + 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 + (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 + 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 + (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 + 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 + 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 + 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 + 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 + syntax ; tasing you for every semicolon you forget ;;(spell +flyspell) ; tasing you for misspelling mispelling ;;grammar ; tasing grammar mistake every you make @@ -84,20 +92,20 @@ ;;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 + (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 + pdf ; pdf enhancements ;;terraform ; infrastructure as code ;;tmux ; an API for interacting with tmux - tree-sitter ; syntax and parsing, sitting in a tree... + 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 + (:if (featurep :system 'macos) macos) ; improve compatibility with macOS ;;tty ; improve the terminal Emacs experience :lang @@ -115,7 +123,7 @@ ;;dhall ;;elixir ; erlang done right ;;elm ; care for a cup of TEA? - emacs-lisp ; drown in parentheses + emacs-lisp ; drown in parentheses ;;erlang ; an elegant language for a more civilized age ;;ess ; emacs speaks statistics ;;factor @@ -126,13 +134,13 @@ ;;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 + (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)))))) + 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 @@ -144,8 +152,12 @@ ;;nix ; I hereby declare "nix geht mehr!" ;;ocaml ; an objective camel ;;odin ; C, minus its footguns - (org +roam +pretty) ; organize your plain life in plain text - php ; perl's insecure younger brother + (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 @@ -160,12 +172,12 @@ ;;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 + 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 + web ; the tubes ;;yaml ; JSON, but readable ;;zig ; C, but simpler diff --git a/doom/.config/doom/packages.el b/doom/.config/doom/packages.el index e767ecd..ae28272 100644 --- a/doom/.config/doom/packages.el +++ b/doom/.config/doom/packages.el @@ -6,12 +6,13 @@ (package! ef-themes) (package! majutsu :recipe (:host github :repo "0WD0/majutsu")) -(package! minimal-dashboard) -(package! elcord) (unpin! org-roam) (package! org-roam-ui) (package! breadcrumb) -(package! mosey) -(package! aggressive-indent) (package! org-appear) (package! elpher) +(package! poly-org) +(package! eat) +(package! org-modern-indent + :recipe (:host github :repo "jdtsmith/org-modern-indent")) +(package! minions) |
