mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-13 09:32:47 +00:00
* lisp/emacs-lisp/syntax.el: Fix bug#41195
Allow use of `syntax-ppss-flush-cache` in `syntax-propertize-function`. (syntax-propertize--inhibit-flush): New var. (syntax-propertize): Bind it. (syntax-ppss-flush-cache): Test it.
This commit is contained in:
parent
3b170f04f4
commit
45fa5e9724
@ -63,9 +63,10 @@ override the buffer's syntax table for special syntactic constructs that
|
||||
cannot be handled just by the buffer's syntax-table.
|
||||
|
||||
The specified function may call `syntax-ppss' on any position
|
||||
before END, but it should not call `syntax-ppss-flush-cache',
|
||||
which means that it should not call `syntax-ppss' on some
|
||||
position and later modify the buffer on some earlier position.")
|
||||
before END, but if it calls `syntax-ppss' on some
|
||||
position and later modifies the buffer on some earlier position,
|
||||
then it is its responsability to call `syntax-ppss-flush-cache' to flush
|
||||
the now obsolete ppss info from the cache.")
|
||||
|
||||
(defvar syntax-propertize-chunk-size 500)
|
||||
|
||||
@ -320,6 +321,11 @@ END) suitable for `syntax-propertize-function'."
|
||||
(defvar-local syntax-ppss-table nil
|
||||
"Syntax-table to use during `syntax-ppss', if any.")
|
||||
|
||||
(defvar-local syntax-propertize--inhibit-flush nil
|
||||
"If non-nil, `syntax-ppss-flush-cache' only flushes the ppss cache.
|
||||
Otherwise it flushes both the ppss cache and the properties
|
||||
set by `syntax-propertize'")
|
||||
|
||||
(defun syntax-propertize (pos)
|
||||
"Ensure that syntax-table properties are set until POS (a buffer point)."
|
||||
(when (< syntax-propertize--done pos)
|
||||
@ -375,8 +381,13 @@ END) suitable for `syntax-propertize-function'."
|
||||
;; (message "syntax-propertizing from %s to %s" start end)
|
||||
(remove-text-properties start end
|
||||
'(syntax-table nil syntax-multiline nil))
|
||||
;; Avoid recursion!
|
||||
(let ((syntax-propertize--done most-positive-fixnum))
|
||||
;; Make sure we only let-bind it buffer-locally.
|
||||
(make-local-variable 'syntax-propertize--inhibit-flush)
|
||||
;; Let-bind `syntax-propertize--done' to avoid infinite recursion!
|
||||
(let ((syntax-propertize--done most-positive-fixnum)
|
||||
;; Let `syntax-propertize-function' call
|
||||
;; `syntax-ppss-flush-cache' without worries.
|
||||
(syntax-propertize--inhibit-flush t))
|
||||
(funcall syntax-propertize-function start end)))))))))
|
||||
|
||||
;;; Link syntax-propertize with syntax.c.
|
||||
@ -455,7 +466,8 @@ These are valid when the buffer has no restriction.")
|
||||
(defun syntax-ppss-flush-cache (beg &rest ignored)
|
||||
"Flush the cache of `syntax-ppss' starting at position BEG."
|
||||
;; Set syntax-propertize to refontify anything past beg.
|
||||
(setq syntax-propertize--done (min beg syntax-propertize--done))
|
||||
(unless syntax-propertize--inhibit-flush
|
||||
(setq syntax-propertize--done (min beg syntax-propertize--done)))
|
||||
;; Flush invalid cache entries.
|
||||
(dolist (cell (list syntax-ppss-wide syntax-ppss-narrow))
|
||||
(pcase cell
|
||||
|
Loading…
Reference in New Issue
Block a user