Fix cache update when radio targets are being refreshed
* lisp/org-element.el (org-element-cache-refresh): New function. * lisp/org.el (org-update-radio-target-regexp): Make it standalone. Also refresh fontification only when necessary. (org-all-targets, org-make-target-link-regexp): Remove functions. * testing/lisp/test-org.el (test-org/update-radio-target-regexp): New test (test-org/all-targets): Remove test. We need to manually reset cache on radio links as re-fontification doesn't trigger a buffer change, and, as a consequence, a cache reset.
This commit is contained in:
parent
f7c6cf6432
commit
6eb940a8dc
|
@ -5510,8 +5510,7 @@ change, as an integer."
|
||||||
(defun org-element-cache-reset (&optional all)
|
(defun org-element-cache-reset (&optional all)
|
||||||
"Reset cache in current buffer.
|
"Reset cache in current buffer.
|
||||||
When optional argument ALL is non-nil, reset cache in all Org
|
When optional argument ALL is non-nil, reset cache in all Org
|
||||||
buffers. This function will do nothing if
|
buffers."
|
||||||
`org-element-use-cache' is nil."
|
|
||||||
(interactive "P")
|
(interactive "P")
|
||||||
(dolist (buffer (if all (buffer-list) (list (current-buffer))))
|
(dolist (buffer (if all (buffer-list) (list (current-buffer))))
|
||||||
(with-current-buffer buffer
|
(with-current-buffer buffer
|
||||||
|
@ -5530,6 +5529,14 @@ buffers. This function will do nothing if
|
||||||
(add-hook 'after-change-functions
|
(add-hook 'after-change-functions
|
||||||
#'org-element--cache-after-change nil t)))))
|
#'org-element--cache-after-change nil t)))))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun org-element-cache-refresh (pos)
|
||||||
|
"Refresh cache at position POS."
|
||||||
|
(when (org-element--cache-active-p)
|
||||||
|
(org-element--cache-sync (current-buffer) pos)
|
||||||
|
(org-element--cache-submit-request pos pos 0)
|
||||||
|
(org-element--cache-set-timer (current-buffer))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;; The Toolbox
|
;;; The Toolbox
|
||||||
|
|
65
lisp/org.el
65
lisp/org.el
|
@ -6089,12 +6089,41 @@ by a #."
|
||||||
t)))))
|
t)))))
|
||||||
|
|
||||||
(defun org-update-radio-target-regexp ()
|
(defun org-update-radio-target-regexp ()
|
||||||
"Find all radio targets in this file and update the regular expression."
|
"Find all radio targets in this file and update the regular expression.
|
||||||
|
Also refresh fontification if needed."
|
||||||
(interactive)
|
(interactive)
|
||||||
(when (memq 'radio org-activate-links)
|
(let ((old-regexp org-target-link-regexp)
|
||||||
|
(targets
|
||||||
|
(org-with-wide-buffer
|
||||||
|
(goto-char (point-min))
|
||||||
|
(let (rtn)
|
||||||
|
(while (re-search-forward org-radio-target-regexp nil t)
|
||||||
|
;; Make sure point is really within the object.
|
||||||
|
(backward-char)
|
||||||
|
(let ((obj (org-element-context)))
|
||||||
|
(when (eq (org-element-type obj) 'radio-target)
|
||||||
|
(add-to-list 'rtn (org-element-property :value obj)))))
|
||||||
|
rtn))))
|
||||||
(setq org-target-link-regexp
|
(setq org-target-link-regexp
|
||||||
(org-make-target-link-regexp (org-all-targets 'radio)))
|
(and targets
|
||||||
(org-restart-font-lock)))
|
(concat "\\(?:^\\|[^[:alnum:]]\\)\\("
|
||||||
|
(mapconcat
|
||||||
|
(lambda (x)
|
||||||
|
(replace-regexp-in-string
|
||||||
|
" +" "\\s-+" (regexp-quote x) t t))
|
||||||
|
targets
|
||||||
|
"\\|")
|
||||||
|
"\\)\\(?:$\\|[^[:alnum:]]\\)")))
|
||||||
|
(unless (equal old-regexp org-target-link-regexp)
|
||||||
|
;; Clean-up cache.
|
||||||
|
(when old-regexp
|
||||||
|
(org-with-wide-buffer
|
||||||
|
(goto-char (point-min))
|
||||||
|
(while (re-search-forward old-regexp nil t)
|
||||||
|
(org-element-cache-refresh (match-beginning 1)))))
|
||||||
|
;; Re fontify buffer.
|
||||||
|
(when (memq 'radio org-activate-links)
|
||||||
|
(org-restart-font-lock)))))
|
||||||
|
|
||||||
(defun org-hide-wide-columns (limit)
|
(defun org-hide-wide-columns (limit)
|
||||||
(let (s e)
|
(let (s e)
|
||||||
|
@ -6160,34 +6189,6 @@ done, nil otherwise."
|
||||||
(font-lock-mode -1)
|
(font-lock-mode -1)
|
||||||
(font-lock-mode 1)))
|
(font-lock-mode 1)))
|
||||||
|
|
||||||
(defun org-all-targets (&optional radio)
|
|
||||||
"Return a list of all targets in this file.
|
|
||||||
When optional argument RADIO is non-nil, only find radio
|
|
||||||
targets."
|
|
||||||
(let ((re (if radio org-radio-target-regexp org-target-regexp)) rtn)
|
|
||||||
(save-excursion
|
|
||||||
(goto-char (point-min))
|
|
||||||
(while (re-search-forward re nil t)
|
|
||||||
;; Make sure point is really within the object.
|
|
||||||
(backward-char)
|
|
||||||
(let ((obj (org-element-context)))
|
|
||||||
(when (memq (org-element-type obj) '(radio-target target))
|
|
||||||
(add-to-list 'rtn (downcase (org-element-property :value obj))))))
|
|
||||||
rtn)))
|
|
||||||
|
|
||||||
(defun org-make-target-link-regexp (targets)
|
|
||||||
"Make regular expression matching all strings in TARGETS.
|
|
||||||
The regular expression finds the targets also if there is a line break
|
|
||||||
between words."
|
|
||||||
(and targets
|
|
||||||
(concat "\\(?:^\\|[^[:alnum:]]\\)\\("
|
|
||||||
(mapconcat
|
|
||||||
(lambda (x)
|
|
||||||
(replace-regexp-in-string " +" "\\s-+" (regexp-quote x) t t))
|
|
||||||
targets
|
|
||||||
"\\|")
|
|
||||||
"\\)\\(?:$\\|[^[:alnum:]]\\)")))
|
|
||||||
|
|
||||||
(defun org-activate-tags (limit)
|
(defun org-activate-tags (limit)
|
||||||
(if (re-search-forward (org-re "^\\*+.*[ \t]\\(:[[:alnum:]_@#%:]+:\\)[ \r\n]") limit t)
|
(if (re-search-forward (org-re "^\\*+.*[ \t]\\(:[[:alnum:]_@#%:]+:\\)[ \r\n]") limit t)
|
||||||
(progn
|
(progn
|
||||||
|
|
|
@ -1514,23 +1514,20 @@ Text.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;; Targets and Radio Targets
|
;;; Radio Targets
|
||||||
|
|
||||||
|
(ert-deftest test-org/update-radio-target-regexp ()
|
||||||
|
"Test `org-update-radio-target-regexp' specifications."
|
||||||
|
(org-test-with-temp-text "radio\n\nParagraph\n\nradio"
|
||||||
|
(save-excursion (goto-char (point-max)) (org-element-context))
|
||||||
|
(insert "<<<")
|
||||||
|
(search-forward "o")
|
||||||
|
(insert ">>>")
|
||||||
|
(replace-match "<<<radio>>>")
|
||||||
|
(org-update-radio-target-regexp)
|
||||||
|
(goto-char (point-max))
|
||||||
|
(org-element-type (org-element-context))))
|
||||||
|
|
||||||
(ert-deftest test-org/all-targets ()
|
|
||||||
"Test `org-all-targets' specifications."
|
|
||||||
;; Without an argument.
|
|
||||||
(should
|
|
||||||
(equal '("radio-target" "target")
|
|
||||||
(org-test-with-temp-text "<<target>> <<<radio-target>>>\n: <<verb>>"
|
|
||||||
(org-all-targets))))
|
|
||||||
(should
|
|
||||||
(equal '("radio-target")
|
|
||||||
(org-test-with-temp-text "<<<radio-target>>>!" (org-all-targets))))
|
|
||||||
;; With argument.
|
|
||||||
(should
|
|
||||||
(equal '("radio-target")
|
|
||||||
(org-test-with-temp-text "<<target>> <<<radio-target>>>"
|
|
||||||
(org-all-targets t)))))
|
|
||||||
|
|
||||||
|
|
||||||
;;; Visibility
|
;;; Visibility
|
||||||
|
|
Loading…
Reference in New Issue