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.
This commit is contained in:
parent
fd8ddf2874
commit
55fd660b4e
|
@ -1188,7 +1188,7 @@ parse properties for property drawer at point."
|
||||||
(property-name-symbol (intern property-name))
|
(property-name-symbol (intern property-name))
|
||||||
(property-value
|
(property-value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--substring
|
t #'org-element--substring
|
||||||
(- (match-beginning 3) begin)
|
(- (match-beginning 3) begin)
|
||||||
(- (match-end 3) begin))))
|
(- (match-end 3) begin))))
|
||||||
(cond
|
(cond
|
||||||
|
@ -1355,7 +1355,7 @@ Throw `:org-element-deferred-retry' signal at the end."
|
||||||
(title-end (point))
|
(title-end (point))
|
||||||
(raw-value
|
(raw-value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--headline-raw-value
|
t #'org-element--headline-raw-value
|
||||||
(- title-start begin) (- title-end begin))))
|
(- title-start begin) (- title-end begin))))
|
||||||
(org-element-put-property headline :raw-value raw-value)
|
(org-element-put-property headline :raw-value raw-value)
|
||||||
(org-element-put-property headline :level level)
|
(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
|
(defconst org-element--headline-parse-title-raw
|
||||||
(org-element-deferred-create
|
(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.")
|
"Constant holding deferred value for raw headline `:title' property.")
|
||||||
|
|
||||||
(defconst org-element--headline-parse-title-parse
|
(defconst org-element--headline-parse-title-parse
|
||||||
(org-element-deferred-create
|
(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.")
|
"Constant holding deferred value for parsed headline `:title' property.")
|
||||||
|
|
||||||
(defconst org-element--headline-deferred
|
(defconst org-element--headline-deferred
|
||||||
|
@ -2414,7 +2414,7 @@ Assume point is at comment block beginning."
|
||||||
(if (eobp) (point) (line-beginning-position))))
|
(if (eobp) (point) (line-beginning-position))))
|
||||||
(value
|
(value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--substring
|
t #'org-element--substring
|
||||||
(- contents-begin begin)
|
(- contents-begin begin)
|
||||||
(- contents-end begin))))
|
(- contents-end begin))))
|
||||||
(org-element-create
|
(org-element-create
|
||||||
|
@ -2532,7 +2532,7 @@ Return a new syntax node of `example-block' type containing `:begin',
|
||||||
(contents-begin (line-beginning-position 2))
|
(contents-begin (line-beginning-position 2))
|
||||||
(value
|
(value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--unescape-substring
|
t #'org-element--unescape-substring
|
||||||
(- contents-begin begin)
|
(- contents-begin begin)
|
||||||
(- contents-end begin)))
|
(- contents-end begin)))
|
||||||
(pos-before-blank (progn (goto-char contents-end)
|
(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))))
|
(if (eobp) (point) (line-beginning-position))))
|
||||||
(value
|
(value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--unescape-substring
|
t #'org-element--unescape-substring
|
||||||
(- contents-begin begin)
|
(- contents-begin begin)
|
||||||
(- contents-end begin))))
|
(- contents-end begin))))
|
||||||
(org-element-create
|
(org-element-create
|
||||||
|
@ -2800,7 +2800,7 @@ Assume point is at the beginning of the latex environment."
|
||||||
(begin (car affiliated))
|
(begin (car affiliated))
|
||||||
(value
|
(value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--substring
|
t #'org-element--substring
|
||||||
(- code-begin begin)
|
(- code-begin begin)
|
||||||
(- code-end begin)))
|
(- code-end begin)))
|
||||||
(end (progn (skip-chars-forward " \r\t\n" limit)
|
(end (progn (skip-chars-forward " \r\t\n" limit)
|
||||||
|
@ -3059,7 +3059,7 @@ Assume point is at the beginning of the block."
|
||||||
;; Retrieve code.
|
;; Retrieve code.
|
||||||
(value
|
(value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--unescape-substring
|
t #'org-element--unescape-substring
|
||||||
(- (line-beginning-position 2) begin)
|
(- (line-beginning-position 2) begin)
|
||||||
(- contents-end begin)))
|
(- contents-end begin)))
|
||||||
(pos-before-blank (progn (goto-char contents-end)
|
(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)
|
:contents-end (and (eq type 'org) table-end)
|
||||||
:value (and (eq type 'table.el)
|
:value (and (eq type 'table.el)
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--substring
|
t #'org-element--substring
|
||||||
(- table-begin begin)
|
(- table-begin begin)
|
||||||
(- table-end begin)))
|
(- table-end begin)))
|
||||||
:post-blank (count-lines pos-before-blank end)
|
:post-blank (count-lines pos-before-blank end)
|
||||||
|
@ -3322,7 +3322,7 @@ Assume point is at first MARK."
|
||||||
(list :value
|
(list :value
|
||||||
(and (memq type '(code verbatim))
|
(and (memq type '(code verbatim))
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--substring
|
t #'org-element--substring
|
||||||
(- contents-begin origin)
|
(- contents-begin origin)
|
||||||
(- contents-end origin))))
|
(- contents-end origin))))
|
||||||
(list :contents-begin contents-begin
|
(list :contents-begin contents-begin
|
||||||
|
@ -3572,7 +3572,7 @@ Assume point is at the beginning of the snippet."
|
||||||
(value
|
(value
|
||||||
(when contents-end
|
(when contents-end
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--substring
|
t #'org-element--substring
|
||||||
(- contents-begin begin)
|
(- contents-begin begin)
|
||||||
(- contents-end begin))))
|
(- contents-end begin))))
|
||||||
(post-blank (skip-chars-forward " \t"))
|
(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)))))
|
(replace-regexp-in-string "\n[ \t]*" " " (org-trim p)))))
|
||||||
(value
|
(value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--substring
|
t #'org-element--substring
|
||||||
0 (- (point) begin)))
|
0 (- (point) begin)))
|
||||||
(post-blank (skip-chars-forward " \t"))
|
(post-blank (skip-chars-forward " \t"))
|
||||||
(end (point)))
|
(end (point)))
|
||||||
|
@ -3801,7 +3801,7 @@ Assume point is at the beginning of the LaTeX fragment."
|
||||||
'latex-fragment
|
'latex-fragment
|
||||||
(list :value
|
(list :value
|
||||||
(org-element-deferred-create
|
(org-element-deferred-create
|
||||||
nil #'org-element--substring
|
t #'org-element--substring
|
||||||
0 (- after-fragment begin))
|
0 (- after-fragment begin))
|
||||||
:begin begin
|
:begin begin
|
||||||
:end end
|
:end end
|
||||||
|
|
Loading…
Reference in New Issue