481 lines
14 KiB
Org Mode
481 lines
14 KiB
Org Mode
#+STARTUP: content
|
|
* Table of Contents :TOC_3:
|
|
- [[#misc][Misc]]
|
|
- [[#lexical-bindings][Lexical bindings]]
|
|
- [[#dir-local-variables][Dir local variables]]
|
|
- [[#theme][Theme]]
|
|
- [[#main-theme][Main theme]]
|
|
- [[#dark-theme-toggle][Dark theme toggle]]
|
|
- [[#font][Font]]
|
|
- [[#line-numbers][Line numbers]]
|
|
- [[#battery-indicator][Battery indicator]]
|
|
- [[#programming][Programming]]
|
|
- [[#smart-parens][Smart parens]]
|
|
- [[#rust][Rust]]
|
|
- [[#cc][C/C++]]
|
|
- [[#default-style][Default style]]
|
|
- [[#flycheck][Flycheck]]
|
|
- [[#org-mode][Org mode]]
|
|
- [[#directory][Directory]]
|
|
- [[#appearance][Appearance]]
|
|
- [[#disable-fancy-stars][Disable fancy stars]]
|
|
- [[#dont-hide-leading-stars][Don't hide leading stars]]
|
|
- [[#fancier-ellipsis-indicator][Fancier ellipsis indicator]]
|
|
- [[#agenda-setup][Agenda setup]]
|
|
- [[#default-task-keywords][Default task keywords]]
|
|
- [[#org-capture-setup][Org capture setup]]
|
|
- [[#main-agenda-view][Main agenda view]]
|
|
- [[#habits][Habits]]
|
|
- [[#save-all-org-buffers-shortcut][Save all org buffers shortcut]]
|
|
- [[#org-ids][Org IDs]]
|
|
- [[#roam][Roam]]
|
|
- [[#roam-directory][Roam Directory]]
|
|
- [[#graph-browser][Graph browser]]
|
|
- [[#roam-link-font-face][Roam link font face]]
|
|
- [[#roam-capture-template][Roam capture template]]
|
|
- [[#org-roam-server][Org Roam Server]]
|
|
- [[#export-backends][Export backends]]
|
|
- [[#doom-specific][Doom specific]]
|
|
|
|
* Misc
|
|
|
|
** Lexical bindings
|
|
|
|
Enable lexical binding, of course...
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
;;; -*- lexical-binding: t; -*-
|
|
#+END_SRC
|
|
|
|
** Dir local variables
|
|
|
|
Disable these because I don't use them and don't want to get prompted by them in
|
|
some projects.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq enable-dir-local-variables nil)
|
|
#+END_SRC
|
|
|
|
* Theme
|
|
|
|
** Main theme
|
|
|
|
A list of all doom themes can be found here:
|
|
|
|
https://github.com/hlissner/emacs-doom-themes
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq doom-theme 'doom-solarized-light)
|
|
#+END_SRC
|
|
|
|
** Dark theme toggle
|
|
|
|
I've come to prefer using a light theme during the day, and a dark theme at
|
|
night. Using a dark theme with daylight leads to cranking up the screen
|
|
brightness, which hurts my eyes more than using the light theme.
|
|
|
|
Set my light and dark themes:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq my/light-theme doom-theme
|
|
my/dark-theme 'doom-one)
|
|
#+END_SRC
|
|
|
|
Function to toggle between the two easily:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(defun my/toggle-dark-theme ()
|
|
(interactive)
|
|
(if (eq my/dark-theme doom-theme)
|
|
(load-theme my/light-theme t)
|
|
(load-theme my/dark-theme t)))
|
|
#+END_SRC
|
|
|
|
Bind this to =SPC t d=:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(map! :leader
|
|
(:prefix-map ("t" . "toggle")
|
|
:desc "Dark theme" "d" #'my/toggle-dark-theme))
|
|
#+END_SRC
|
|
|
|
** 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:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq doom-font
|
|
(font-spec :family "Input Mono Narrow" :size 12 :style 'regular))
|
|
#+END_SRC
|
|
|
|
** Line numbers
|
|
|
|
Possible values of =display-line-numbers-type= are =nil=, =t=, and ='relative=.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq display-line-numbers-type nil)
|
|
#+END_SRC
|
|
|
|
** Battery indicator
|
|
|
|
I'm on a laptop, so let's display my battery in the modeline:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(display-battery-mode 1)
|
|
#+END_SRC
|
|
|
|
* Programming
|
|
|
|
** Smart parens
|
|
|
|
Disable smart parens because half of the time it doesn't do what I want:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(remove-hook 'doom-first-buffer-hook #'smartparens-global-mode)
|
|
#+END_SRC
|
|
|
|
** Rust
|
|
=rustfmt= limits lines to 100 characters, let's display it correctly.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(add-hook! rustic-mode
|
|
(set-fill-column 100))
|
|
#+END_SRC
|
|
|
|
** C/C++
|
|
|
|
*** Default style
|
|
|
|
Setup the default format for C/C++ editing.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(add-hook! (c-mode c++-mode)
|
|
(setq c-default-style "gnu")
|
|
(setq c-basic-offset 2))
|
|
#+END_SRC
|
|
|
|
*** Flycheck
|
|
|
|
Flycheck never works well for C / C++ without configuration or a CMake build
|
|
system. Let's disable it.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! flycheck
|
|
(setq flycheck-global-modes '(not c-mode c++-mode)))
|
|
#+END_SRC
|
|
|
|
* Org mode
|
|
|
|
** Directory
|
|
|
|
Set a default directory for all my org-mode files.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq org-directory "~/org/")
|
|
#+END_SRC
|
|
|
|
** Appearance
|
|
|
|
*** Disable fancy stars
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(remove-hook 'org-mode-hook #'org-superstar-mode)
|
|
#+END_SRC
|
|
|
|
*** Don't hide leading stars
|
|
|
|
Currently doesn't work due to [[https://github.com/hlissner/doom-emacs/issues/3076][hlissner/doom-emacs#3076]]
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org
|
|
(setq org-hide-leading-stars nil
|
|
org-startup-indented nil
|
|
org-adapt-indentation nil))
|
|
#+END_SRC
|
|
|
|
*** Fancier ellipsis indicator
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq org-ellipsis " ▼ ")
|
|
#+END_SRC
|
|
|
|
** Agenda setup
|
|
|
|
*** Default task keywords
|
|
|
|
Here are the [[https://orgmode.org/manual/TODO-Extensions.html#TODO-Extensions][keywords]] I'm using to track task progress. I'm also making use of
|
|
some automatic [[https://orgmode.org/manual/Tracking-TODO-state-changes.html#Tracking-TODO-state-changes][state changes]].
|
|
|
|
| keyword | meaning |
|
|
|-------------+----------------------------------------------------------|
|
|
| =TODO= | Self explanatory |
|
|
| =DONE= | This task is finished, no longer displayed in the agenda |
|
|
| =CANCELLED= | This task isn't finished but is no longer relevant |
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org
|
|
(setq org-todo-keywords
|
|
'((sequence
|
|
"TODO(t)"
|
|
"|"
|
|
"DONE(d!)"
|
|
"CANCELLED(c@/!)")
|
|
(sequence
|
|
"[ ](T)"
|
|
"|"
|
|
"[X](D)"))))
|
|
#+END_SRC
|
|
|
|
*** Org capture setup
|
|
|
|
Of course I also need to setup [[https://orgmode.org/manual/Capture-templates.html][capture templates]]:
|
|
|
|
The first one just prompts me for a new task to add to my inbox, I can then
|
|
[[https://orgmode.org/guide/Refile-and-Copy.html][refile]] them where I want later.
|
|
|
|
The second one exists because I like to keep a separate list of articles /
|
|
papers / books to read.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org
|
|
(setq org-capture-templates
|
|
'(("t" "New entry" entry (file "inbox.org")
|
|
"* TODO %?")
|
|
("T" "Task" entry (file "tasks.org")
|
|
"* TODO %?")
|
|
("r" "Reading" entry (file "reading.org")
|
|
"* TODO %x"
|
|
:immediate-finish t)
|
|
("w" "Watching" entry (file "watching.org")
|
|
"* TODO %x"
|
|
:immediate-finish t))))
|
|
#+END_SRC
|
|
|
|
I also change [[https://github.com/hlissner/doom-emacs/blob/134554dd69d9b1cea3d2190422de580fddf40ecd/modules/config/default/%2Bevil-bindings.el#L265][the default Doom binding]] for ~#'org-capture~ to be =SPC x= instead
|
|
of =SPC X=. Also need to rebind what was [[https://github.com/hlissner/doom-emacs/blob/134554dd69d9b1cea3d2190422de580fddf40ecd/modules/config/default/%2Bevil-bindings.el#L264][previously bound]] to =SPC x=, to =SPC
|
|
X=.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(map! :leader
|
|
:desc "Org Capture" "x" #'org-capture
|
|
:desc "Pop up scratch buffer" "X" #'doom/open-scratch-buffer)
|
|
#+END_SRC
|
|
|
|
*** Main agenda view
|
|
|
|
All these tasks, once captured, are then centralized in my [[https://orgmode.org/guide/Agenda-Views.html][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/]]).
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(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"
|
|
))
|
|
(org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline
|
|
'scheduled))))
|
|
(todo "TODO"
|
|
((org-agenda-overriding-header "Assistant")
|
|
(org-agenda-files '("~/org/assistant.org"))
|
|
(org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline
|
|
'scheduled))))
|
|
(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/watching.org"))
|
|
(org-agenda-overriding-header "To Watch")))
|
|
(todo "TODO"
|
|
((org-agenda-files '("~/org/reading.org"))
|
|
(org-agenda-overriding-header "To Read")))
|
|
(todo "TODO"
|
|
((org-agenda-files '("~/org/notes.org"))
|
|
(org-agenda-overriding-header "Note Taking")))
|
|
(todo "TODO"
|
|
((org-agenda-files '("~/org/project.org"))
|
|
(org-agenda-overriding-header "Personal projects")))
|
|
)))))
|
|
#+END_SRC
|
|
|
|
I want the default agenda view to be a weekly view, with a log of what I've done
|
|
during the day.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org-agenda
|
|
(setq org-agenda-span 'week)
|
|
(setq org-agenda-start-on-weekday 1)
|
|
(setq org-agenda-start-with-log-mode '(clock)))
|
|
#+END_SRC
|
|
|
|
I also remove the block separators in the agenda view:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org-agenda
|
|
(setq org-agenda-block-separator ""))
|
|
#+END_SRC
|
|
|
|
*** Habits
|
|
|
|
Let's enable the =org-habit= module:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(add-to-list 'org-modules 'org-habit)
|
|
#+END_SRC
|
|
|
|
*** Save all org buffers shortcut
|
|
|
|
By default bound to =C-x C-s=, rebind it to =SPC m s= in =org-agenda-mode= :
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(map! :after org-agenda
|
|
:map org-agenda-mode-map
|
|
:localleader
|
|
"s" #'org-save-all-org-buffers)
|
|
#+END_SRC
|
|
|
|
** Org IDs
|
|
|
|
Org can link to entries using UUIDs, but we need the module to be loaded for
|
|
links to work:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(add-to-list 'org-modules 'org-id)
|
|
#+END_SRC
|
|
|
|
** Roam
|
|
|
|
Setup for [[https://github.com/jethrokuan/org-roam][org-roam]].
|
|
|
|
*** Roam Directory
|
|
|
|
First, set a directory where =org-roam= will index things.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq org-roam-directory (expand-file-name "notes/" org-directory))
|
|
#+END_SRC
|
|
|
|
*** Graph browser
|
|
|
|
Instruct =org-roam= to use =firefox-developer-edition= to open the graph:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq org-roam-graph-viewer (executable-find "firefox-developer-edition"))
|
|
#+END_SRC
|
|
|
|
*** Roam link font face
|
|
|
|
Change link color for =org-roam= links, to distinguish them from standard Org
|
|
links:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org-roam
|
|
(set-face-attribute 'org-roam-link nil :foreground "#FF8860"))
|
|
#+END_SRC
|
|
|
|
*** Roam capture template
|
|
|
|
Customize the capture templates:
|
|
|
|
- the first one is [[https://github.com/jethrokuan/org-roam/blob/772505ba70c073ebc7905c4fcb8b9cc3759c775a/org-roam-capture.el#L81][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.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org-roam
|
|
(setq org-roam-capture-templates
|
|
'(("d" "default" plain (function org-roam-capture--get-point)
|
|
"%?"
|
|
:file-name "${slug}"
|
|
:head "#+TITLE: ${title}\n"
|
|
:unnarrowed t)
|
|
("i" "instant" plain (function org-roam-capture--get-point)
|
|
"%?"
|
|
:file-name "${slug}"
|
|
:head "#+TITLE: ${title}\n"
|
|
:unnarrowed t
|
|
:immediate-finish t)
|
|
("w" "website" plain (function org-roam-capture--get-point)
|
|
""
|
|
:file-name "websites/${slug}"
|
|
:head "#+TITLE: ${title}\n#+ROAM_KEY: %x\n"
|
|
:unnarrowed t)
|
|
("p" "paper" plain (function org-roam-capture--get-point)
|
|
"%?"
|
|
:file-name "papers/${slug}"
|
|
:head "#+TITLE: ${title}\n"
|
|
:unnarrowed t))))
|
|
#+END_SRC
|
|
|
|
**** Roam daily capture templates
|
|
|
|
Also setup daily captures templates, mainly used to store them in a =journal/=
|
|
directory instead of at the root.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org-roam
|
|
(setq org-roam-dailies-capture-templates
|
|
'(("d" "daily" plain (function org-roam-capture--get-point)
|
|
""
|
|
:immediate-finish t
|
|
:file-name "journal/%<%Y-%m-%d>"
|
|
:head "#+TITLE: %<%Y-%m-%d>"))))
|
|
#+END_SRC
|
|
|
|
*** Org Roam Server
|
|
=org-roam-server= provides a fancy JS interface to visualize the graph. Just
|
|
needs to be loaded, along with its dependency =simple-httpd=.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(use-package! simple-httpd)
|
|
(use-package! org-roam-server)
|
|
#+END_SRC
|
|
|
|
** Export backends
|
|
|
|
Sometimes I need to export an Org subtree to a file, which is quite easy with
|
|
the =org= export backend. It doesn't seem to be enabled by default, so let's add
|
|
it to the list:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! org
|
|
(add-to-list 'org-export-backends 'org))
|
|
#+END_SRC
|
|
|
|
** Doom specific
|
|
|
|
Doom replaces the default tab behavior on headings, this restores the default
|
|
one. Taken from [[https://github.com/hlissner/doom-emacs/tree/develop/modules/lang/org#hacks][here]].
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(after! evil-org
|
|
(remove-hook 'org-tab-first-hook #'+org-cycle-only-current-subtree-h))
|
|
#+END_SRC
|