dotfiles/config/dot_config/doom/config.org

7.1 KiB

Emacs Config

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

Base Config

;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-

;; 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)

;; General Keybindings
(map! :n "<f12>" #'org-agenda-list)
(map! :n "<f7>" #'org-drill)
(map! "C-M-+" #'doom/increase-font-size)
(map! "C-#" #'comment-line)
(evil-define-key 'normal dired-mode-map
  (kbd "DEL") 'dired-up-directory)

Hooks

;; Org Mode
(add-hook 'org-mode-hook #'org-modern-mode)
(add-hook 'org-mode-hook #'hl-todo-mode)

;; Org Agenda
(add-hook 'org-agenda-finalize-hook #'org-modern-agenda)

;; Modeline
(add-hook 'doom-after-init-hook #'display-battery-mode)
(add-hook 'doom-after-init-hook #'display-time-mode)

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)))

Org Mode

General Settings

(setq +user-org-path "~/Notes/Org")
(defun org-path (filename) (expand-file-name filename +user-org-path))

(after! org (setq org-directory +user-org-path
                  org-src-tab-acts-natively t))

(add-to-list 'org-modules 'org-habit)

Org Export

(after! org (;; TOC Links will lead to errors when attempting
             ;; to export to HTML
             setq org-export-exclude-tags '("toc")))

(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")))))

;; Org Export
(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)

Org Capture   toc

(after! org (setq +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-nepali-file (org-path "Nepali.org")))

(after! org (setq org-capture-templates
                  '(("t" "Personal Todo" entry
                     (file+headline +org-capture-todo-file "Inbox")
                     "* TODO %?\n" :prepend t)

                    ("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" "Journal entries")

                    ("jj" "Daily Journal" entry
                     (file+olp+datetree +org-capture-journal-file)
                     "* %U %?\n" :prepend t)

                    ("jt" "Travel Journal" entry
                     (file+headline +org-capture-journal-file "Travel")
                     "* %U %?\n" :prepend t))))

Org Agenda

(after! org (setq
             org-agenda-show-all-dates nil
             org-agenda-span 4
             org-agenda-start-day "+0d"
             org-agenda-spillover-skip-function '(org-agenda-skip-entry-if 'todo 'done)
             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)))

Packages

hl-todo

(after! hl-todo (setq hl-todo-keyword-faces '(("TODO" warning bold)
                                              ("FIXME" error 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)
                                              ("XXX" font-lock-constant-face bold))))

org-auto-tangle

(use-package! org-auto-tangle
  :defer t
  :config (setq org-auto-tangle-default nil)
  :hook (org-mode . org-auto-tangle-mode))

org-drill

(after! org-drill
  (setq org-drill-scope 'agenda))

doom-modeline

(after! doom-modeline
  (setq doom-modeline-battery t)
  (setq doom-modeline-major-mode-icon t))

evil-snipe

(after! evil-snipe (setq evil-snipe-scope 'whole-visible))