]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't update ranges for the whole buffer in treesit--pre-redisplay
authorYuan Fu <casouri@gmail.com>
Mon, 19 Feb 2024 05:39:31 +0000 (21:39 -0800)
committerEshel Yaron <me@eshelyaron.com>
Wed, 28 Feb 2024 17:36:01 +0000 (18:36 +0100)
* lisp/treesit.el (treesit--pre-redisplay): Only update two
screen-full of text around point.

(cherry picked from commit 8f260bb93f534b24d9a93d3315804ffe0c1fec4f)

lisp/treesit.el

index f811b8090bc1cb9332889af20e0cf8fdd1038265..fa82ad898a931c53dd986154f3742aecb9689030 100644 (file)
@@ -1382,7 +1382,15 @@ as comment due to incomplete parse tree."
     ;; `treesit-update-ranges' will force the host language's parser to
     ;; reparse and set correct ranges for embedded parsers.  Then
     ;; `treesit-parser-root-node' will force those parsers to reparse.
-    (treesit-update-ranges)
+    (let ((len (+ (* (window-body-height) (window-body-width)) 800)))
+      ;; FIXME: As a temporary fix, this prevents Emacs from updating
+      ;; every single local parsers in the buffer every time there's an
+      ;; edit.  Moving forward, we need some way to properly track the
+      ;; regions which need update on parser ranges, like what jit-lock
+      ;; and syntax-ppss does.
+      (treesit-update-ranges
+       (max (point-min) (- (point) len))
+       (min (point-max) (+ (point) len))))
     ;; Force repase on _all_ the parsers might not be necessary, but
     ;; this is probably the most robust way.
     (dolist (parser (treesit-parser-list))