(fix)utils: org-roam-set-keyword skip over all drawers (#1931)

Previously org-roam-set-keyword was unable to handle the syntax of the
:LOGBOOK: drawer. We introduce `org-roam-end-of-meta-data` to move point
over all drawers, allowing us to set the keyword in the right place.
This commit is contained in:
Jethro Kuan
2021-11-01 14:39:50 +08:00
committed by GitHub
parent c789531e36
commit 3e47f198c7

View File

@@ -228,6 +228,41 @@ If BOUND, scan up to BOUND bytes of the buffer."
(when (re-search-forward re bound t) (when (re-search-forward re bound t)
(buffer-substring-no-properties (match-beginning 1) (match-end 1)))))) (buffer-substring-no-properties (match-beginning 1) (match-end 1))))))
(defun org-roam-end-of-meta-data (&optional full)
"Like `org-end-of-meta-data', but supports file-level metadata.
When optional argument FULL is t, also skip planning information,
clocking lines and any kind of drawer.
When FULL is non-nil but not t, skip planning information,
properties, clocking lines and logbook drawers."
(org-back-to-heading-or-point-min t)
;; Skip planning information.
(when (looking-at-p org-planning-line-re) (forward-line))
;; Skip property drawer.
(when (looking-at org-property-drawer-re)
(goto-char (match-end 0))
(forward-line))
;; When FULL is not nil, skip more.
(when (and full (not (org-at-heading-p)))
(catch 'exit
(let ((end (save-excursion (outline-next-heading) (point)))
(re (concat "[ \t]*$" "\\|" org-clock-line-re)))
(while (not (eobp))
(cond ;; Skip clock lines.
((looking-at-p re) (forward-line))
;; Skip logbook drawer.
((looking-at-p org-logbook-drawer-re)
(if (re-search-forward "^[ \t]*:END:[ \t]*$" end t)
(forward-line)
(throw 'exit t)))
;; When FULL is t, skip regular drawer too.
((and (eq full t) (looking-at-p org-drawer-regexp))
(if (re-search-forward "^[ \t]*:END:[ \t]*$" end t)
(forward-line)
(throw 'exit t)))
(t (throw 'exit t))))))))
(defun org-roam-set-keyword (key value) (defun org-roam-set-keyword (key value)
"Set keyword KEY to VALUE. "Set keyword KEY to VALUE.
If the property is already set, it's value is replaced." If the property is already set, it's value is replaced."
@@ -237,14 +272,13 @@ If the property is already set, it's value is replaced."
(if (string-blank-p value) (if (string-blank-p value)
(kill-whole-line) (kill-whole-line)
(replace-match (concat " " value) 'fixedcase nil nil 1)) (replace-match (concat " " value) 'fixedcase nil nil 1))
(while (and (not (eobp)) (org-roam-end-of-meta-data)
(looking-at "^[#:]"))
(if (save-excursion (end-of-line) (eobp)) (if (save-excursion (end-of-line) (eobp))
(progn (progn
(end-of-line) (end-of-line)
(insert "\n")) (insert "\n"))
(forward-line) (forward-line)
(beginning-of-line))) (beginning-of-line))
(insert "#+" key ": " value "\n"))))) (insert "#+" key ": " value "\n")))))
(defun org-roam-erase-keyword (keyword) (defun org-roam-erase-keyword (keyword)