#+title: Doom Literate Config #+author: Preston Pan #+date: <2023-06-09 Fri> #+description: My doom emacs configuration #+html_head: * config.el Configuration This is a doom emacs configuration. If you are not using doom emacs, do not use this document. ** Basic Information My name, and the org mode directory on my computer, as well as basic editor configuration options. Below is the old documentation. #+begin_src emacs-lisp :tangle yes (setq user-full-name "Preston Pan" user-mail-address "prseton@nullring.xyz") (setq display-line-numbers-type t) (setq org-directory "~/org/") #+end_src - `load!' for loading external *.el files relative to this one - `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'. ** Font Now we configure fonts: #+begin_src emacs-lisp :tangle yes (setq doom-font (font-spec :family "FiraCode Nerd Font" :size 14 :weight 'semi-light) doom-variable-pitch-font (font-spec :family "Fira Sans" :size 14) doom-unicode-font (font-spec :family "Symbola" :size 14) doom-serif-font (font-spec :family "Fira Sans" :size 14) doom-big-font (font-spec :family "FiraCode Nerd Font" :size 28)) #+end_src ** Color Scheme I'm using the catppuccin theme, which is available on github. #+begin_src emacs-lisp :tangle yes (setq doom-theme 'catppuccin) (setq catppuccin-flavor 'mocha) #+end_src ** Doom Module and Programs Configuration *** IRC Set up circe to connect to my bouncer: #+begin_src emacs-lisp :tangle yes (after! circe (set-irc-server! "nullring.xyz" `(:tls t :port 4095 :nick "LiCoO2/AndreiNet" :user "LiCoO2/AndreiNet" :pass ,(+pass-get-secret "ZNC")))) #+end_src *** Email In order to use this configuration, you must install and configure mu and mbsync. #+begin_src emacs-lisp :tangle yes (setq mu4e-get-mail-command "mbsync --config ~/.config/doom/mbsyncrc prestonpan") (setq send-mail-function 'smtpmail-send-it) (setq smtpmail-smtp-server "mail.nullring.xyz") (setq smtpmail-smtp-service 465) (setq smtpmail-stream-type 'ssl) (setq mu4e-drafts-folder "/Drafts") (setq mu4e-sent-folder "/Sent") (setq mu4e-trash-folder "/Trash") (setq mu4e-html2text-command "w3m -T text/html" mu4e-update-interval 300 mu4e-headers-auto-update t mu4e-view-show-images t mu4e-compose-signature-auto-include nil mu4e-use-fancy-chars t) (setq mu4e-compose-reply-ignore-address '("no-?reply" "preston@nullring.xyz")) #+end_src *** RSS We need to set up elfeed with a list of rss feeds. #+begin_src emacs-lisp :tangle yes (after! elfeed (setq elfeed-search-filter "@1-month-ago +unread")) (add-hook! 'elfeed-search-mode-hook #'elfeed-update) (setq rmh-elfeed-org-files '("~/org/elfeed.org")) #+end_src *** Music In order to use this configuration, you must have mpd configured to use the same directory. We automatically connect to mpd. #+begin_src emacs-lisp :tangle yes (setq emms-player-mpd-music-directory "~/music/") (setq emms-player-list '(emms-player-mpd)) (emms-player-mpd-connect) #+end_src *** Journal First we set the journal to be in the website directory: #+begin_src emacs-lisp :tangle yes (setq org-journal-dir "~/org/website/journal/") (setq org-journal-date-format "%A, %d %B %Y") #+end_src And then we add the headers needed to export the journal automatically: #+begin_src emacs-lisp :tangle yes (defun org-journal-file-header-func (time) "Custom function to create journal header." (concat (pcase org-journal-file-type (`daily "#+TITLE: Daily Journal\n#+STARTUP: showeverything\n#+DESCRIPTION: My daily journal entry\n#+AUTHOR: Preston Pan\n#+HTML_HEAD: \n#+html_head: \n#+html_head: \n#+options: broken-links:t") (`weekly "#+TITLE: Weekly Journal\n#+STARTUP: folded") (`monthly "#+TITLE: Monthly Journal\n#+STARTUP: folded") (`yearly "#+TITLE: Yearly Journal\n#+STARTUP: folded")))) (setq org-journal-file-header 'org-journal-file-header-func) (setq org-journal-file-format "%Y%m%d.org") #+end_src *** Brain #+begin_src emacs-lisp :tangle yes (setq org-brain-path "~/org/website/brain/") #+end_src *** Roam #+begin_src emacs-lisp :tangle yes (setq org-roam-directory (file-truename "~/org/website/mindmap")) (setq org-roam-capture-templates '(("d" "default" plain "%?" :target (file+head "${title}.org" "#+title: ${title}\n#+author: Preston Pan\n#+html_head: \n#+html_head: \n#+html_head: \n#+options: broken-links:t") :unnarrowed t))) #+end_src *** Publishing #+begin_src emacs-lisp :tangle yes (require 'ox-publish) (setq org-publish-project-alist '(("website-org" :base-directory "~/org/website" :base-extension "org" :publishing-directory "~/website_html" :recursive t :publishing-function org-html-publish-to-html :headline-levels 4 :auto-preamble t) ("website-static" :base-directory "~/org/website" :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" :publishing-directory "~/website_html/" :recursive t :publishing-function org-publish-attachment) ("website" :components ("website-org" "website-static")))) #+end_src ** Keybindings Now we set up our keybindings for our applications: #+begin_src emacs-lisp :tangle yes (map! :leader :desc "Open irc" "i c" #'circe) (map! :leader :desc "Open audio manager" "m m" #'emms) (map! :leader :desc "Open RSS feed reader" "r s" #'elfeed) (map! :leader :desc "Open password manager" "p w" #'ivy-pass) #+end_src ** External Packages we want to include some packages that don't come with doom emacs. *** KBD-Mode kbd-mode allows us to edit kmonad kbd files with syntax highlighting: #+begin_src emacs-lisp :tangle yes (use-package! kbd-mode) #+end_src *** Pinentry We now set up pinentry for the pass program. We need to set the mode to loopback in order to enable emacs to start itself as a pinentry program, and we need to allow loopbacks in gpg-agent.conf. #+begin_src emacs-lisp :tangle yes (use-package! pinentry :init (setq epa-pinentry-mode `loopback) (pinentry-start)) #+end_src * packages.el Configuration These are some external packages that I use that are not provided by doom modules. #+begin_src emacs-lisp :tangle packages.el (package! pinentry) (package! kbd-mode :recipe (:host github :repo "kmonad/kbd-mode")) (package! nasm-mode) #+end_src * init.el Configuration This installs all the doom modules that we are going to be configuring: #+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 ;;helm ; the *other* search engine for love and life ;;ido ; the other *other* search engine... (ivy +icons +fuzzy) vertico :ui ;;deft ; notational velocity for Emacs doom doom-dashboard doom-quit (emoji +unicode) hl-todo hydra indent-guides (ligatures +extra +fira) minimap modeline ;;nav-flash ; blink cursor line after big motions ;;neotree ; a project drawer, like NERDTree for vim ophints (popup +defaults) tabs treemacs unicode (vc-gutter +pretty) vi-tilde-fringe window-select workspaces zen :editor (evil +everywhere) file-templates fold (format +onsave) ;;god ; run Emacs commands without modifier keys lispy ;;multiple-cursors ; editing in many places at once ;;objed ; text object editing for the innocent parinfer ;;rotate-text ; cycle region at point between text candidates snippets word-wrap :emacs dired electric (ibuffer +icons) undo vc :term ;;eshell ; the elisp shell that works everywhere ;;shell ; simple shell REPL for Emacs ;; term ; basic terminal emulator for Emacs vterm :checkers syntax (spell +flyspell) grammar :tools ;;ansible ;;biblio ; Writes a PhD for you (citation needed) (debugger +lsp) ;;direnv ;;docker editorconfig ein (eval +overlay) gist lookup lsp magit make pass pdf ;;prodigy ; FIXME managing external services & code builders rgb ;;taskrunner ; taskrunner for all your projects ;;terraform ; infrastructure as code tmux tree-sitter ;;upload ; map local to remote projects via ssh/ftp :os (:if IS-MAC macos) tty :lang ;;agda ; types of types of types of types... ;;beancount ; mind the GAAP (cc +lsp) ;;clojure ; java with a lisp common-lisp ;;coq ; proofs-as-programs ;;crystal ; ruby at the speed of c ;;csharp ; unity, .NET, and mono shenanigans data ;;(dart +flutter) ; paint ui and not much else ;;dhall ;;elixir ; erlang done right ;;elm ; care for a cup of TEA? emacs-lisp ;;erlang ; an elegant language for a more civilized age ess ;;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) ;;(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 +lsp) ;;(java +lsp) ; the poster child for carpal tunnel syndrome (javascript +lsp) ;;julia ; a better, faster MATLAB ;;kotlin ; a better, slicker Java(Script) (latex +lsp +fold +cdlatex) ;;lean ; for folks with too much to prove ;;ledger ; be audit you can be ;;lua ; one-based indices? one-based indices (markdown +grip) ;;nim ; python + lisp at the speed of c nix ;;ocaml ; an objective camel (org +journal +jupyter +gnuplot +brain +pretty +roam2) ;;php ; perl's insecure younger brother ;;plantuml ; diagrams for confusing people more ;;purescript ; javascript, but functional (python +lsp +tree-sitter) ;;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) ;;scala ; java, but good (scheme +guile) (sh +fish +lsp) ;;sml ;;solidity ; do you need a blockchain? No. ;;swift ; who asked for emoji variables? ;;terra ; Earth and Moon in alignment for performance. (web +lsp) (yaml +lsp) ;;zig ; C, but simpler :email (mu4e +org) ;;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