Literate Configuration
Table of Contents
1 System Configuration
1.1 Org Directory
(setq org-directory "~/Notes/")
1.2 Startup Settings
;; Full screen on startup (add-to-list 'initial-frame-alist '(fullscreen . maximized)) ;; Bring Emacs to front on macOS (defun bring-emacs-to-front () "Bring Emacs to the front using AppleScript." (when (eq system-type 'darwin) (ns-do-applescript "tell application \"Emacs\" to activate"))) (add-hook 'after-init-hook #'bring-emacs-to-front) (advice-add 'restart-emacs :after #'bring-emacs-to-front) ;; Avoid adding new line automatically (setq-default require-final-newline nil)
1.3 Utility Functions
(defun my-open (filepath) "Open file with system default application." (cond ((eq system-type 'gnu/linux) (shell-command (format "xdg-open %s &" filepath) nil nil)) ((eq system-type 'darwin) (shell-command (format "open %s &" filepath) nil nil))))
1.4 Environment Settings
;; Editor settings (setenv "EDITOR" "emacsclient") (setq tramp-default-method "ssh") ;; Debug settings (setq debug-on-error nil edebug-on-error nil) ;; Auth sources (setq auth-sources '("~/.authinfo.gpg"))
2 Evil/Vim Configuration
2.1 Evil Settings
(after! evil (setq evil-split-window-below t evil-vsplit-window-right t evil-ex-substitute-global t evil-kill-on-visual-paste nil)) ;; Evil escape configuration (use-package! evil-escape) (setq-default evil-escape-key-sequence "fd")
2.2 Doom Leader Configuration
(setq doom-localleader-key ",")
3 Key Bindings
3.1 Global Key Bindings
;; Org-mode global shortcuts (define-key global-map "\C-cl" 'org-store-link) (define-key global-map "\C-cc" 'org-capture) (define-key global-map "\C-ca" 'org-agenda) ;; Unfill paragraph (opposite of fill-paragraph) (defun unfill-paragraph (&optional region) "Takes a multi-line paragraph and makes it into a single line of text." (interactive (progn (barf-if-buffer-read-only) '(t))) (let ((fill-column (point-max)) (emacs-lisp-docstring-fill-column t)) (fill-paragraph nil region))) (define-key global-map "\M-Q" 'unfill-paragraph)
3.2 Leader Key Mappings
(map! (:leader :desc "M-x" :nv "SPC" #'execute-extended-command :desc "Find file in project" :n ":" #'projectile-find-file (:prefix "TAB" :desc "Previous workspace" :n "h" #'+workspace/switch-left :desc "Next workspace" :n "l" #'+workspace/switch-right :desc "Load workspace" :n "L" #'+workspace/load) (:desc "git" :prefix "g" :desc "Git status" :n "s" #'magit-status :desc "Git stage hunk" :n "S" #'git-gutter:stage-hunk) (:desc "+toggle" :prefix "t" :desc "Flycheck" :n "c" #'flycheck-mode :desc "Focus" :n "f" #'focus-mode :desc "Center" :n "w" #'centered-window-mode :desc "LSP iMenu" :n "i" #'lsp-ui-imenu)))
3.3 Evil Key Mappings
(map! (:after evil (:map evil-window-map ; prefix "C-w" "d" #'+workspace/close-window-or-workspace "g" #'golden-ratio "G" #'balance-windows "w" #'other-window "u" #'winner-undo "r" #'winner-redo) (:map evil-motion-state-map ";" #'ignore) (:map evil-normal-state-map "zi" #'ispell-word "zI" #'ispell-buffer "s-[" #'evil-goto-last-change "s-]" #'evil-goto-last-change-reverse)))
3.4 Org-mode Key Mappings
(map! (:after evil-org (:map evil-org-mode-map (:localleader :n "n" #'org-toggle-narrow-to-subtree :n "A" #'org-archive-subtree :n "S" #'org-sort :n "T" #'org-babel-tangle :n "#" #'org-update-checkbox-count) :ni "M-j" #'org-metadown :ni "M-k" #'org-metaup :ni "M-h" #'org-promote-subtree :ni "M-l" #'org-demote-subtree :n "t" #'org-todo :n "zi" #'ispell-word) (:map evil-org-agenda-mode-map (:localleader :n "A" #'org-agenda-archive-default-with-confirmation))))
3.5 macOS Specific Bindings
(when IS-MAC (setq mac-command-modifier 'super mac-option-modifier 'meta))
3.6 Tool Specific Bindings
(after! magit
(define-key magit-mode-map (kbd "Q") 'delete-frame))
4 Org-mode Configuration
4.1 Core Settings
(after! org (require 'org-id) ;; Directory structure (setq org-default-notes-file (expand-file-name "refile.org" org-directory) org-default-meeting-file (expand-file-name "roam/meetings.org" org-directory) org-journal-dir (expand-file-name "journal" org-directory)) ;; Statistics and hierarchies (setq org-checkbox-hierarchical-statistics nil org-hierarchical-todo-statistics nil) ;; Mode hooks (add-hook 'org-mode-hook #'turn-on-auto-fill) (add-hook 'org-mode-hook (lambda () (display-line-numbers-mode 0))) (add-hook 'org-trigger-hook #'save-buffer) ;; ID management (setq org-id-link-to-org-use-id 'create-if-interactive org-id-locations-file (expand-file-name ".orgids" org-directory) org-attach-preferred-new-method 'id) ;; Visual settings (setq org-startup-indented t org-startup-truncated nil org-startup-folded t org-cycle-separator-lines 0 outline-blank-line nil org-pretty-entities t org-hide-emphasis-markers nil org-fontify-whole-heading-line t org-fontify-done-headline t org-fontify-quote-and-verse-blocks t org-blank-before-new-entry '((heading) (plain-list-item))) ;; Search fix for evil (setq org-fold-core-style 'overlays) (evil-select-search-module 'evil-search-module 'evil-search))
4.2 Babel Configuration
(after! org ;; PlantUML integration (setq plantuml-jar-path (expand-file-name "~/.dotfiles/plantuml.1.2021.0.jar")) (setq org-plantuml-jar-path plantuml-jar-path) (add-to-list 'org-src-lang-modes '("plantuml" . plantuml)) ;; Babel evaluation confirmation (defun my-org-confirm-babel-evaluate (lang body) (cond ((string= lang "plantuml") nil) ((string= lang "emacs-lisp") nil) ((string= lang "http") nil) (t t))) (setq org-confirm-babel-evaluate #'my-org-confirm-babel-evaluate))
4.3 Refile and Export
(after! org ;; Refile configuration (setq org-refile-use-outline-path 'file org-outline-path-complete-in-steps nil org-refile-targets '((nil :maxlevel . 2) (org-agenda-files :maxlevel . 4)) org-reverse-note-order t) ;; Export configuration (setq org-export-with-toc nil org-export-with-smart-quotes nil org-pandoc-format-extensions '(markdown_strict+pipe_tables) org-pandoc-markdown-extension "+yaml_metadata_block" org-export-initial-scope 'subtree org-html-head-include-default-style nil org-html-head "<link rel=\"stylesheet\" href=\"https://mingwei.gitlab.io/doom.d/org.css\" type=\"text/css\" />") ;; Hugo configuration (setq org-hugo-default-section-directory "post"))
4.4 Capture Templates
(after! org (setq org-capture-templates '(("t" "Todo" entry (file+headline org-default-notes-file "Inbox") "* TODO %?\n%U\n%a\n" :clock-in t :clock-resume t) ("n" "Note" entry (file+headline org-default-notes-file "Notes") "* %? :NOTE:\n%U\n%a\n" :clock-in t :clock-resume t) ("r" "Radar Group Meeting" entry (file+headline "roam/cloudflare_radar.org" "Group Meetings") "*** Group meeting on %t\n**** Topic:\n\n**** Notes\n\n") ("c" "Individual Meeting" entry (file+headline "roam/cloudflare_radar.org" "Individual Meetings") "*** Meeting with %^{Person} on %t\n**** Topic\n\n**** Notes\n\n"))) (add-hook 'org-capture-mode-hook #'delete-other-windows))
4.5 Agenda Configuration
(after! org ;; Agenda files and display (setq org-agenda-files (directory-files-recursively "~/Notes/roam/" "\\.org$") org-tags-column -77 +popup-margin-width 0) (set-popup-rule! "^\\*Org Agenda" :side 'right :width 98 :select t :ttl nil) ;; Agenda view settings (setq org-agenda-start-day nil org-agenda-start-on-weekday 1 org-agenda-span 'week org-agenda-skip-scheduled-if-done t org-agenda-skip-deadline-if-done t org-agenda-block-separator "" org-tags-match-list-sublevels t org-agenda-use-tag-inheritance nil org-agenda-window-setup 'current-window org-agenda-restore-windows-after-quit t) ;; TODO keywords and faces (setq org-todo-keywords '((sequence "TODO(t)" "NEXT(n)" "STRT(s)" "REVW(r)" "BLOCKED(b@/@)" "WAIT(w@/@)" "HOLD(h@/@)" "|" "DONE(d)" "KILL(k@/@)") (sequence "[ ](T)" "[-](S)" "[?](W)" "|" "[X](D)")) org-todo-keyword-faces '(("NEXT" . +org-todo-active) ("[-]" . +org-todo-active) ("STRT" . +org-todo-active) ("REVW" . +org-todo-active) ("[?]" . +org-todo-onhold) ("WAIT" . +org-todo-project) ("BLOCKED" . +org-todo-project) ("HOLD" . +org-todo-project))) ;; Logging and dependencies (setq org-log-into-drawer t org-return-follows-link t org-use-fast-todo-selection t org-treat-S-cursor-todo-selection-as-state-change nil org-log-done 'time org-enforce-todo-dependencies t org-enforce-todo-checkbox-dependencies t org-agenda-dim-blocked-tasks t) ;; Log note headings (setq org-log-note-headings '((done . "CLOSING NOTE %t") (state . "State %-12s from %-12S %t") (note . "%t") (reschedule . "Rescheduled from %S on %t") (delschedule . "Not scheduled, was %S on %t") (redeadline . "New deadline from %S on %t") (deldeadline . "Removed deadline, was %S on %t") (refile . "Refiled on %t") (clock-out . ""))))
4.6 Custom Agenda Commands
(after! org (setq org-agenda-custom-commands '(("d" "Dashboard" ((agenda "" ((org-agenda-span 'day) (org-deadline-warning-days 7))) (todo "NEXT" ((org-agenda-overriding-header "Next Actions") (org-agenda-max-todos nil))) (todo "STRT" ((org-agenda-overriding-header "In Progress"))) (todo "WAIT|BLOCKED" ((org-agenda-overriding-header "Waiting/Blocked"))) (tags-todo "inbox" ((org-agenda-overriding-header "Inbox - to Refile"))))) ("n" "Next Actions" ((todo "NEXT" ((org-agenda-overriding-header "Next Actions"))))) ("w" "Weekly Review" ((agenda "" ((org-agenda-span 'week) (org-agenda-start-on-weekday 1))) (todo "DONE" ((org-agenda-overriding-header "Completed This Week"))) (todo "TODO" ((org-agenda-overriding-header "All TODOs") (org-super-agenda-groups '((:name "Important" :priority "A") (:name "Next" :todo "NEXT") (:name "On Hold" :todo "HOLD") (:auto-category t))))))) ("p" "Projects" ((todo "" ((org-agenda-overriding-header "All Projects") (org-super-agenda-groups '((:name "Active Projects" :todo "STRT") (:name "Stuck Projects" :todo "BLOCKED") (:name "On Hold" :todo "HOLD") (:discard (:anything t)))))))) ("t" "All TODOs" ((todo "" ((org-agenda-overriding-header "TODO!") (org-super-agenda-groups '((:name "Important" :priority "A") (:name "Next Actions" :todo "NEXT") (:name "In Progress" :todo "STRT") (:name "Waiting" :todo "WAIT") (:name "On Hold" :todo "HOLD" :order 1))))))))) (org-super-agenda-mode))
4.7 Org-roam Configuration
(after! org-roam (setq org-roam-directory (expand-file-name "roam" org-directory) org-roam-db-location (expand-file-name "org-roam.db" org-roam-directory) org-roam-capture-templates '(("d" "default" plain "%?" :target (file+head "${slug}.org" "#+title: ${title}\n") :unnarrowed t))))
4.8 Utility Functions
(after! org (defun weekly-dates() "Insert dates of current Monday and Sunday for weekly purpose." (interactive) (insert (concat "** " (org-read-date nil nil "this monday") " " (org-read-date nil nil "this sunday") "\n" "*** log\n" "**** Monday\n" "**** Tuesday\n" "**** Wednesday\n" "**** Thursday\n" "**** Friday\n"))))
4.9 TODO State Change Hooks
;; Clear scheduled time when changing to WAIT/BLOCKED/HOLD (add-hook 'org-after-todo-state-change-hook (lambda () (when (member org-state '("WAIT" "BLOCKED" "HOLD")) (org-schedule '(4)))))
5 Theme and UI Configuration
5.1 Theme Setup
(after! doom-themes (setq doom-themes-enable-bold t doom-themes-enable-italic t) (doom-themes-visual-bell-config) (doom-themes-treemacs-config) (doom-themes-org-config)) ;; Load theme (setq doom-theme 'doom-dracula)
5.2 Font Configuration
;; Primary font configuration (setq doom-font (font-spec :family "JetBrains Mono" :size 15)) (unless (doom-font-exists-p doom-font) (setq doom-font nil)) (setq doom-unicode-font (font-spec :family "JetBrains Mono" :size 15)) (unless (doom-font-exists-p doom-unicode-font) (setq doom-unicode-font nil)) ;; Line spacing for consistency (setq line-spacing 0.15)
5.3 Display Settings
;; Line numbers (setq display-line-numbers-type 'visual) ;; Disable cursor blinking (blink-cursor-mode -1)
6 Language Support
6.1 Rust Configuration
(after! rustic (setq rustic-format-on-save t rustic-cargo-build-arguments "--all-features" lsp-rust-analyzer-display-parameter-hints t lsp-rust-all-features t lsp-ui-sideline-show-hover nil) (map! (:map rustic-mode-map (:localleader (:prefix ("t" . "cargo test") :desc "related test" "r" #'lsp-rust-analyzer-related-tests :desc "current test" "t" #'lsp-rust-analyzer-run)))))
6.2 Other Languages
;; Unix timestamp utilities (use-package! unix-ts) ;; Syslog mode (add-to-list 'auto-mode-alist '("syslog\\'" . syslog-mode) t) ;; TOML configuration (add-hook 'conf-toml-mode-hook #'visual-line-mode)
7 Tools Configuration
7.1 Flycheck
(setq flycheck-temp-prefix ".flycheck")
7.2 Spell Checking
(setq ispell-personal-dictionary "~/.dotfiles/emacs/ispell-dict" ispell-silently-savep t) (defun flyspell-buffer-after-pdict-save (&rest _) (flyspell-buffer)) (advice-add 'ispell-pdict-save :after #'flyspell-buffer-after-pdict-save)