:DOC-CONFIG: # tangle to config.el #+property: header-args:emacs-lisp :tangle config.el #+property: header-args: mkdirp yes :comments no #+startup: fold :END: #+TITLE: PWL Doom Config #+AUTHOR: PWL #+EMAIL: paul@gve-loedige.de #+OPTIONS: toc:2 * Table of Contents :toc: - [[#config-file-headers][Config File Headers]] - [[#initel][init.el]] - [[#packagesel][packages.el]] - [[#configel][config.el]] - [[#doom-modules][Doom Modules]] - [[#general-configuration][General Configuration]] - [[#user-information][User Information]] - [[#visual-settings][Visual Settings]] - [[#authentication][Authentication]] - [[#multilanguage-spellcheck][Multilanguage Spellcheck]] - [[#latex][LaTeX]] - [[#set-pdf-viewer][Set PDF Viewer]] - [[#add-auto-compile-hook-for-tex-mode][Add auto-compile hook for TeX mode]] - [[#org-mode][Org Mode]] - [[#default-location][Default Location]] - [[#enable-header-numbering][Enable Header Numbering]] - [[#setup][Setup]] - [[#caldav-sync][CalDAV Sync]] - [[#org-roam][Org Roam]] * Config File Headers We start by simply defining the standard headers used by the three files. These headers come from the initial files generated by =doom install=, and contain either some Emacs-LISP relevant indicators like =lexical-binding=, or instructions about the contents of the file. ** init.el #+html:
init.el #+begin_src emacs-lisp :tangle init.el ;;; init.el -*- lexical-binding: t; -*- ;; DO NOT EDIT THIS FILE DIRECTLY ;; This is a file generated from a literate programing source file ;; You should make any changes there and regenerate it from Emacs org-mode ;; using org-babel-tangle (C-c C-v t) ;; This file controls what Doom modules are enabled and what order they load ;; in. Remember to run 'doom sync' after modifying it! ;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's ;; documentation. There you'll find a "Module Index" link where you'll find ;; a comprehensive list of Doom's modules and what flags they support. ;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or ;; 'C-c c k' for non-vim users) to view its documentation. This works on ;; flags as well (those symbols that start with a plus). ;; ;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its ;; directory (for easy access to its source code). #+end_src #+html:
** packages.el #+html:
packages.el #+begin_src emacs-lisp :tangle packages.el ;; -*- no-byte-compile: t; -*- ;;; $DOOMDIR/packages.el ;; DO NOT EDIT THIS FILE DIRECTLY ;; This is a file generated from a literate programing source file ;; You should make any changes there and regenerate it from Emacs org-mode ;; using org-babel-tangle (C-c C-v t) ;; To install a package with Doom you must declare them here and run 'doom sync' ;; on the command line, then restart Emacs for the changes to take effect -- or ;; use 'M-x doom/reload'. ;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: ;;(package! some-package) ;; To install a package directly from a remote git repo, you must specify a ;; `:recipe'. You'll find documentation on what `:recipe' accepts here: ;; https://github.com/raxod502/straight.el#the-recipe-format ;;(package! another-package ;; :recipe (:host github :repo "username/repo")) ;; If the package you are trying to install does not contain a PACKAGENAME.el ;; file, or is located in a subdirectory of the repo, you'll need to specify ;; `:files' in the `:recipe': ;;(package! this-package ;; :recipe (:host github :repo "username/repo" ;; :files ("some-file.el" "src/lisp/*.el"))) ;; If you'd like to disable a package included with Doom, you can do so here ;; with the `:disable' property: ;;(package! builtin-package :disable t) ;; You can override the recipe of a built in package without having to specify ;; all the properties for `:recipe'. These will inherit the rest of its recipe ;; from Doom or MELPA/ELPA/Emacsmirror: ;;(package! builtin-package :recipe (:nonrecursive t)) ;;(package! builtin-package-2 :recipe (:repo "myfork/package")) ;; Specify a `:branch' to install a package from a particular branch or tag. ;; This is required for some packages whose default branch isn't 'master' (which ;; our package manager can't deal with; see raxod502/straight.el#279) ;;(package! builtin-package :recipe (:branch "develop")) ;; Use `:pin' to specify a particular commit to install. ;;(package! builtin-package :pin "1a2b3c4d5e") ;; Doom's packages are pinned to a specific commit and updated from release to ;; release. The `unpin!' macro allows you to unpin single packages... ;;(unpin! pinned-package) ;; ...or multiple packages ;;(unpin! pinned-package another-pinned-package) ;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) ;;(unpin! t) #+end_src #+html:
** config.el #+html:
config.el #+begin_src emacs-lisp :tangle config.el ;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- ;; DO NOT EDIT THIS FILE DIRECTLY ;; This is a file generated from a literate programing source file ;; You should make any changes there and regenerate it from Emacs org-mode ;; using org-babel-tangle (C-c C-v 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. ;; (setq user-full-name "John Doe" ;; user-mail-address "john@doe.com") ;; Doom exposes five (optional) variables for controlling fonts in Doom. Here ;; are the three important ones: ;; ;; + `doom-font' ;; + `doom-variable-pitch-font' ;; + `doom-big-font' -- used for `doom-big-font-mode'; use this for ;; presentations or streaming. ;; ;; They all accept either a font-spec, font string ("Input Mono-12"), or xlfd ;; font string. You generally only need these two: ;; (setq doom-font (font-spec :family "monospace" :size 12 :weight 'semi-light) ;; doom-variable-pitch-font (font-spec :family "sans" :size 13)) ;; 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) ;; 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/") ;; 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) ;; Here are some additional functions/macros that could 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. ;; ;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how ;; they are implemented. #+end_src #+html:
* Doom Modules #+begin_src emacs-lisp :tangle init.el (doom! :input ;;bidi ; (tfel ot) thgir etirw uoy gnipleh ;;chinese ;;japanese ;;layout ; auie,ctsrnm is the superior home row :completion company ; the ultimate code completion backend ;;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 :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 (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 +pretty) ; vcs diff in the fringe vi-tilde-fringe ; fringe tildes to mark beyond EOB ;;window-select ; visually switch windows workspaces ; tab emulation, persistence & separate workspaces ;;zen ; distraction-free coding or writing :editor (evil +everywhere); come to the dark side, we have cookies file-templates ; auto-snippets for empty files fold ; (nigh) universal code folding ;;(format +onsave) ; automated prettiness ;;god ; run Emacs commands without modifier keys ;;lispy ; vim for lisp, for people who don't like vim ;;multiple-cursors ; editing in many places at once ;;objed ; text object editing for the innocent ;;parinfer ; turn lisp into python, sort of ;;rotate-text ; cycle region at point between text candidates snippets ; my elves. They type so I don't have to ;;word-wrap ; soft wrapping with language-aware indent :emacs dired ; making dired pretty [functional] electric ; smarter, keyword-based electric-indent ;;ibuffer ; 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 :checkers syntax ; tasing you for every semicolon you forget (spell +flyspell +everywhere) ; tasing you for misspelling mispelling grammar ; tasing grammar mistake every you make :tools ;;ansible ;;biblio ; Writes a PhD for you (citation needed) ;;collab ; buffers with friends ;;debugger ; 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 (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 ;;tree-sitter ; syntax and parsing, sitting in a tree... ;;upload ; map local to remote projects via ssh/ftp :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 +fold +latexmk +lsp) ; 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 +roam2 +dragndrop +pretty) ; 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 +lsp) ; 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 :email ;;(mu4e +org +gmail) ;;notmuch ;;(wanderlust +gmail) :app calendar ;;emms ;;everywhere ; *leave* Emacs!? You must be joking ;;irc ; how neckbeards socialize ;;(rss +org) ; emacs as an RSS reader ;;twitter ; twitter client https://twitter.com/vnought :config literate (default +bindings +smartparens)) #+end_src * General Configuration ** User Information #+begin_src emacs-lisp :tangle config.el (setq user-full-name "Paul Lödige" user-mail-address "paul@gve-loedige.de") #+end_src ** Visual Settings *** Font #+begin_src emacs-lisp :tangle config.el (setq doom-font (font-spec :family "Ubuntu Mono" :size 16) doom-variable-pitch-font (font-spec :family "Ubuntu" :size 14)) #+end_src *** Theme I like the [[https://github.com/Greduan/emacs-theme-gruvbox][Gruvbox Theme by Eduardo Lavaque]]. For this we first need to install the specific package #+begin_src emacs-lisp :tangle packages.el (package! gruvbox-theme) #+end_src and then set it #+begin_src emacs-lisp :tangle config.el (setq doom-theme 'gruvbox-dark-hard) #+end_src *** Line Numbering having used Neovim for quiet some time I got used to relative line numbering for navigation. Until I get used to the [[https://github.com/Greduan/emacs-theme-gruvbox][evil-snipe]] navigation I would like to keep them. #+begin_src emacs-lisp :tangle config.el (setq display-line-numbers-type 'relative) #+end_src ** Authentication Authentication information will be stored in a encrypted file that is part of my dotfiles #+begin_src emacs-lisp :tangle config.el (setq auth-sources '((:source "~/.config/doom/.authinfo.gpg"))) #+end_src * Multilanguage Spellcheck Enables use of multiple dictionaries. In my case German and English #+begin_src emacs-lisp :tangle config.el (with-eval-after-load "ispell" (setq ispell-program-name "hunspell") (setq ispell-dictionary "en_US,de_DE") (ispell-set-spellchecker-params) (ispell-hunspell-add-multi-dic "en_US,de_DE")) #+end_src * LaTeX ** Set PDF Viewer #+begin_src emacs-lisp :tangle config.el (setq +latex-viewers '(zathura)) #+end_src ** Add auto-compile hook for TeX mode Because TeX-command-run-all is an interactive command we need a helper function for the hook. This function could also become useful if we ever want to extend the compile command #+begin_src emacs-lisp :tangle config.el (defun custom-tex-compile () (interactive) (TeX-command-run-all nil)) (add-hook 'TeX-mode-hook (lambda () (add-hook 'after-save-hook #'custom-tex-compile nil t))) #+end_src #+RESULTS: * Org Mode ** Default Location #+begin_src emacs-lisp :tangle config.el (setq org-directory "~/org/") #+end_src ** Enable Header Numbering #+begin_src emacs-lisp :tangle config.el (setq org-startup-numerated t) #+end_src ** ToDo Setup *** Progress States To get a more nuanced overview of my current TODOs I add more progress states. | | TODO | BLOCKED | IN_PROGRESS | REVIEW | TESTING | | DONE | DELEGATED | CANCELED | |------------+------+---------+-------------+--------+---------+---+------+-----------+----------| | Access Key | t | b | i | r | t | | d | | c | | Log Type | time | note | time | note | note | | time | note | note | #+begin_src emacs-lisp :tangle config.el (setq org-todo-keywords '((sequence "TODO(t!)" "IN_PROGRESS(i!)" "BLOCKED(b@)" "REVIEW(r@)" "TESTING(t@)" "|" "DONE(d!)" "DELEGATED(!)" "CANCELED(c@)"))) #+end_src *** Add "~/org" to Agenda #+begin_src emacs-lisp :tangle config.el (after! org (setq org-agenda-files (f-files "~/org" (lambda (f) (string= (f-ext f) "org")) 'recursive))) #+end_src ** CalDAV Sync [[https://github.com/dengste/org-caldav][org-caldav]] provides a tool for syncing with a CalDAV server (in my case Nextcloud). A lot of the config is also taken from [[https://www.reddit.com/r/orgmode/comments/8rl8ep/comment/e0sb5j0/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button][this]] reddit post. *** org-caldav installation #+begin_src emacs-lisp :tangle packages.el (package! org-caldav) #+end_src *** configure calendars add the calendars to the org-caldav config #+begin_src emacs-lisp :tangle config.el (after! org-caldav (setq org-caldav-url "https://cloud.ploedige.com/remote.php/dav/calendars/paul-loedige") (setq org-caldav-calendars '((:calendar-id "org-test" :files ("~/org/calendars/org_test.org") :inbox "~/org/calendars/org_test.org")))) #+end_src *** enable TODOs #+begin_src emacs-lisp :tangle config.el (after! org-caldav (setq org-icalendar-include-todo 'all org-caldav-sync-todo t)) #+end_src ** Org Roam *** set base directory Both the org files themselves and the database should be located in the same directory to enable syncing via Nextcloud #+begin_src emacs-lisp :tangle config.el (after! org (setq org-roam-directory (file-truename "~/org/org-roam")) (setq org-roam-db-location "~/org/org-roam/org-roam.db") (org-roam-db-autosync-mode)) #+end_src