#+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