diff options
author | Case Duckworth | 2021-04-13 17:43:39 -0500 |
---|---|---|
committer | Case Duckworth | 2021-04-13 17:43:39 -0500 |
commit | 29bbc0faa64bbeecc4423f17a12111405a28b63c (patch) | |
tree | 6f2c605a025dc0c07c3c3992ce7a907831299269 | |
parent | Fix a bug with paredit not properly indenting lisp (diff) | |
download | emacs-29bbc0faa64bbeecc4423f17a12111405a28b63c.tar.gz emacs-29bbc0faa64bbeecc4423f17a12111405a28b63c.zip |
Add a generate custom ids function for headings
From amitp.blogspot.com.
-rw-r--r-- | lisp/acdw-org.el | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lisp/acdw-org.el b/lisp/acdw-org.el index 47e8eb2..48760a2 100644 --- a/lisp/acdw-org.el +++ b/lisp/acdw-org.el | |||
@@ -181,6 +181,42 @@ appropriate. In tables, insert a new row or end the table." | |||
181 | (let ((current-prefix-arg 4)) | 181 | (let ((current-prefix-arg 4)) |
182 | (call-interactively #'unpackaged/org-fix-blank-lines)))) | 182 | (call-interactively #'unpackaged/org-fix-blank-lines)))) |
183 | 183 | ||
184 | |||
185 | ;;; Generate custom IDs: | ||
186 | ;; https://amitp.blogspot.com/2021/04/automatically-generate-ids-for-emacs.html | ||
187 | |||
188 | (defun acdw-org/generate-custom-ids () | ||
189 | "Generate CUSTOM_ID for any headings that are missing one." | ||
190 | (let ((existing-ids (org-map-entries (lambda () | ||
191 | (org-entry-get nil "CUSTOM_ID"))))) | ||
192 | (org-map-entries | ||
193 | (lambda () | ||
194 | (let* ((custom-id (org-entry-get nil "CUSTOM_ID")) | ||
195 | (heading (org-heading-components)) | ||
196 | (level (nth 0 heading)) | ||
197 | (todo (nth 2 heading)) | ||
198 | (headline (nth 4 heading)) | ||
199 | (slug (acdw-org/title-to-filename headline)) | ||
200 | (duplicate-id (member slug existing-ids))) | ||
201 | (when (and (not custom-id) | ||
202 | (< level 4) | ||
203 | (not todo) | ||
204 | (not duplicate-id)) | ||
205 | (message "Adding entry '%s' to '%s'" slug headline) | ||
206 | (org-entry-put nil "CUSTOM_ID" slug))))))) | ||
207 | |||
208 | (defun acdw-org/title-to-filename (title) | ||
209 | "Convert TITLE to a reasonable filename." | ||
210 | ;; Based on the slug logic in `org-roam', but `org-roam' also uses a | ||
211 | ;; timestamp, and I only use the slug. | ||
212 | (setq title (s-downcase title)) | ||
213 | (setq title (s-replace-regexp "[^a-zA-Z0-9]+" "-" title)) | ||
214 | (setq title (s-replace-regexp "-+" "-" title)) | ||
215 | (setq title (s-replace-regexp "^-" "" title)) | ||
216 | (setq title (s-replace-regexp "-$" "" title)) | ||
217 | title) | ||
218 | |||
219 | |||
184 | ;;; ADVICE | 220 | ;;; ADVICE |
185 | 221 | ||
186 | ;; Correct `org-delete-backward-char' to use `backward-delete-char-untabify' | 222 | ;; Correct `org-delete-backward-char' to use `backward-delete-char-untabify' |