From: Stefan Monnier Date: Sun, 17 Mar 2019 00:11:45 +0000 (-0400) Subject: * lisp/subr.el (combine-change-calls-1): Don't combine syntax-ppss flushes X-Git-Tag: emacs-27.0.90~3401 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3320fe2deeba6dcc40e934e8a03bef4945c86aff;p=emacs.git * lisp/subr.el (combine-change-calls-1): Don't combine syntax-ppss flushes --- diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el index 11cab1d693d..d09d6c12254 100644 --- a/lisp/emacs-lisp/syntax.el +++ b/lisp/emacs-lisp/syntax.el @@ -533,6 +533,11 @@ running the hook." ;; Setup the before-change function if necessary. (unless (or ppss-cache ppss-last) + ;; We should be either the very last function on + ;; before-change-functions or the very first on + ;; after-change-functions. + ;; Note: combine-change-calls-1 needs to be kept in sync + ;; with this! (add-hook 'before-change-functions 'syntax-ppss-flush-cache t t)) diff --git a/lisp/subr.el b/lisp/subr.el index 4024c68e68d..6c0ad00afa5 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -3686,7 +3686,7 @@ the specified region. It must not change `before-change-functions' or `after-change-functions'. Additionally, the buffer modifications of BODY are recorded on -the buffer's undo list as a single \(apply ...) entry containing +the buffer's undo list as a single (apply ...) entry containing the function `undo--wrap-and-run-primitive-undo'." (let ((old-bul buffer-undo-list) (end-marker (copy-marker end t)) @@ -3699,7 +3699,14 @@ the function `undo--wrap-and-run-primitive-undo'." (if (eq buffer-undo-list t) (setq result (funcall body)) (let (;; (inhibit-modification-hooks t) - before-change-functions after-change-functions) + (before-change-functions + ;; Ugly Hack: if the body uses syntax-ppss/syntax-propertize + ;; (e.g. via a regexp-search or sexp-movement trigerring + ;; on-the-fly syntax-propertize), make sure that this gets + ;; properly refreshed after subsequent changes. + (if (memq #'syntax-ppss-flush-cache before-change-functions) + '(syntax-ppss-flush-cache))) + after-change-functions) (setq result (funcall body))) (let ((ap-elt (list 'apply