;; -*- lexical-binding: 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) :hook (org-mode . visual-line-mode) :pretty-hydra ;; See `org-structure-template-alist' ((:color blue :quit-key ("q" "C-g")) ("Basic" (("a" (hot-expand "" . org-insert-subheading) ("C-'" . nil)) :config (elemacs-load-packages-incrementally '(calendar find-func format-spec org-macs org-compat org-faces org-entities org-list org-pcomplete org-src org-footnote org-macro ob org org-clock org-agenda org-capture)) (add-hook 'org-mode-hook (lambda () (yas-activate-extra-mode 'LaTeX-mode))) ;; For hydra (defun hot-expand (str &optional mod) "Expand org template. STR is a structure template string recognised by org like > info caddr (alist-get :file)) "org-src-babel.tmp")) (when (fboundp 'lsp-deferred) ;; Avoid headerline conflicts (setq-local lsp-headerline-breadcrumb-enable nil) (lsp-deferred) (_ (user-error "LSP:: invalid type")))) (put ',intern-pre 'function-documentation (format "Enable lsp-mode in the buffer of org source block (%s)." (upcase ,lang))) (if (fboundp ',edit-pre) (advice-add ',edit-pre :after ',intern-pre) (progn (defun ,edit-pre (info) (,intern-pre info)) (put ',edit-pre 'function-documentation (format "Prepare local buffer environment for org source block (%s)." (upcase ,lang)))))))) (defconst org-babel-lang-list '("go" "python" "ipython" "ruby" "js" "css" "sass" "c" "rust" "java" "cpp" "c++" "shell" "haskell") "The supported programming languages for interactive Babel.") (dolist (lang org-babel-lang-list) (eval `(lsp-org-babel-enable ,lang))) ) (use-package org-contrib) (with-eval-after-load 'org (setq org-highlight-latex-and-related '(native script entities))) (use-package org-modern :after org :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 (elpaca-after-init . global-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) :bind ("C-c C-x SPC" . org-latex-preview-clear-cache) :config ;; preview buffer on enter (add-hook 'org-mode-hook (lambda () (run-with-idle-timer 0.5 nil (lambda () (org-latex-preview '(16)))))) ;; Add margin and rescale display math (defvar my/org-latex-display-math-scale 1) (defvar my/org-latex-display-math-margin 5) (defun my/org-latex-preview-add-margin-advice (ov _path-info) (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 'preview-image)) ((and (consp img) (eq (car img) 'image)))) (let* ((plist (copy-sequence (cdr img))) (height (plist-get plist :height))) (when (and (consp height) (numberp (car height))) (setq plist (plist-put plist :height (cons (* my/org-latex-display-math-scale (car height)) (cdr height))))) (setq plist (plist-put plist :margin my/org-latex-display-math-margin)) (let ((new-img (cons 'image plist))) (overlay-put ov 'preview-image new-img) (when (overlay-get ov 'display) (overlay-put ov 'display new-img))))))) (advice-add 'org-latex-preview--update-overlay :after #'my/org-latex-preview-add-margin-advice) ;; (setq org-latex-preview-numbered t) (setq org-latex-preview-mode-display-live t) (setq org-latex-preview-process-default 'dvisvgm) (setq org-latex-preview-mode-update-delay 0.25) ;; Centre display maths (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))) (defun my/text-scale-adjust-latex-previews () "Adjust the size of latex preview fragments when changing the buffer's text scale." (pcase major-mode ('latex-mode (dolist (ov (overlays-in (point-min) (point-max))) (if (eq (overlay-get ov 'category) 'preview-overlay) (my/text-scale--resize-fragment ov)))) ('org-mode (dolist (ov (overlays-in (point-min) (point-max))) (if (eq (overlay-get ov 'org-overlay-type) 'org-latex-overlay) (my/text-scale--resize-fragment ov)))))) (defun my/text-scale--resize-fragment (ov) (overlay-put ov 'display (cons 'image (plist-put (cdr (overlay-get ov 'display)) :scale (+ 1.0 (* 0.25 text-scale-mode-amount)))))) (add-hook 'text-scale-mode-hook #'my/text-scale-adjust-latex-previews)) (use-package org-roam :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) ("C-c n w" . org-roam-refile) ;; Dailies ("C-c n j" . org-roam-dailies-capture-today)) :bind (:map org-mode-map ("C-c C-x i" . org-id-get-create)) :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 :autoload org-download-clipboard :hook ((org-mode dired-mode) . org-download-enable) :bind (:map org-mode-map ("C-M-y" . org-download-clipboard)) :config (setq-default org-download-heading-lvl 1) (defconst org-download-image-dir "./attachments/") (setq-default org-download-method 'directory)) (use-package valign :hook (org-mode . valign-mode)) (use-package djvu) (use-package org-noter) (provide 'init-org)