Find a file
2020-04-15 23:19:23 +02:00
.gitignore Initial commit 2020-04-10 17:42:01 +02:00
config.org Switch font because Fira Mono doesn't support italics :( 2020-04-15 23:19:23 +02:00
init.el Use a different face for org-roam links 2020-04-13 18:59:26 +02:00
packages.el Simpler Org experience 2020-04-10 19:58:40 +02:00
README.org Add README symlink for GitHub display 2020-04-10 17:42:01 +02:00

Misc

Enable lexical binding, of course…

;;; -*- lexical-binding: t; -*-
(setq enable-dir-local-variables nil)

Appearance

Font

Doom exposes five (optional) variables for controlling fonts in Doom. Here are the three important ones:

  • doom-font
  • doom-variable-pitch-font
  • doom-big-font used for doom-big-font-mode; use this for presentations or streaming.

They all accept either a font-spec, font string (Input Mono-12), or xlfd font string. You generally only need these two:

(setq doom-font (font-spec :family "Input Mono Narrow Medium" :size 12))

Theme

A list of all doom themes can be found here:

https://github.com/hlissner/emacs-doom-themes

(setq doom-theme 'doom-one)

Line numbers

Possible values of display-line-numbers-type are nil, t, and 'relative.

(setq display-line-numbers-type 'relative)

Battery indicator

I'm on a laptop, so let's display my battery in the modeline:

(display-battery-mode 1)

Current line

Always highlight the current line:

(global-hl-line-mode +1)

Programming

LSP

Doom disables documentation display in child frames by default; I like those, so re-enable them, and reset the defaults.

(after! lsp-ui
  (setq lsp-ui-doc-max-width 150)
  (setq lsp-ui-doc-max-height 30)
  (setq lsp-ui-doc-enable t))

Rust

By default rustic-mode uses rls, I want to use rust-analyzer instead.

(setq rustic-lsp-server 'rust-analyzer)

I don't want to enable format-on-save globally in Doom, but having it in rust is nice.

(after! rustic
  (setq rustic-format-trigger 'on-save))

C/C++

Setup the default format for C/C++ editing.

(setq c-default-style "gnu")
(setq c-basic-offset 2)

Flycheck never works well for C / C++ without configuration or a CMake build system. Let's disable it.

(after! flycheck
  (setq flycheck-global-modes '(not c-mode c++-mode)))

Org mode

Agenda setup

Here are the keywords I'm using to track task progress. I'm also making use of some automatic state changes.

keyword meaning
TODO Self explanatory
WAITING I'm probably waiting on someone to do something before I can act on this
DONE This task is finished, no longer displayed in the agenda
CANCELLED This task isn't finished but is no longer relevant
(after! org
  (setq org-todo-keywords
        '((sequence
           "TODO(t)"
           "WAITING(w@/!)"
           "|"
           "DONE(d!)"
           "CANCELLED(c@/!)")
          (sequence
           "[ ](T)"
           "[-](S)"
           "[?](W)"
           "|"
           "[X](D)"))))

Of course I also need to setup capture templates:

The first one just prompts me for a new task to add to my inbox, I can then refile them where I want later.

The second one exists because I like to keep a separate list of articles / papers / books to read.

(after! org
  (setq org-capture-templates
        '(("t" "Task" entry (file "inbox.org")
           "* TODO %?")
          ("r" "Reading" entry (file "reading.org")
           "* TODO %x"))))

All these tasks, once captured, are then centralized in my agenda view.

I'm using multiple categories to organize tasks, depending on their triage / status (inspired by https://blog.jethro.dev/posts/org_mode_workflow_preview/).

(after! org-agenda
  (setq org-agenda-custom-commands
        '((" " "Agenda"
           ((agenda ""
                    ((org-agenda-span 'day)
                     (org-agenda-start-day nil)
                     (org-deadline-warning-days 365)))
            (todo "TODO"
                  ((org-agenda-overriding-header "Triage")
                   (org-agenda-files '("~/org/inbox.org"))))
            (todo "TODO"
                  ((org-agenda-overriding-header "School")
                   (org-agenda-files '(
                                       "~/org/image.org"
                                       "~/org/rdi.org"
                                       ))))
            (todo "TODO"
                  ((org-agenda-overriding-header "Tasks")
                   (org-agenda-files '("~/org/tasks.org"))
                   (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline
                                                                        'scheduled))))
            (todo "TODO"
                  ((org-agenda-files '("~/org/reading.org"))
                   (org-agenda-overriding-header "To Read")))
            (todo "TODO"
                  ((org-agenda-files '("~/org/project.org"))
                   (org-agenda-overriding-header "Personal projects")))
            )))))

I want the default agenda view to be a weekly view, with a log of what I've done during the day.

(after! org-agenda
  (setq org-agenda-span 'week)
  (setq org-agenda-start-on-weekday 1)
  (setq org-agenda-start-with-log-mode '(clock)))

I also remove the block separators in the agenda view:

(after! org-agenda
  (setq org-agenda-block-separator ""))

Journal

For org-journal I want weekly entries (the default is 'daily).

(after! org-journal
  (setq org-journal-date-format "%A (%d/%m/%Y)")
  (setq org-journal-file-type 'weekly)
  (setq org-journal-file-format "%Y-%m-%d.org")

  ;; see `org-journal-dir-and-format->regex' documentation
  (setq org-journal-file-pattern (org-journal-dir-and-format->regex
                                  org-journal-dir org-journal-file-format))
  (add-to-list 'auto-mode-alist (cons org-journal-file-pattern 'org-journal-mode)))

Org IDs

Org can link to entries using UUIDs, but we need the module to be loaded for links to work:

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

Roam

Setup for org-roam.

First, set a directory where org-roam will index things.

(setq org-roam-directory (expand-file-name "notes/" org-directory))

Customize the capture templates:

  • the first one is the default one, I just removed the timestamp from the file title.
  • the second one I use to create new entries about website links, blog posts, articles… The %x in the template is replaced by the content of my X clipboard, so I just have to copy the website URL before capturing it.
(after! org-roam
  (set-face-attribute 'org-roam-link nil :foreground "#CCCC60")
  (setq org-roam-capture-templates
        '(("d" "default" plain (function org-roam-capture--get-point)
           "%?"
           :file-name "${slug}"
           :head "#+TITLE: ${title}\n"
           :unnarrowed t)
          ("w" "website" plain (function org-roam-capture--get-point)
           ""
           :file-name "websites/${slug}"
           :head "#+TITLE: ${title}\n#+ROAM_KEY: %x\n"
           :unnarrowed t))))

Doom specific

Doom replaces the default tab behavior on headings, this restores the default one. Taken from here.

(after! evil-org
  (remove-hook 'org-tab-first-hook #'+org-cycle-only-current-subtree-h))