From 1b8e0924a37001deddfaeb1f84b7f0c8ff1d6159 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Fri, 8 Mar 2024 18:42:28 -0500 Subject: [PATCH] Add Org mode bug fixes section --- config.org | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/config.org b/config.org index 47efe3c..307c3a5 100644 --- a/config.org +++ b/config.org @@ -2642,6 +2642,155 @@ or no selection is made: nil is returned." selection)))) #+end_src +** Bug Fixes and Tweaks + +*** Attachment Inline Previews + +Doom patches Org mode's attachment system to show inline previews of attached images. However, this appears to be broken due to using outdated APIs, so we have to patch the link parameter responsible. + +#+begin_src emacs-lisp +(defadvice! ~/org-image-file-data-fn (protocol link _description) + "Properly handle attachment links." + :override #'+org-image-file-data-fn + (setq link + (pcase protocol + ("download" + (expand-file-name + link + (or (if (require 'org-download nil t) org-download-image-dir) + (if (require 'org-attach) org-attach-id-dir) + default-directory))) + ("attachment" + (require 'org-attach) + (org-attach-expand link)) + (_ (expand-file-name link default-directory)))) + (when (and (file-exists-p link) + (image-type-from-file-name link)) + (with-temp-buffer + (set-buffer-multibyte nil) + (setq buffer-file-coding-system 'binary) + (insert-file-contents-literally link) + (buffer-substring-no-properties (point-min) (point-max))))) + +(defadvice! ~/org-init-attach-link () + "Properly set attachment link's parameters." + :after #'+org-init-attachments-h + (org-link-set-parameters "attachment" :image-data-fun #'+org-image-file-data-fn)) +#+end_src + +*** DWIM Command and LaTeX Fragments + +The command ~+org/dwim-at-point~ will toggle all overlays in a subtree even if there are other actions that are more likely to be what the user meant (such as marking as DONE). Annoyingly, the only good way to fix this is to completely override the function. + +#+begin_src emacs-lisp +(defadvice! ~/org-dwim (old-fn &optional arg) + "Only toggle overlays in headlines if there is nothing else to do." + :override #'+org/dwim-at-point + (if (button-at (point)) + (call-interactively #'push-button) + (let* ((context (org-element-context)) + (type (org-element-type context))) + (while (and context (memq type '(verbatim code bold italic underline strike-through subscript superscript))) + (setq context (org-element-property :parent context) + type (org-element-type context))) + (pcase type + ((or `citation `citation-reference) + (org-cite-follow context arg)) + (`headline + (cond ((memq (bound-and-true-p org-goto-map) + (current-active-maps)) + (org-goto-ret)) + ((and (fboundp 'toc-org-insert-toc) + (member "TOC" (org-get-tags))) + (toc-org-insert-toc) + (message "Updating table of contents")) + ((string= "ARCHIVE" (car-safe (org-get-tags))) + (org-force-cycle-archived)) + ((or (org-element-property :todo-type context) + (org-element-property :scheduled context)) + (org-todo + (if (eq (org-element-property :todo-type context) 'done) + (or (car (+org-get-todo-keywords-for (org-element-property :todo-keyword context))) + 'todo) + 'done))) + (t + (let* ((beg (if (org-before-first-heading-p) + (line-beginning-position) + (save-excursion (org-back-to-heading) (point)))) + (end (if (org-before-first-heading-p) + (line-end-position) + (save-excursion (org-end-of-subtree) (point)))) + (overlays (ignore-errors (overlays-in beg end))) + (latex-overlays + (cl-find-if (lambda (o) (eq (overlay-get o 'org-overlay-type) 'org-latex-overlay)) + overlays)) + (image-overlays + (cl-find-if (lambda (o) (overlay-get o 'org-image-overlay)) + overlays))) + (+org--toggle-inline-images-in-subtree beg end) + (if (or image-overlays latex-overlays) + (org-clear-latex-preview beg end) + (org--latex-preview-region beg end))))) + (org-update-checkbox-count) + (org-update-parent-todo-statistics) + (when (and (fboundp 'toc-org-insert-toc) + (member "TOC" (org-get-tags))) + (toc-org-insert-toc) + (message "Updating table of contents")) + ) + (`clock (org-clock-update-time-maybe)) + (`footnote-reference + (org-footnote-goto-definition + (org-element-property :label context))) + (`footnote-definition + (org-footnote-goto-previous-reference + (org-element-property :label context))) + ((or `planning `timestamp) + (org-follow-timestamp-link)) + ((or `table `table-row) + (if (org-at-TBLFM-p) + (org-table-calc-current-TBLFM) + (ignore-errors + (save-excursion + (goto-char (org-element-property :contents-begin context)) + (org-call-with-arg 'org-table-recalculate (or arg t)))))) + (`table-cell + (org-table-blank-field) + (org-table-recalculate arg) + (when (and (string-empty-p (string-trim (org-table-get-field))) + (bound-and-true-p evil-local-mode)) + (evil-change-state 'insert))) + (`babel-call + (org-babel-lob-execute-maybe)) + (`statistics-cookie + (save-excursion (org-update-statistics-cookies arg))) + ((or `src-block `inline-src-block) + (org-babel-execute-src-block arg)) + ((or `latex-fragment `latex-environment) + (org-latex-preview arg)) + (`link + (let* ((lineage (org-element-lineage context '(link) t)) + (path (org-element-property :path lineage))) + (if (or (equal (org-element-property :type lineage) "img") + (and path (image-type-from-file-name path))) + (+org--toggle-inline-images-in-subtree + (org-element-property :begin lineage) + (org-element-property :end lineage)) + (org-open-at-point arg)))) + ((guard (org-element-property :checkbox (org-element-lineage context '(item) t))) + (org-toggle-checkbox)) + (`paragraph + (+org--toggle-inline-images-in-subtree)) + (_ + (if (or (org-in-regexp org-ts-regexp-both nil t) + (org-in-regexp org-tsr-regexp-both nil t) + (org-in-regexp org-link-any-re nil t)) + (call-interactively #'org-open-at-point) + (+org--toggle-inline-images-in-subtree + (org-element-property :begin context) + (org-element-property :end context)))))))) +#+end_src + ** Tags Org mode offers a useful tag hierarchy system, configured via ~org-tag-alist~. We'll be using ~org-tag-persistent-alist~ instead so that our tag hierarchy can't be overwritten.