Emacs Config
Table of Contents
This config file is built on doom-emacs 3.0.0-pre
and emacs 29.2
.
1. Header
This header will be the first codeblock in the config file.
;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
2. Keybindings
These keybindings extend the default doom bindings, either because the defaults were confusing to me or because the binding did not yet exist.
Key | Description | State |
---|---|---|
F12 | Show Org-Agenda | N |
Ctrl-Alt-+ | Increase Font Size | |
Ctrl-# | Toggle Line Comment | |
DEL | Up Directory | Dired |
F6 | Toggle Light/Dark Theme | |
F7 | Start Org-Drill | |
SPC m g s | Go to habit stats | Org |
M-UP | Move line up | |
M-DOWN | Move line down | |
M-LEFT | Move region left |
(map! :n "<f12>" #'org-agenda-list) (map! :n "<f7>" #'org-drill) (map! "C-M-+" #'doom/increase-font-size) (map! "C-#" #'comment-line) (map! :n "<f8>" #'emms-playlist-mode-go) (evil-define-key 'normal dired-mode-map (kbd "DEL") 'dired-up-directory)
3. Base Config
;; Basic User Settings (setq user-full-name "Jonathan Jenne" user-mail-address "johnnie@posteo.de") ;; Default Shell ;; Useful if default system shell is not bash (setq shell-file-name (executable-find "bash")) ;; Display Line numbers (setq display-line-numbers-type t)
4. Appearance
;; Fonts (setq doom-font (font-spec :family "IBM Plex Mono" :size 18 :weight 'medium)) (setq doom-variable-pitch-font (font-spec :family "IBM Plex Serif" :size 18 :weight 'medium)) (setq variable-pitch (font-spec :family "IBM Plex Serif" :size 18 :weight 'medium)) ;; Dashboard (defun my-weebery-is-always-greater () (let* ((banner '("EMACS " "███▄ ▄███▓ ▒█████ ▒█████ ▓█████▄ " "▓██▒▀█▀ ██▒▒██▒ ██▒▒██▒ ██▒▒██▀ ██▌" "▓██ ▓██░▒██░ ██▒▒██░ ██▒░██ █▌" "▒██ ▒██ ▒██ ██░▒██ ██░░▓█▄ ▌" "▒██▒ ░██▒░ ████▓▒░░ ████▓▒░░▒████▓ " "░ ▒░ ░ ░░ ▒░▒░▒░ ░ ▒░▒░▒░ ▒▒▓ ▒ " "░ ░ ░ ░ ▒ ▒░ ░ ▒ ▒░ ░ ▒ ▒ " "░ ░ ░ ░ ░ ▒ ░ ░ ░ ▒ ░ ░ ░ " " ░ ░ ░ ░ ░ ░ " " ░ ")) (longest-line (apply #'max (mapcar #'length banner)))) (put-text-property (point) (dolist (line banner (point)) (insert (+doom-dashboard--center +doom-dashboard--width (concat line (make-string (max 0 (- longest-line (length line))) 32))) "\n")) 'face 'doom-dashboard-banner))) (setq +doom-dashboard-ascii-banner-fn #'my-weebery-is-always-greater) (remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-shortmenu) (remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-footer) (remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-loaded) ;; Themes (use-package! heaven-and-hell :ensure t :config (setq heaven-and-hell-theme-type 'dark) ;; Omit to use light by default (setq heaven-and-hell-themes '((light . doom-gruvbox-light) (dark . doom-gruvbox))) ;; Themes can be the list: (dark . (tsdh-dark wombat)) ;; Optionall, load themes without asking for confirmation. (setq heaven-and-hell-load-theme-no-confirm t) :hook (after-init . heaven-and-hell-init-hook) :bind (("<f6>" . heaven-and-hell-toggle-theme)))
5. Org Mode
5.1. General Settings
(setq +user-org-path "~/Notes/Org") (defun org-path (filename) (expand-file-name filename +user-org-path)) (use-package! org :config (setq ;; General org-directory +user-org-path org-src-tab-acts-natively t ;; Org Export org-export-exclude-tags '("toc") ;; Org Capture +org-capture-notes-file (org-path "Notes.org") +org-capture-todo-file (org-path "Todo.org") +org-capture-journal-file (org-path "Journal.org") +org-capture-cooking-file (org-path "Cooking.org") +org-capture-nepali-file (org-path "Nepali.org") ;; Org Agenda org-agenda-show-all-dates t org-agenda-span 4 org-agenda-start-day "+0d" org-agenda-tag-filter-preset '("-drill") org-agenda-time-grid '((daily today require-timed) (800 1000 1200 1400 1600 1800 2000) " ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄") org-agenda-current-time-string "◀── now ──────────────────────────────────────────────── \\o/" org-agenda-block-separator ?─ ;; Consider all org files part of the org-agenda org-agenda-files (list +user-org-path) ;; org-agenda-spillover-skip-function '(org-agenda-skip-entry-if 'todo 'done) ;; Org Todo org-todo-keywords '((sequence "TODO(t)" "|" "DONE(d)") (sequence "THIS(T)" "EXAMPLE"))) :bind (:map org-mode-map ("<localleader> g s" . #'org-habit-stats-view-habit-at-point)) :hook (org-after-todo-state-change . org-habit-stats-update-properties) :init (add-to-list 'org-modules 'org-habit) (add-hook 'org-export-before-processing-functions 'my-org-inline-css-hook))
5.2. Org Export
;; Org Export
5.3. Org Capture
(after! org (setq org-capture-templates '(("t" "Personal Todo" entry (file +org-capture-todo-file) "* TODO %?\n" :prepend t) ("r" "Recipe" entry (file+headline +org-capture-cooking-file "Unsorted") "* NEVERMADE %? :PROPERTIES: :Author: :Source: :Sent_by: :Yield: :Prep_Time: :Cook_Time: :Total_Time: :Cost: :Description: :URL: :Added: %u :END: - [ ] Ingredient 1 1. First Step") ("n" "Nepali") ("nw" "Nepali Word" entry (file+headline +org-capture-nepali-file "Nepali Words") "* %^{Nepali Word} :drill:\n%\\1\n** Answer\n%^{Translation}" :prepend t :immediate-finish t) ("j" "Daily Journal" entry (file+olp+datetree +org-capture-journal-file) "* %U %?\n" :prepend t))))
6. Packages
6.1. doom-modeline
The doom modeline can be configured to show different information like time and date, battery info and more.
(after! doom-modeline (setq doom-modeline-battery t) (setq doom-modeline-major-mode-icon t)) (add-hook 'doom-after-init-hook #'display-battery-mode) (add-hook 'doom-after-init-hook #'display-time-mode)
6.2. evil-snipe
(after! evil-snipe (setq evil-snipe-scope 'whole-visible))
6.3. hl-todo
(add-hook 'org-mode-hook #'hl-todo-mode) (after! hl-todo (setq hl-todo-keyword-faces '(("TODO" warning bold) ("EXAMPLE" font-lock-keyword-face bold) ("HACK" font-lock-constant-face bold) ("DEPRECATED" font-lock-doc-face bold) ("NOTE" success bold) ("BUG" error bold) ("THIS" font-lock-constant-face bold))))
6.4. notmuch
(setq +notmuch-home-function (lambda () (notmuch-search "folder:INBOX"))) (setq +notmuch-sync-backend 'offlineimap)
6.5. nov.el
(use-package! nov :mode ("\\.epub\\'" . nov-mode) :config (setq nov-text-width 70)) (add-hook! 'nov-mode-hook '(olivetti-mode))
6.6. olivetti
Centers the text. This is used for reading books in
(use-package! olivetti :defer t :config (setq olivetti-body-width 70) :init (add-hook! 'org-mode-hook '(olivetti-mode (lambda () (display-line-numbers-mode -1)))))
6.7. org-auto-tangle
This package automatically tangles all sourceblocks in an org file whenever that file is saved. It is very handy to not have to call the tangle command everytime you save.
(use-package! org-auto-tangle :defer t :config (setq org-auto-tangle-default nil) :hook (org-mode . org-auto-tangle-mode))
6.8. org-drill
A package for learning and memorizing using spaced repetition, inspired by applications like Anki.
(after! org-drill (setq org-drill-scope 'agenda))
6.9. org-noter
(after! org-noter (setq org-noter-notes-search-path '("~/Notes/Org")) (setq org-noter-always-create-frame nil) (setq org-noter-doc-split-fraction '(0.75 . 0.75)) (setq org-noter-default-notes-file-names '()))
6.10. org-roam
(after! org-roam (setq org-roam-directory "~/Notes/Org/Roam") (setq org-roam-dailies-directory "Daily"))
6.11. drag-stuff
With drag stuff you can use M-UP
and M-DOWN
to move lines. You can also mark a region and use M-LEFT
and M-RIGHT
to move it left and right.
(drag-stuff-global-mode t)
7. Functions
(defun my-org-inline-css-hook (exporter) "Insert custom inline css" (when (eq exporter 'html) (let* ((dir (ignore-errors (file-name-directory (buffer-file-name)))) (path (concat dir "style.css")) (fallback-style (or (null dir) (null (file-exists-p path)))) (final (if fallback-style "~/.config/doom/style.css" path))) ;; <- set your own style file path (setq org-html-head-include-default-style t) (setq org-html-head (concat "<style type=\"text/css\">\n" "<!--/*--><![CDATA[/*><!--*/\n" (with-temp-buffer (insert-file-contents final) (buffer-string)) "/*]]>*/-->\n" "</style>\n")))))