From 55fd660b4e33f215c8af7a3bfe16dc198f1a6159 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Fri, 14 Jun 2024 16:22:00 +0200 Subject: [PATCH] org-element: Auto-undefer deferred properties that depend on buffer positions * lisp/org-element.el (org-element--get-node-properties): (org-element--headline-parse-title): (org-element--headline-parse-title-raw): (org-element--headline-parse-title-parse): (org-element-comment-block-parser): (org-element-example-block-parser): (org-element-export-block-parser): (org-element-latex-environment-parser): (org-element-src-block-parser): (org-element-table-parser): (org-element--parse-generic-emphasis): (org-element-export-snippet-parser): (org-element-inline-babel-call-parser): (org-element-latex-fragment-parser): Auto-undefer node properties that are calculated based on buffer position of the node. This will make the return value of `org-element-at-point' a little more robust once the buffer is modified. The :begin/:end, and other positional properties may not be up-to-date, but at least some other properties may be "frozen" if they are undeferred early. Auto-undefer is still disabled for properties that do not depend on buffer positions and may benefit from dynamic calculation that takes into account syntax changes that are influenced by global variables. --- lisp/org-element.el | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index b15f0b69d..191bb5698 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -1188,7 +1188,7 @@ parse properties for property drawer at point." (property-name-symbol (intern property-name)) (property-value (org-element-deferred-create - nil #'org-element--substring + t #'org-element--substring (- (match-beginning 3) begin) (- (match-end 3) begin)))) (cond @@ -1355,7 +1355,7 @@ Throw `:org-element-deferred-retry' signal at the end." (title-end (point)) (raw-value (org-element-deferred-create - nil #'org-element--headline-raw-value + t #'org-element--headline-raw-value (- title-start begin) (- title-end begin)))) (org-element-put-property headline :raw-value raw-value) (org-element-put-property headline :level level) @@ -1386,12 +1386,12 @@ Throw `:org-element-deferred-retry' signal at the end." (defconst org-element--headline-parse-title-raw (org-element-deferred-create - nil #'org-element--headline-parse-title t) + t #'org-element--headline-parse-title t) "Constant holding deferred value for raw headline `:title' property.") (defconst org-element--headline-parse-title-parse (org-element-deferred-create - nil #'org-element--headline-parse-title nil) + t #'org-element--headline-parse-title nil) "Constant holding deferred value for parsed headline `:title' property.") (defconst org-element--headline-deferred @@ -2414,7 +2414,7 @@ Assume point is at comment block beginning." (if (eobp) (point) (line-beginning-position)))) (value (org-element-deferred-create - nil #'org-element--substring + t #'org-element--substring (- contents-begin begin) (- contents-end begin)))) (org-element-create @@ -2532,7 +2532,7 @@ Return a new syntax node of `example-block' type containing `:begin', (contents-begin (line-beginning-position 2)) (value (org-element-deferred-create - nil #'org-element--unescape-substring + t #'org-element--unescape-substring (- contents-begin begin) (- contents-end begin))) (pos-before-blank (progn (goto-char contents-end) @@ -2612,7 +2612,7 @@ Assume point is at export-block beginning." (if (eobp) (point) (line-beginning-position)))) (value (org-element-deferred-create - nil #'org-element--unescape-substring + t #'org-element--unescape-substring (- contents-begin begin) (- contents-end begin)))) (org-element-create @@ -2800,7 +2800,7 @@ Assume point is at the beginning of the latex environment." (begin (car affiliated)) (value (org-element-deferred-create - nil #'org-element--substring + t #'org-element--substring (- code-begin begin) (- code-end begin))) (end (progn (skip-chars-forward " \r\t\n" limit) @@ -3059,7 +3059,7 @@ Assume point is at the beginning of the block." ;; Retrieve code. (value (org-element-deferred-create - nil #'org-element--unescape-substring + t #'org-element--unescape-substring (- (line-beginning-position 2) begin) (- contents-end begin))) (pos-before-blank (progn (goto-char contents-end) @@ -3159,7 +3159,7 @@ Assume point is at the beginning of the table." :contents-end (and (eq type 'org) table-end) :value (and (eq type 'table.el) (org-element-deferred-create - nil #'org-element--substring + t #'org-element--substring (- table-begin begin) (- table-end begin))) :post-blank (count-lines pos-before-blank end) @@ -3322,7 +3322,7 @@ Assume point is at first MARK." (list :value (and (memq type '(code verbatim)) (org-element-deferred-create - nil #'org-element--substring + t #'org-element--substring (- contents-begin origin) (- contents-end origin)))) (list :contents-begin contents-begin @@ -3572,7 +3572,7 @@ Assume point is at the beginning of the snippet." (value (when contents-end (org-element-deferred-create - nil #'org-element--substring + t #'org-element--substring (- contents-begin begin) (- contents-end begin)))) (post-blank (skip-chars-forward " \t")) @@ -3667,7 +3667,7 @@ Assume point is at the beginning of the babel call." (replace-regexp-in-string "\n[ \t]*" " " (org-trim p))))) (value (org-element-deferred-create - nil #'org-element--substring + t #'org-element--substring 0 (- (point) begin))) (post-blank (skip-chars-forward " \t")) (end (point))) @@ -3801,7 +3801,7 @@ Assume point is at the beginning of the LaTeX fragment." 'latex-fragment (list :value (org-element-deferred-create - nil #'org-element--substring + t #'org-element--substring 0 (- after-fragment begin)) :begin begin :end end