From 459ecd3312802d81a7e45737c51dd1f588f98cd1 Mon Sep 17 00:00:00 2001 From: Nathan McCarty Date: Mon, 9 May 2022 21:16:01 -0400 Subject: [PATCH] Move doom emacs into home manager --- applications/emacs.nix | 14 +- doom.d/config.el | 158 ++++++++++++++++- doom.d/config.org | 387 +++++++++++++++++++++++++++++++++++++++++ doom.d/init.el | 190 ++++++-------------- doom.d/packages.el | 12 ++ 5 files changed, 608 insertions(+), 153 deletions(-) create mode 100644 doom.d/config.org diff --git a/applications/emacs.nix b/applications/emacs.nix index 38143ed..fce8129 100644 --- a/applications/emacs.nix +++ b/applications/emacs.nix @@ -1,14 +1,7 @@ { config, pkgs, unstable, doomEmacs, ... }: -let - emacsPackage = (unstable.emacsPackagesFor unstable.emacsPgtkNativeComp).emacsWithPackages (epkgs: with epkgs; [ - vterm - pdf-tools - ]); -in { # Install emacs environment.systemPackages = [ - emacsPackage # For markdown rendering pkgs.pythonPackages.grip # For graph generation @@ -18,20 +11,17 @@ in # Utilize home-manager home-manager.users.nathan = { # Nixify doomEmacs - # TODO:Reenable, currently off because of splash bug imports = [ doomEmacs ]; programs.doom-emacs = { - enable = false; + enable = true; doomPrivateDir = ../doom.d; - emacsPackage = emacsPackage; + emacsPackage = unstable.emacsPgtkNativeComp; }; # Startup service services.emacs = { enable = pkgs.stdenv.isLinux; client.enable = true; defaultEditor = true; - # TODO remove when we enable doom-emacs again - package = emacsPackage; }; }; } diff --git a/doom.d/config.el b/doom.d/config.el index 45f4ca0..c349d40 100644 --- a/doom.d/config.el +++ b/doom.d/config.el @@ -21,8 +21,8 @@ ;; See 'C-h v doom-font' for documentation and more examples of what they ;; accept. For example: ;; -(setq doom-font (font-spec :family "FiraCode Nerd Font" :size 12 :weight 'semi-light)) -;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13)) +(setq doom-font (font-spec :family "FiraCode Nerd Font" :size 11 :weight 'semi-light) + doom-variable-pitch-font (font-spec :family "Fira Sans" :size 15)) ;; ;; If you or Emacs can't find your font, use 'M-x describe-font' to look them ;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to @@ -32,7 +32,15 @@ ;; There are two ways to load a theme. Both assume the theme is installed and ;; available. You can either set `doom-theme' or manually load a theme with the ;; `load-theme' function. This is the default: -(setq doom-theme 'doom-one) +;; (setq doom-theme 'doom-solarized-dark) +(use-package! solarized-theme + :demand t + :config + (setq solarized-distinct-fringe-background t + solarized-distinct-doc-face t + solarized-scale-markdown-headlines t + solarized-scale-org-headlines t) + (load-theme 'solarized-selenized-dark t)) ;; This determines the style of line numbers in effect. If set to `nil', line ;; numbers are disabled. For relative line numbers, set this to `relative'. @@ -40,7 +48,7 @@ ;; If you use `org' and don't want your org files in the default location below, ;; change `org-directory'. It must be set before org loads! -(setq org-directory "~/org/") +(setq org-directory "~/Org/") ;; Whenever you reconfigure a package, make sure to wrap your config in an @@ -74,3 +82,145 @@ ;; ;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how ;; they are implemented. + +(after! centaur-tabs + (setq centaur-tabs-set-icons t + centaur-tabs-set-bar 'underflow + centaur-tabs-style "alternate") + (centaur-tabs-headline-match) + (centaur-tabs-group-by-projectile-project)) + +(use-package! mixed-pitch + :hook + (org-mode . mixed-pitch-mode) + (markdown-mode . mixed-pitch-mode) + :config + (setq mixed-pitch-set-height t)) + +(after! avy + (define-key! + "C-:" 'avy-goto-char + "C-'" 'avy-goto-char-2 + "M-g f" 'avy-goto-line + "M-g w" 'avy-goto-word-1 + "M-g e" 'avy-goto-word-0) + (cheatsheet-add-group 'Avy + '(:key "C-:" :description "Goto Char") + '(:key "C-'" :description "Goto Char (2)") + '(:key "M-g f" :description "Goto line") + '(:key "M-g w" :description "Goto word") + '(:key "M-g e" :description "Goto word (0)"))) + +(after! swiper + (define-key! "C-s" 'swiper)) + +(use-package! crux + :bind (("C-k" . crux-smart-kill-line) + ("C-c ^" . crux-top-join-line))) + +(global-unset-key (kbd "C-q")) +(use-package! string-inflection + :bind (("C-q" . string-inflection-all-cycle))) +(cheatsheet-add-group 'string-inflection + '(:key "C-q" :description "Rotate case")) + +(use-package! smart-hungry-delete + :bind (("M-" . smart-hungry-delete-backward-char))) + +(use-package! deadgrep + :bind ("C-c s r" . deadgrep)) + +(setq org-hide-emphasis-markers t + org-pretty-entities t) + +(font-lock-add-keywords 'org-mode + '(("^ *\\([-]\\) " + 0 (prog1 () (compose-region (match-beginning 1) (match-end 1) ""))) + ("^ *\\([+]\\) " + 0 (prog1 () (compose-region (match-beginning 1) (match-end 1) ""))))) + +(use-package! org-roam + :custom + (org-roam-directory (concat org-directory "Roam/")) + (org-roam-complete-everywhere t) + :bind (("C-c r l" . org-roam-buffer-toggle) + ("C-c r f" . org-roam-node-find) + ("C-c r g" . org-roam-graph) + ("C-c r i" . org-roam-node-insert) + ("C-c r c" . org-roam-capture) + ("C-c r T" . org-roam-dailies-capture-today) + ("C-c r t" . org-roam-dailies-goto-today) + :map org-mode-map + ("C-M-i" . completion-at-point)) + :config + (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) + (org-roam-db-autosync-mode) + (setq org-roam-dailies-capture-templates + '(("d" "default" entry "* %<%I:%M %p>: %?" + :if-new (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n"))))) + +(use-package! magit-todos + :hook (magit-mode . magit-todos-mode)) + +(use-package! magit-delta + :hook (magit-mode . magit-delta-mode)) + +(magit-wip-mode) + +(use-package! multi-vterm + :bind (("C-c o M" . multi-vterm) + ("C-c o m" . multi-vterm-project))) + +(use-package! separedit + :bind + (:map prog-mode-map + ("C-c '" . separedit)) + :config + (setq separedit-default-mode 'gfm-mode + separedit-continue-fill-column t)) + +(after! lsp-ui + (setq lsp-ui-sideline-show-diagnostics t + lsp-ui-sideline-show-hover t + lsp-ui-sideline-show-code-actions t)) + +(after! lsp-ui + (setq lsp-ui-peek-enable t + lsp-ui-peek-show-directory t)) + +(after! lsp-ui + (setq lsp-ui-doc-enable t + lsp-ui-doc-position 'top + lsp-ui-doc-show-with-cursor t)) + +(after! lsp-mode + (setq lsp-auto-configure t + lsp-lens-enable t + lsp-rust-analyzer-cargo-watch-command "clippy" + lsp-rust-analyzer-cargo-watch-args ["--all-features"] + lsp-rust-analyzer-experimental-proc-attr-macros t + lsp-rust-analyzer-proc-macro-enable t + lsp-rust-analyzer-use-rustc-wrapper-for-build-scripts t + lsp-rust-analyzer-import-enforce-granularity t)) + +(use-package! markdown-mode + :mode ("README\\.md" . gfm-mode) + :hook (markdown-mode . variable-pitch-mode) + (markdown-mode . auto-fill-mode) + :config + (setq markdown-header-scaling t + markdown-hide-markup t + markdown-fontify-code-blocks-natively t)) + +(use-package! grip-mode + :bind (:map markdown-mode-command-map + ("g" . grip-mode))) + +(use-package! elfeed + :hook (elfeed-search-mode . elfeed-update) + :bind ("C-x w" . elfeed) + :config + (setq elfeed-search-filter "@2-weeks-ago +unread" + elfeed-db-directory (concat org-directory "elfeed/db/") + elfeed-enclosure-default-dir (concat org-directory "elfeed/enclosures/")) + (make-directory elfeed-db-directory t)) diff --git a/doom.d/config.org b/doom.d/config.org new file mode 100644 index 0000000..fa459de --- /dev/null +++ b/doom.d/config.org @@ -0,0 +1,387 @@ +#+title: Nathan's Doom Emacs Configuration +#+author: Nathan McCarty +#+PROPERTY: header-args:emacs-lisp :tangle yes + +My doom emacs configuration + +* Basic Doom stuff + +The provided default ~config.el~ + +#+begin_src emacs-lisp +;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- + +;; Place your private configuration here! Remember, you do not need to run 'doom +;; sync' after modifying this file! + + +;; Some functionality uses this to identify you, e.g. GPG configuration, email +;; clients, file templates and snippets. It is optional. +(setq user-full-name "Nathan McCarty" + user-mail-address "nathan@mccarty.io") + +;; Doom exposes five (optional) variables for controlling fonts in Doom: +;; +;; - `doom-font' -- the primary font to use +;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) +;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for +;; presentations or streaming. +;; - `doom-unicode-font' -- for unicode glyphs +;; - `doom-serif-font' -- for the `fixed-pitch-serif' face +;; +;; See 'C-h v doom-font' for documentation and more examples of what they +;; accept. For example: +;; +(setq doom-font (font-spec :family "FiraCode Nerd Font" :size 11 :weight 'semi-light) + doom-variable-pitch-font (font-spec :family "Fira Sans" :size 15)) +;; +;; If you or Emacs can't find your font, use 'M-x describe-font' to look them +;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to +;; refresh your font settings. If Emacs still can't find your font, it likely +;; wasn't installed correctly. Font issues are rarely Doom issues! + +;; There are two ways to load a theme. Both assume the theme is installed and +;; available. You can either set `doom-theme' or manually load a theme with the +;; `load-theme' function. This is the default: +;; (setq doom-theme 'doom-solarized-dark) +(use-package! solarized-theme + :demand t + :config + (setq solarized-distinct-fringe-background t + solarized-distinct-doc-face t + solarized-scale-markdown-headlines t + solarized-scale-org-headlines t) + (load-theme 'solarized-selenized-dark t)) + +;; This determines the style of line numbers in effect. If set to `nil', line +;; numbers are disabled. For relative line numbers, set this to `relative'. +(setq display-line-numbers-type t) + +;; If you use `org' and don't want your org files in the default location below, +;; change `org-directory'. It must be set before org loads! +(setq org-directory "~/Org/") + + +;; Whenever you reconfigure a package, make sure to wrap your config in an +;; `after!' block, otherwise Doom's defaults may override your settings. E.g. +;; +;; (after! PACKAGE +;; (setq x y)) +;; +;; The exceptions to this rule: +;; +;; - Setting file/directory variables (like `org-directory') +;; - Setting variables which explicitly tell you to set them before their +;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). +;; - Setting doom variables (which start with 'doom-' or '+'). +;; +;; Here are some additional functions/macros that will help you configure Doom. +;; +;; - `load!' for loading external *.el files relative to this one +;; - `use-package!' for configuring packages +;; - `after!' for running code after a package has loaded +;; - `add-load-path!' for adding directories to the `load-path', relative to +;; this file. Emacs searches the `load-path' when you load packages with +;; `require' or `use-package'. +;; - `map!' for binding new keys +;; +;; To get information about any of these functions/macros, move the cursor over +;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). +;; This will open documentation for it, including demos of how they are used. +;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, +;; etc). +;; +;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how +;; they are implemented. +#+end_src +* Appearance and UI +** Centaur tabs +#+begin_src emacs-lisp +(after! centaur-tabs + (setq centaur-tabs-set-icons t + centaur-tabs-set-bar 'underflow + centaur-tabs-style "alternate") + (centaur-tabs-headline-match) + (centaur-tabs-group-by-projectile-project)) +#+end_src +** Mixed Pitch Mode +Use mixed pitch mode in prose writing modes, to make the writing experience a bit more pleasant. +This tweak applies to: +- ~org-mode~ +- ~markdown-mode~ +#+begin_src emacs-lisp +(use-package! mixed-pitch + :hook + (org-mode . mixed-pitch-mode) + (markdown-mode . mixed-pitch-mode) + :config + (setq mixed-pitch-set-height t)) +#+end_src + +Setting ~mixed-pitch-set-height~ is required to get ~mixed-pitch-mode~ to render fonts with the correct size in doom emacs, apparently. +* Basic Editing +** Navigation +*** Avy +More modern ace-jump-mode + +Set up our key bindings +#+begin_src emacs-lisp +(after! avy + (define-key! + "C-:" 'avy-goto-char + "C-'" 'avy-goto-char-2 + "M-g f" 'avy-goto-line + "M-g w" 'avy-goto-word-1 + "M-g e" 'avy-goto-word-0) + (cheatsheet-add-group 'Avy + '(:key "C-:" :description "Goto Char") + '(:key "C-'" :description "Goto Char (2)") + '(:key "M-g f" :description "Goto line") + '(:key "M-g w" :description "Goto word") + '(:key "M-g e" :description "Goto word (0)"))) + +#+end_src +*** Swiper +Better isearch + +Override old isearch +#+begin_src emacs-lisp +(after! swiper + (define-key! "C-s" 'swiper)) +#+end_src +** Crux +Smarter replacements for emacs built ins, with the following in use: + - ~crux-smart-kill-line~ - Smart ~C-k~ replacement + - ~crux-top-join-line~ - ~C-c ^~ Join two lines + +#+begin_src emacs-lisp +(use-package! crux + :bind (("C-k" . crux-smart-kill-line) + ("C-c ^" . crux-top-join-line))) +#+end_src +** string-inflection +Automatically cycle case of names +#+begin_src emacs-lisp +(global-unset-key (kbd "C-q")) +(use-package! string-inflection + :bind (("C-q" . string-inflection-all-cycle))) +(cheatsheet-add-group 'string-inflection + '(:key "C-q" :description "Rotate case")) +#+end_src +** Smart Hungry Delete +Gobble up whitespace in a smarter way +#+begin_src emacs-lisp +(use-package! smart-hungry-delete + :bind (("M-" . smart-hungry-delete-backward-char))) +#+end_src +** Search +*** Deadgrep +Ripgrep, but from within emacs +#+begin_src emacs-lisp +(use-package! deadgrep + :bind ("C-c s r" . deadgrep)) +#+end_src +* Org Mode +Improvements to the best mode in emacs + +Setup some basic cosmetic improvements + - Disable showing of emphasis markers + - Show entities as utf-8 ~test~ + + #+begin_src emacs-lisp +(setq org-hide-emphasis-markers t + org-pretty-entities t) + #+end_src + + Setup font lock for normal (non-heading) list items, to make things a bit more pleasnt to look at + + #+begin_src emacs-lisp +(font-lock-add-keywords 'org-mode + '(("^ *\\([-]\\) " + 0 (prog1 () (compose-region (match-beginning 1) (match-end 1) ""))) + ("^ *\\([+]\\) " + 0 (prog1 () (compose-region (match-beginning 1) (match-end 1) ""))))) + #+end_src +** org-roam +A second brain in emacs + + +Here we: + - Set the roam directory to be a sub-directory of the org directory, which I have in syncthing + - Use a more informative display template, as we use ivy + - Turn on db autosync + - Setup dalies to add the time of the capture to the note +#+begin_src emacs-lisp +(use-package! org-roam + :custom + (org-roam-directory (concat org-directory "Roam/")) + (org-roam-complete-everywhere t) + :bind (("C-c r l" . org-roam-buffer-toggle) + ("C-c r f" . org-roam-node-find) + ("C-c r g" . org-roam-graph) + ("C-c r i" . org-roam-node-insert) + ("C-c r c" . org-roam-capture) + ("C-c r T" . org-roam-dailies-capture-today) + ("C-c r t" . org-roam-dailies-goto-today) + :map org-mode-map + ("C-M-i" . completion-at-point)) + :config + (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) + (org-roam-db-autosync-mode) + (setq org-roam-dailies-capture-templates + '(("d" "default" entry "* %<%I:%M %p>: %?" + :if-new (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n"))))) +#+end_src +* General Modes +** Magit +Further configuration for magit +*** magit-todos +Count the number of todos in the project in the ~magit-status~ buffer +#+begin_src emacs-lisp +(use-package! magit-todos + :hook (magit-mode . magit-todos-mode)) +#+end_src +*** magit-delta +Use delta for git diff display +#+begin_src emacs-lisp +(use-package! magit-delta + :hook (magit-mode . magit-delta-mode)) +#+end_src +*** magit-wip-mode +Stash autosaves inside of git +#+begin_src emacs-lisp +(magit-wip-mode) +#+end_src +** System integration +Various tools for interacting with the system from within emacs +*** Terminal +Doom already provides pretty nice vterm support, but lets take us a step further, using ~multi-vterm~ to provide ergonomic support for multiple terminals. + +Vterm really doesn't like being installed through emacs on nix, so proper support for it in my setup requires installing it through nix like so: +#+begin_src nix :tangle no +let emacsPackage = (emacsPackagesFor emacs).emacsWithPackages (epgks: with epkgs; [ + vterm + ]); +in +{ + environment.systemPackages = [ + emacsPackage + ]; +} +#+end_src +**** [[https://github.com/suonlight/multi-vterm][multi-vterm]] +Add ergonomic support for multiple vterm terminals +#+begin_src emacs-lisp +(use-package! multi-vterm + :bind (("C-c o M" . multi-vterm) + ("C-c o m" . multi-vterm-project))) +#+end_src +* Programming +** General Editing +*** Sepraedit +Edit indirect for comments + +Set the default mode to github flavored markdown, turn on smart use of fill column, and bind to the normal edit-indirect keybinding. +#+begin_src emacs-lisp +(use-package! separedit + :bind + (:map prog-mode-map + ("C-c '" . separedit)) + :config + (setq separedit-default-mode 'gfm-mode + separedit-continue-fill-column t)) +#+end_src +** LSP Mode +Custom configuration for lsp-mode +*** LSP UI +Turn on the UI features we want +**** Sideline +Show as much as possible in the sideline +#+begin_src emacs-lisp +(after! lsp-ui + (setq lsp-ui-sideline-show-diagnostics t + lsp-ui-sideline-show-hover t + lsp-ui-sideline-show-code-actions t)) +#+end_src +**** Peeking +Turn on peeking, and show us the directory as well +#+begin_src emacs-lisp +(after! lsp-ui + (setq lsp-ui-peek-enable t + lsp-ui-peek-show-directory t)) +#+end_src +**** Documentation +Show the documentation in a popup frame in the top right corner +#+begin_src emacs-lisp +(after! lsp-ui + (setq lsp-ui-doc-enable t + lsp-ui-doc-position 'top + lsp-ui-doc-show-with-cursor t)) +#+end_src +** Rust +Configuration specific for rust +*** LSP Tweaks +Most of these are defaults, but I like having them explicit for my sanity + +#+begin_src emacs-lisp +(after! lsp-mode + (setq lsp-auto-configure t + lsp-lens-enable t + lsp-rust-analyzer-cargo-watch-command "clippy" + lsp-rust-analyzer-cargo-watch-args ["--all-features"] + lsp-rust-analyzer-experimental-proc-attr-macros t + lsp-rust-analyzer-proc-macro-enable t + lsp-rust-analyzer-use-rustc-wrapper-for-build-scripts t + lsp-rust-analyzer-import-enforce-granularity t)) +#+end_src +* Composition +Modes for handling plain text and prose +** Markdown +Everybody's favorite markup format +*** Markdown mode +Make the following configuration tweaks to result in a better markdown experience: + - Use a variable pitch font (this is prose after all) + - Turn on header scaling + - Default to gfm mode for readmes + - Turn on auto-fill mode + - Hide mark up + - Fontify code blocks with the language's native mode + +The goal here is to create a more pretty and fluid composition environment for prose, closer to what you would get in a word processor, but without the horrors of wysiwyg. + +#+begin_src emacs-lisp +(use-package! markdown-mode + :mode ("README\\.md" . gfm-mode) + :hook (markdown-mode . variable-pitch-mode) + (markdown-mode . auto-fill-mode) + :config + (setq markdown-header-scaling t + markdown-hide-markup t + markdown-fontify-code-blocks-natively t)) +#+end_src +*** Grip mode +Provide a live, rendered preview when editing markdown readmes using [[https://github.com/joeyespo/grip][grip]]. +#+begin_src emacs-lisp +(use-package! grip-mode + :bind (:map markdown-mode-command-map + ("g" . grip-mode))) +#+end_src +* Applications +Emacs is good for more than just editing text +** RSS +Use ~elfeed~ for RSS. Doom provides most of the configuration, but we'll make a few minor tweaks: + - Automatically update the feed when opening elfeed + - Set default filter to only show unread posts + - Put the elfeed directory in the org dir (I have it in syncthing) + - Create a global keybinding for elfeed (~C-x w~) + +#+begin_src emacs-lisp +(use-package! elfeed + :hook (elfeed-search-mode . elfeed-update) + :bind ("C-x w" . elfeed) + :config + (setq elfeed-search-filter "@2-weeks-ago +unread" + elfeed-db-directory (concat org-directory "elfeed/db/") + elfeed-enclosure-default-dir (concat org-directory "elfeed/enclosures/")) + (make-directory elfeed-db-directory t)) +#+end_src diff --git a/doom.d/init.el b/doom.d/init.el index ff8b08a..b3e391f 100644 --- a/doom.d/init.el +++ b/doom.d/init.el @@ -14,165 +14,79 @@ ;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its ;; directory (for easy access to its source code). -(doom! :input - ;;chinese - ;;japanese - ;;layout ; auie,ctsrnm is the superior home row - - :completion - company ; the ultimate code completion backend - ;;helm ; the *other* search engine for love and life - ;;ido ; the other *other* search engine... - ;;ivy ; a search engine for love and life - vertico ; the search engine of the future +(doom! :completion + company ; the ultimate code completion backend + (ivy +fuzzy +precient +childframe +icons) :ui - ;;deft ; notational velocity for Emacs - doom ; what makes DOOM look the way it does - doom-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 - ;;hydra - 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 + doom ; what makes DOOM look the way it does + doom-dashboard ; a nifty splash screen for Emacs + (emoji +unicode +github) ; 🙂 + hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + indent-guides ; highlighted indent columns + ;;(ligatures +fira) ; ligatures and symbols to make your code pretty again + modeline ; snazzy, Atom-inspired modeline, plus API + nav-flash ; blink cursor line after big motions + ;; ophints ; highlight the region an operation acts on (popup +defaults) ; tame sudden yet inevitable temporary windows - tabs ; a tab bar for Emacs - treemacs ; a project drawer, like neotree but cooler - unicode ; extended unicode support for various languages - vc-gutter ; 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 + tabs ; a tab bar for Emacs + (treemacs +lsp) ; a project drawer, like neotree but cooler + unicode ; extended unicode support for various languages + 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 - word-wrap ; soft wrapping with language-aware indent + file-templates ; auto-snippets for empty files + fold ; (nigh) universal code folding + (format +onsave) ; automated prettiness + ;; multiple-cursors ; editing in many places at once + rotate-text ; cycle region at point between text candidates + snippets ; my elves. They type so I don't have to + word-wrap ; soft wrapping with language-aware indent :emacs - dired ; making dired pretty [functional] + (dired +icons) ; making dired pretty [functional] electric ; smarter, keyword-based electric-indent - ibuffer ; interactive buffer management + (ibuffer +icons) ; interactive buffer management 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 ; the best terminal emulation in Emacs + vterm ; 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 + (syntax +childframe) ; tasing you for every semicolon you forget + (spell +flyspell +hunspell +everywhere) ; tasing you for misspelling mispelling :tools - ;;ansible - biblio ; Writes a PhD for you (citation needed) - ;;debugger ; FIXME stepping through code, to help you add bugs + (debugger +lsp) ; FIXME 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 + docker + editorconfig ; let someone else argue about tabs vs spaces (eval +overlay) ; run code, run (also, repls) - gist ; interacting with github gists lookup ; navigate your code and its documentation - lsp ; M-x vscode - magit ; a git porcelain for Emacs - ;;make ; run make tasks from Emacs - ;;pass ; password manager for nerds - pdf ; pdf enhancements - ;;prodigy ; FIXME managing external services & code builders - rgb ; creating color strings - ;;taskrunner ; taskrunner for all your projects - ;;terraform ; infrastructure as code - ;;tmux ; an API for interacting with tmux - ;;upload ; map local to remote projects via ssh/ftp + lsp ; M-x vscode + (magit +forge) ; a git porcelain for Emacs + pdf ; pdf enhancements + rgb ; creating color strings :os (:if IS-MAC macos) ; improve compatibility with macOS - ;;tty ; improve the terminal Emacs experience :lang - ;;agda ; 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 - ;;(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 - org ; organize your plain life in plain text - ;;php ; perl's insecure younger brother - ;;plantuml ; diagrams for confusing people 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 ; Fe2O3.unwrap().unwrap().unwrap().unwrap() - ;;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 + data ; config/data formats + emacs-lisp ; drown in parentheses + json ; At least it ain't XML + (latex +fold) ; writing papers in Emacs has never been so fun + markdown ; writing docs for people to ignore + nix ; I hereby declare "nix geht mehr!" + (org +pandoc +present +pretty +roam2 +pomodoro) ; organize your plain life in plain text + raku ; the artist formerly known as perl6 + rest ; Emacs as a REST client + (rust +lsp) + (sh +fish) ; she sells {ba,z,fi}sh shells on the C xor + yaml ; JSON, but readable :email ;;(mu4e +org +gmail) @@ -184,9 +98,11 @@ ;;emms ;;everywhere ; *leave* Emacs!? You must be joking ;;irc ; how neckbeards socialize - ;;(rss +org) ; emacs as an RSS reader + (rss +org) ; emacs as an RSS reader ;;twitter ; twitter client https://twitter.com/vnought :config - ;;literate + literate (default +bindings +smartparens)) + +(add-hook! 'emacs-startup-hook #'doom-init-ui-h) diff --git a/doom.d/packages.el b/doom.d/packages.el index b80e9cc..983f723 100644 --- a/doom.d/packages.el +++ b/doom.d/packages.el @@ -48,3 +48,15 @@ ;(unpin! pinned-package another-pinned-package) ;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) ;(unpin! t) + +(package! avy) +(package! cheatsheet) +(package! separedit) +(package! magit-delta) +(package! crux) +(package! string-inflection) +(package! smart-hungry-delete) +(package! solarized-theme) +(package! deadgrep) +(package! multi-vterm) +(package! grip-mode)