Files
.emacs.d/lisp/init-org.el
2025-12-23 07:34:32 +11:00

260 lines
10 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;; -*- lexical-binding: t -*-
;; (defun org-capture-init()
;; (setq org-capture-templates
;; '(("t" "Personal todo" entry ("Inbox")
;; "* TODO %?\n%i\n%a" :prepend t))))
(use-package org
:defer
:ensure `(org :repo "https://code.tecosaur.net/tec/org-mode.git/"
:branch "dev")
:hook (org-mode . org-cdlatex-mode)
:hook (org-mode . org-indent-mode)
:pretty-hydra
;; See `org-structure-template-alist'
((:color blue :quit-key ("q" "C-g"))
("Basic"
(("a" (hot-expand "<a") "ascii")
("c" (hot-expand "<c") "center")
("C" (hot-expand "<C") "comment")
("x" (hot-expand "<e") "example")
("E" (hot-expand "<E") "export")
("l" (hot-expand "<l") "latex")
("n" (hot-expand "<n") "note")
("O" (hot-expand "<q") "quote")
("v" (hot-expand "<v") "verse"))
"Head"
(("i" (hot-expand "<i") "index")
("A" (hot-expand "<A") "ASCII")
("I" (hot-expand "<I") "INCLUDE")
("H" (hot-expand "<H") "HTML")
("L" (hot-expand "<L") "LaTeX"))
"Source"
(("s" (hot-expand "<s") "src")
("e" (hot-expand "<s" "emacs-lisp") "emacs-lisp")
("y" (hot-expand "<s" "python :results output") "python")
("p" (hot-expand "<s" "perl") "perl")
("w" (hot-expand "<s" "powershell") "powershell")
("r" (hot-expand "<s" "ruby") "ruby")
("S" (hot-expand "<s" "sh") "sh")
("h" (hot-expand "<s" "haskell") "haskell")
("o" (hot-expand "<s" "ocaml") "ocaml")
("g" (hot-expand "<s" "go :imports '\(\"fmt\"\)") "golang"))
"Misc"
(("m" (hot-expand "<s" "mermaid :file chart.png") "mermaid")
("u" (hot-expand "<s" "plantuml :file chart.png") "plantuml")
("Y" (hot-expand "<s" "ipython :session :exports both :results raw drawer\n$0") "ipython")
("P" (progn
(insert "#+HEADERS: :results output :exports both :shebang \"#!/usr/bin/env perl\"\n")
(hot-expand "<s" "perl")) "Perl tangled")
("<" self-insert-command "ins"))))
:bind (:map org-mode-map
("<" . (lambda ()
"Insert org template."
(interactive)
(if (or (region-active-p) (looking-back "^\s*" 1))
(org-hydra/body)
(self-insert-command 1))))
("M-<return>" . org-insert-subheading))
:config
;; For hydra
(defun hot-expand (str &optional mod)
"Expand org template.
STR is a structure template string recognised by org like <s. MOD is a
string with additional parameters to add the begin line of the structure
element. HEADER string includes more parameters that are prepended to
the element after the #+HEADER: tag."
(let (text)
(when (region-active-p)
(setq text (buffer-substring (region-beginning) (region-end)))
(delete-region (region-beginning) (region-end)))
(insert str)
(if (fboundp 'org-try-structure-completion)
(org-try-structure-completion) ; < org 9
(progn
;; New template expansion since org 9
(require 'org-tempo nil t)
(org-tempo-complete-tag)))
(when mod (insert mod) (forward-line))
(when text (insert text))))
;; (org-capture-init)
(add-to-list 'org-modules 'org-habit)
(setq org-directory "~/org/")
(add-to-list 'org-agenda-files "~/org")
(setq org-highlight-latex-and-related '(native latex entities))
(setq org-startup-indented t)
(setq org-pretty-entities t
org-pretty-entities-include-sub-superscripts nil)
(setq org-default-note-file (expand-file-name "notes.org" org-directory)
org-capture-templates
'(("t" "Personal todo" entry
(file+headline "todo.org" "Inbox")
"* TODO %?\n%i\n%a" :prepend t)
("n" "Personal notes" entry
(file+headline "notes.org" "Inbox")
"* %u %?\n%i\n%a" :prepend t)
("j" "Journal" entry
(file+olp+datetree "diary.org")
"* %U %?\n%i\n%a" :prepend t))
org-todo-keyword
'((sequence "TODO(t)" "IN-PROGRESS(i)" "|" "DONE(d)" "NO(n)")))
(add-to-list 'org-src-block-faces '("latex" (:inherit default :extend t)))
(add-hook 'org-after-refile-insert-hook
(defun save-buffer-after-capture ()
(when (bound-and-true-p org-capture-is-refiling)
(save-buffer)))))
(use-package org-contrib)
(with-eval-after-load 'org
(setq org-highlight-latex-and-related '(native script entities)))
(use-package org-modern
:hook (org-mode . org-modern-mode)
:hook (org-agenda-finalize . org-modern-agenda)
:init
(with-eval-after-load 'org
(setq org-hide-emphasis-markers t
org-pretty-entities t))
:config
(setq org-modern-table-vertical 1
org-modern-table-horizontal 0.2
org-modern-todo-faces
'(("TODO" :inverse-video t :inherit org-todo)
("PROJ" :inverse-video t :inherit +org-todo-project)
("STRT" :inverse-video t :inherit +org-todo-active)
("[-]" :inverse-video t :inherit +org-todo-active)
("HOLD" :inverse-video t :inherit +org-todo-onhold)
("WAIT" :inverse-video t :inherit +org-todo-onhold)
("[?]" :inverse-video t :inherit +org-todo-onhold)
("KILL" :inverse-video t :inherit +org-todo-cancel)
("NO" :inverse-video t :inherit +org-todo-cancel))
org-modern-list '((43 . "")
(45 . "")
(42 . ""))
))
(use-package org-modern-indent
:ensure (org-modern-indent :type git :host github :repo "jdtsmith/org-modern-indent")
:config ; add late to hook
(add-hook 'org-mode-hook #'org-modern-indent-mode 90))
(use-package org-appear
:hook (org-mode . org-appear-mode)
:config
(setq org-appear-autoemphasis t
org-appear-autosubmarkers t
org-appear-autolinks nil)
(run-at-time nil nil #'org-appear--set-elements))
(use-package hl-todo
:hook (prog-mode . hl-todo-mode)
:hook (yaml-mode . hl-todo-mode)
:config
(setq hl-todo-highlight-punctuation ":"
hl-todo-keyword-faces
'(;; For reminders to change or add something at a later date.
("TODO" warning bold)
;; For code (or code paths) that are broken, unimplemented, or slow,
;; and may become bigger problems later.
("FIXME" error bold)
;; For code that needs to be revisited later, either to upstream it,
;; improve it, or address non-critical issues.
("REVIEW" font-lock-keyword-face bold)
;; For code smells where questionable practices are used
;; intentionally, and/or is likely to break in a future update.
("HACK" font-lock-constant-face bold)
;; For sections of code that just gotta go, and will be gone soon.
;; Specifically, this means the code is deprecated, not necessarily
;; the feature it enables.
("DEPRECATED" font-lock-doc-face bold)
;; Extra keywords commonly found in the wild, whose meaning may vary
;; from project to project.
("NOTE" success bold)
("BUG" error bold)
("XXX" font-lock-constant-face bold))))
(use-package org-latex-preview
:ensure nil
:hook (org-mode . org-latex-preview-mode)
:hook (org-latex-preview-mode . org-latex-preview-center-mode)
:config
;; Increase preview width
(plist-put org-latex-preview-appearance-options
:page-width 0.8)
;; ;; Block C-n, C-p etc from opening up previews when using `org-latex-preview-mode'
;; (setq org-latex-preview-mode-ignored-commands
;; '(next-line previous-line mwheel-scroll
;; scroll-up-command scroll-down-command))
(setq org-latex-preview-numbered t)
(setq org-latex-preview-mode-display-live t)
(setq org-latex-preview-mode-update-delay 0.25))
(defun my/org-latex-preview-uncenter (ov)
(overlay-put ov 'before-string nil))
(defun my/org-latex-preview-recenter (ov)
(overlay-put ov 'before-string (overlay-get ov 'justify)))
(defun my/org-latex-preview-center (ov)
(save-excursion
(goto-char (overlay-start ov))
(when-let* ((elem (org-element-context))
((or (eq (org-element-type elem) 'latex-environment)
(string-match-p "^\\\\\\[" (org-element-property :value elem))))
(img (overlay-get ov 'display))
(prop `(space :align-to (- center (0.55 . ,img))))
(justify (propertize " " 'display prop 'face 'default)))
(overlay-put ov 'justify justify)
(overlay-put ov 'before-string (overlay-get ov 'justify)))))
(define-minor-mode org-latex-preview-center-mode
"Center equations previewed with `org-latex-preview'."
:global nil
(if org-latex-preview-center-mode
(progn
(add-hook 'org-latex-preview-overlay-open-functions
#'my/org-latex-preview-uncenter nil :local)
(add-hook 'org-latex-preview-overlay-close-functions
#'my/org-latex-preview-recenter nil :local)
(add-hook 'org-latex-preview-overlay-update-functions
#'my/org-latex-preview-center nil :local))
(remove-hook 'org-latex-preview-overlay-close-functions
#'my/org-latex-preview-recenter)
(remove-hook 'org-latex-preview-overlay-update-functions
#'my/org-latex-preview-center)
(remove-hook 'org-latex-preview-overlay-open-functions
#'my/org-latex-preview-uncenter)))
(use-package org-roam
:ensure t
:defer
:custom
(org-roam-directory (file-truename "~/org/roam"))
:bind (("C-c n l" . org-roam-buffer-toggle)
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
("C-c n i" . org-roam-node-insert)
("C-c n c" . org-roam-capture)
;; Dailies
("C-c n j" . org-roam-dailies-capture-today))
:config
;; If you're using a vertical completion framework, you might want a more informative completion interface
(setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag)))
(org-roam-db-autosync-mode)
;; If using org-roam-protocol
(require 'org-roam-protocol))
(use-package org-roam-ui)
(use-package org-download
:after org)
(provide 'init-org)