]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix string fontification for tree-sitter python-mode
authorYuan Fu <casouri@gmail.com>
Tue, 1 Nov 2022 20:26:16 +0000 (13:26 -0700)
committerYuan Fu <casouri@gmail.com>
Tue, 1 Nov 2022 20:26:16 +0000 (13:26 -0700)
Now when user inserts a ending quote, the whole string is ganranteed
to be refontified and redisplayed.

* lisp/progmodes/python.el (python--treesit-fontify-string): Change
docstring, now it's called on the leading quote.
(python--treesit-fontify-string-end): New function.
(python--treesit-settings): Capture both leading and ending quote in a
string.

lisp/progmodes/python.el

index 916b098aefaea502f13ebcebad9b83039790691a..f741688363eb5902dc21bdc1e5ce95785e2c1446 100644 (file)
@@ -1017,7 +1017,7 @@ It makes underscores and dots word constituent chars.")
 
 (defun python--treesit-fontify-string (_beg _end node override &rest _)
   "Fontify string.
-NODE is the last quote in the string.  Do not fontify the initial
+NODE is the leading quote in the string.  Do not fontify the initial
 f for f-strings.  OVERRIDE is the override flag described in
 `treesit-font-lock-rules'."
   (let* ((string (treesit-node-parent node))
@@ -1035,6 +1035,12 @@ f for f-strings.  OVERRIDE is the override flag described in
       (cl-incf string-beg))
     (treesit-fontify-with-override string-beg string-end face override)))
 
+(defun python--treesit-fontify-string-end (_beg _end node &rest _)
+  "Mark the whole string as to-be-fontified.
+NODE is the ending quote of a string."
+  (let ((string (treesit-node-parent node)))
+    (setq jit-lock-context-unfontify-pos (treesit-node-start string))))
+
 (defvar python--treesit-settings
   (treesit-font-lock-rules
    :feature 'comment
@@ -1044,11 +1050,9 @@ f for f-strings.  OVERRIDE is the override flag described in
    :feature 'string
    :language 'python
    :override t
-   ;; Capture the last quote node rather than the whole string.  The
-   ;; whole string might not be captured if it's not contained in the
-   ;; region being fontified.  E.g., the user inserts a quote, that
-   ;; single quote is the whole region we are fontifying.
-   '((string "\"" @python--treesit-fontify-string :anchor))
+   ;; TODO Document on why we do this.
+   '((string "\"" @python--treesit-fontify-string-end :anchor)
+     (string :anchor "\"" @python--treesit-fontify-string :anchor))
 
    :feature 'string-interpolation
    :language 'python