* Disable tree-sitter font-locking for smaller ranges @ 2022-10-16 10:32 Theodor Thornhill 2022-10-17 5:04 ` Yuan Fu 0 siblings, 1 reply; 14+ messages in thread From: Theodor Thornhill @ 2022-10-16 10:32 UTC (permalink / raw) To: Yuan Fu; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1700 bytes --] Hi Yuan! I've been trying to tweak the font-locking for tree-sitter in js/ts-mode, and I'm still struggling with the template strings. Is there a way to _disable_ font-locking for smaller ranges? Let's say you have this string: ``` `Some string with ${5+5} many template substitutions ${foo().bar().baz()}`; ``` This string will match something like: ``` (template_string (template_substitution) :*) ``` If you use this as a query: ``` (template_string) @font-lock-string-face ``` Everything inside the string is in string-face. If you add ``` (template_substitution "${" @font-lock-constant-face (_) "}" @font-lock-constant-face) ``` You get font-locking in the ranges inside the squigglies, as expected. However, if there isn't defined any rules for say, "(), . []" etc, the template_string capture will bleed into the substitution, because its range suggests it should. It would be nice to say something like: ``` (defvar fonts () (treesit-font-lock-rules :language 'tsx :override t :feature 'basic '((template_string (_):* @disabled) @font-lock-string-face (template_substitution ["${" "}"] @font-lock-constant-face))) ``` to ensure that whatever is inside the wildcard match will _not_ be considered for the string face, but whatever is still inside the bigger range will. Is this currently possible? If not, is it possible to add? I guess I could make a function that would remove the range, but that seems fiddly and error prone. I've tried fiddling with the :feature flag in 'treesit-font-lock-rules', but I never found a combination that did what I wanted. Adding a small image of a stupid snipped just to make the point more visual Theo [-- Attachment #2: 2022-10-16_12-26.png --] [-- Type: image/png, Size: 12890 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-16 10:32 Disable tree-sitter font-locking for smaller ranges Theodor Thornhill @ 2022-10-17 5:04 ` Yuan Fu 2022-10-17 5:49 ` Theodor Thornhill 0 siblings, 1 reply; 14+ messages in thread From: Yuan Fu @ 2022-10-17 5:04 UTC (permalink / raw) To: Theodor Thornhill; +Cc: emacs-devel > On Oct 16, 2022, at 3:32 AM, Theodor Thornhill <theo@thornhill.no> wrote: > > > Hi Yuan! > > I've been trying to tweak the font-locking for tree-sitter in > js/ts-mode, and I'm still struggling with the template strings. Is > there a way to _disable_ font-locking for smaller ranges? > > Let's say you have this string: > ``` > `Some string with ${5+5} many template substitutions ${foo().bar().baz()}`; > ``` > > This string will match something like: > ``` > (template_string (template_substitution) :*) > ``` > > If you use this as a query: > ``` > (template_string) @font-lock-string-face > ``` > > Everything inside the string is in string-face. > > If you add > ``` > (template_substitution > "${" @font-lock-constant-face > (_) > "}" @font-lock-constant-face) > ``` > > You get font-locking in the ranges inside the squigglies, as expected. > However, if there isn't defined any rules for say, "(), . []" etc, the > template_string capture will bleed into the substitution, because its > range suggests it should. It would be nice to say something like: > > ``` > (defvar fonts () > (treesit-font-lock-rules > :language 'tsx > :override t > :feature 'basic > '((template_string (_):* @disabled) @font-lock-string-face > (template_substitution ["${" "}"] @font-lock-constant-face))) > ``` > > to ensure that whatever is inside the wildcard match will _not_ be > considered for the string face, but whatever is still inside the bigger > range will. Is this currently possible? If not, is > it possible to add? I guess I could make a function that would remove > the range, but that seems fiddly and error prone. > > I've tried fiddling with the :feature flag in 'treesit-font-lock-rules', > but I never found a combination that did what I wanted. > > Adding a small image of a stupid snipped just to make the point more visual The image you attached looks perfectly fine to me. Do you not want to font-lock what’s inside a substitution? I’m not exactly sure what result you want to archive. If you don’t want font-lock in substitutions, you can put > '((template_string) @font-lock-string-face > (template_substitution ["${" "}"] @font-lock-constant-face)) After all other queries, and mark these two with :override t. That should do it. Also, when I was browsing tsx’s grammar file, I didn’t find definition of template_substitution at all. That means at least some part of js and tsx’s grammar are not interchangeable. Yuan ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 5:04 ` Yuan Fu @ 2022-10-17 5:49 ` Theodor Thornhill 2022-10-17 6:01 ` Yuan Fu 0 siblings, 1 reply; 14+ messages in thread From: Theodor Thornhill @ 2022-10-17 5:49 UTC (permalink / raw) To: Yuan Fu; +Cc: emacs-devel On 17 October 2022 07:04:58 CEST, Yuan Fu <casouri@gmail.com> wrote: > > >> On Oct 16, 2022, at 3:32 AM, Theodor Thornhill <theo@thornhill.no> wrote: >> >> >> Hi Yuan! >> >> I've been trying to tweak the font-locking for tree-sitter in >> js/ts-mode, and I'm still struggling with the template strings. Is >> there a way to _disable_ font-locking for smaller ranges? >> >> Let's say you have this string: >> ``` >> `Some string with ${5+5} many template substitutions ${foo().bar().baz()}`; >> ``` >> >> This string will match something like: >> ``` >> (template_string (template_substitution) :*) >> ``` >> >> If you use this as a query: >> ``` >> (template_string) @font-lock-string-face >> ``` >> >> Everything inside the string is in string-face. >> >> If you add >> ``` >> (template_substitution >> "${" @font-lock-constant-face >> (_) >> "}" @font-lock-constant-face) >> ``` >> >> You get font-locking in the ranges inside the squigglies, as expected. >> However, if there isn't defined any rules for say, "(), . []" etc, the >> template_string capture will bleed into the substitution, because its >> range suggests it should. It would be nice to say something like: >> >> ``` >> (defvar fonts () >> (treesit-font-lock-rules >> :language 'tsx >> :override t >> :feature 'basic >> '((template_string (_):* @disabled) @font-lock-string-face >> (template_substitution ["${" "}"] @font-lock-constant-face))) >> ``` >> >> to ensure that whatever is inside the wildcard match will _not_ be >> considered for the string face, but whatever is still inside the bigger >> range will. Is this currently possible? If not, is >> it possible to add? I guess I could make a function that would remove >> the range, but that seems fiddly and error prone. >> >> I've tried fiddling with the :feature flag in 'treesit-font-lock-rules', >> but I never found a combination that did what I wanted. >> >> Adding a small image of a stupid snipped just to make the point more visual > >The image you attached looks perfectly fine to me. Do you not want to font-lock what’s inside a substitution? I’m not exactly sure what result you want to archive. > All the parens, braces, equal, semicolons should be white, as they would in the source file outside of the template string. But the string outside of the ${...} should be string colored. >If you don’t want font-lock in substitutions, you can put > >> '((template_string) @font-lock-string-face >> (template_substitution ["${" "}"] @font-lock-constant-face)) > > >After all other queries, and mark these two with :override t. That should do it. > Ill try that! >Also, when I was browsing tsx’s grammar file, I didn’t find definition of template_substitution at all. That means at least some part of js and tsx’s grammar are not interchangeable. > >Yuan They do some inheritance shenanigans in their files. Most of the grammar is from tree-sitter-Javascript. Theo ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 5:49 ` Theodor Thornhill @ 2022-10-17 6:01 ` Yuan Fu 2022-10-17 6:33 ` Theodor Thornhill 0 siblings, 1 reply; 14+ messages in thread From: Yuan Fu @ 2022-10-17 6:01 UTC (permalink / raw) To: Theodor Thornhill; +Cc: emacs-devel > On Oct 16, 2022, at 10:49 PM, Theodor Thornhill <theo@thornhill.no> wrote: > > > > On 17 October 2022 07:04:58 CEST, Yuan Fu <casouri@gmail.com> wrote: >> >> >>> On Oct 16, 2022, at 3:32 AM, Theodor Thornhill <theo@thornhill.no> wrote: >>> >>> >>> Hi Yuan! >>> >>> I've been trying to tweak the font-locking for tree-sitter in >>> js/ts-mode, and I'm still struggling with the template strings. Is >>> there a way to _disable_ font-locking for smaller ranges? >>> >>> Let's say you have this string: >>> ``` >>> `Some string with ${5+5} many template substitutions ${foo().bar().baz()}`; >>> ``` >>> >>> This string will match something like: >>> ``` >>> (template_string (template_substitution) :*) >>> ``` >>> >>> If you use this as a query: >>> ``` >>> (template_string) @font-lock-string-face >>> ``` >>> >>> Everything inside the string is in string-face. >>> >>> If you add >>> ``` >>> (template_substitution >>> "${" @font-lock-constant-face >>> (_) >>> "}" @font-lock-constant-face) >>> ``` >>> >>> You get font-locking in the ranges inside the squigglies, as expected. >>> However, if there isn't defined any rules for say, "(), . []" etc, the >>> template_string capture will bleed into the substitution, because its >>> range suggests it should. It would be nice to say something like: >>> >>> ``` >>> (defvar fonts () >>> (treesit-font-lock-rules >>> :language 'tsx >>> :override t >>> :feature 'basic >>> '((template_string (_):* @disabled) @font-lock-string-face >>> (template_substitution ["${" "}"] @font-lock-constant-face))) >>> ``` >>> >>> to ensure that whatever is inside the wildcard match will _not_ be >>> considered for the string face, but whatever is still inside the bigger >>> range will. Is this currently possible? If not, is >>> it possible to add? I guess I could make a function that would remove >>> the range, but that seems fiddly and error prone. >>> >>> I've tried fiddling with the :feature flag in 'treesit-font-lock-rules', >>> but I never found a combination that did what I wanted. >>> >>> Adding a small image of a stupid snipped just to make the point more visual >> >> The image you attached looks perfectly fine to me. Do you not want to font-lock what’s inside a substitution? I’m not exactly sure what result you want to archive. >> > > All the parens, braces, equal, semicolons should be white, as they would in the source file outside of the template string. But the string outside of the ${...} should be string colored. > Ah, I finally get it. How about: (template_string) @font-lock-string-face (template_substitution) @default ; color everything in substitution white (template_substitution ["${" "}"] @font-lock-constant-face) ;; rest font-lock Yuan ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 6:01 ` Yuan Fu @ 2022-10-17 6:33 ` Theodor Thornhill 2022-10-17 9:00 ` Yuan Fu 0 siblings, 1 reply; 14+ messages in thread From: Theodor Thornhill @ 2022-10-17 6:33 UTC (permalink / raw) To: Yuan Fu; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 752 bytes --] Yuan Fu <casouri@gmail.com> writes: >>> >>> The image you attached looks perfectly fine to me. Do you not want >>> to font-lock what’s inside a substitution? I’m not exactly sure what >>> result you want to archive. >>> >> >> All the parens, braces, equal, semicolons should be white, as they >> would in the source file outside of the template string. But the >> string outside of the ${...} should be string colored. >> > Ah, I finally get it. How about: > > (template_string) @font-lock-string-face > (template_substitution) @default ; color everything in substitution white > (template_substitution ["${" "}"] @font-lock-constant-face) > ;; rest font-lock > Yes! That's it! Thanks :) See attached patch: Theo [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-Add-correct-ordering-in-template_substitution.patch --] [-- Type: text/x-diff, Size: 2961 bytes --] From dbe998506f9052455d3499638930418832f5c243 Mon Sep 17 00:00:00 2001 From: Theodor Thornhill <theo@thornhill.no> Date: Mon, 17 Oct 2022 08:29:39 +0200 Subject: [PATCH] Add correct ordering in template_substitution We want to override the template substitution contents with no coloring, because we need the font-lock-string-face not to bleed into the substitutions. The correct ordering of these forms are important. * lisp/progmodes/js.el (js--treesit-settings): Move template string related queries to top, and use the correct ordering. * lisp/progmodes/ts-mode.el (ts-mode--settings): Move template string related queries to top, and use the correct ordering. --- lisp/progmodes/js.el | 12 ++++++++---- lisp/progmodes/ts-mode.el | 10 +++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index 18499a466a..0cf106f482 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -3461,8 +3461,14 @@ js--treesit-settings :language 'javascript :feature 'basic :override t - `(;; Everything overrides template string. + `( + ;; The order of these are important. We want to keep coloring in + ;; the string, but not in the substitution, thus delegating the + ;; contents of that substitution to the usual rules (template_string) @font-lock-string-face + (template_substitution) @default ; Color everything white + (template_substitution + ["${" "}"] @font-lock-builtin-face) ((identifier) @font-lock-constant-face (:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face)) @@ -3559,9 +3565,7 @@ js--treesit-settings (string) @font-lock-string-face (comment) @font-lock-comment-face - [,@js--treesit-keywords] @font-lock-keyword-face - - (template_substitution ["${" "}"] @font-lock-constant-face)))) + [,@js--treesit-keywords] @font-lock-keyword-face))) (defun js-treesit-current-defun () diff --git a/lisp/progmodes/ts-mode.el b/lisp/progmodes/ts-mode.el index 10d4b7bd18..5a8f7da30a 100644 --- a/lisp/progmodes/ts-mode.el +++ b/lisp/progmodes/ts-mode.el @@ -110,7 +110,14 @@ ts-mode--settings :override t :feature 'basic '( + ;; The order of these are important. We want to keep coloring in + ;; the string, but not in the substitution, thus delegating the + ;; contents of that substitution to the usual rules (template_string) @font-lock-string-face + (template_substitution) @default ; Color everything white + (template_substitution + ["${" "}"] @font-lock-builtin-face) + ((identifier) @font-lock-constant-face (:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face)) @@ -225,9 +232,6 @@ ts-mode--settings (string) @font-lock-string-face (template_string) @font-lock-string-face - (template_substitution - ["${" "}"] @font-lock-constant-face) - ["!" "abstract" "as" -- 2.34.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 6:33 ` Theodor Thornhill @ 2022-10-17 9:00 ` Yuan Fu 2022-10-17 9:41 ` Theodor Thornhill 2022-10-18 1:23 ` Trey Peacock 0 siblings, 2 replies; 14+ messages in thread From: Yuan Fu @ 2022-10-17 9:00 UTC (permalink / raw) To: Theodor Thornhill; +Cc: emacs-devel > On Oct 16, 2022, at 11:33 PM, Theodor Thornhill <theo@thornhill.no> wrote: > > Yuan Fu <casouri@gmail.com> writes: >>>> >>>> The image you attached looks perfectly fine to me. Do you not want >>>> to font-lock what’s inside a substitution? I’m not exactly sure what >>>> result you want to archive. >>>> >>> >>> All the parens, braces, equal, semicolons should be white, as they >>> would in the source file outside of the template string. But the >>> string outside of the ${...} should be string colored. >>> >> Ah, I finally get it. How about: >> >> (template_string) @font-lock-string-face >> (template_substitution) @default ; color everything in substitution white >> (template_substitution ["${" "}"] @font-lock-constant-face) >> ;; rest font-lock >> > > Yes! That's it! Thanks :) > > See attached patch: Actually, thinking more of it, it working relies on the exact order of which these rules are applied: 1. Outer template_string 2. Outer template_substitution 3. Inner template_string 4. Inner template_substitution Relying on such un-guaranteed fact is a bit uncomfortable, so I just wrote a function that did what you suggested initially: to fontify parts of template_string that’s not a template_substitution. WDYT? (I just pushed the change.) BTW, if you have time and energy, could you look into separating the queries into roughly three levels: minimum, moderate, and full fontification, and mark each with the new :feature flag? Or even better, separate them into different features (as suggested in the docstring of treesit-font-lock-feature-list). Yuan ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 9:00 ` Yuan Fu @ 2022-10-17 9:41 ` Theodor Thornhill 2022-10-17 11:02 ` Theodor Thornhill via Emacs development discussions. 2022-10-18 5:06 ` Yuan Fu 2022-10-18 1:23 ` Trey Peacock 1 sibling, 2 replies; 14+ messages in thread From: Theodor Thornhill @ 2022-10-17 9:41 UTC (permalink / raw) To: Yuan Fu; +Cc: emacs-devel Yuan Fu <casouri@gmail.com> writes: > > Actually, thinking more of it, it working relies on the exact order of which these rules are applied: > 1. Outer template_string > 2. Outer template_substitution > 3. Inner template_string > 4. Inner template_substitution That's correct. > > Relying on such un-guaranteed fact is a bit uncomfortable, so I just > wrote a function that did what you suggested initially: to fontify > parts of template_string that’s not a template_substitution. WDYT? (I > just pushed the change.) > I agree! The change looks good to me. Is there any change in performance doing this? I'm not yet 100% on the inner workings, but if this would slow things down that wouldn't be so nice. > BTW, if you have time and energy, could you look into separating the > queries into roughly three levels: minimum, moderate, and full > fontification, and mark each with the new :feature flag? Or even > better, separate them into different features (as suggested in the > docstring of treesit-font-lock-feature-list). > I will do that promptly and attach patches for ts-mode and js-mode to this thread. Theo ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 9:41 ` Theodor Thornhill @ 2022-10-17 11:02 ` Theodor Thornhill via Emacs development discussions. 2022-10-18 0:20 ` Yuan Fu 2022-10-18 5:06 ` Yuan Fu 1 sibling, 1 reply; 14+ messages in thread From: Theodor Thornhill via Emacs development discussions. @ 2022-10-17 11:02 UTC (permalink / raw) To: Yuan Fu; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 458 bytes --] >> BTW, if you have time and energy, could you look into separating the >> queries into roughly three levels: minimum, moderate, and full >> fontification, and mark each with the new :feature flag? Or even >> better, separate them into different features (as suggested in the >> docstring of treesit-font-lock-feature-list). >> > > I will do that promptly and attach patches for ts-mode and js-mode to > this thread. > > Theo See attached patch :-) Theo [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-Add-more-granular-features-in-font-locking.patch --] [-- Type: text/x-diff, Size: 14803 bytes --] From 1f4f6c6ede3198af4f8c252dd0a56a3ad1bdbd2f Mon Sep 17 00:00:00 2001 From: Theodor Thornhill <theo@thornhill.no> Date: Mon, 17 Oct 2022 12:49:19 +0200 Subject: [PATCH] Add more granular features in font-locking There is now support for three font-locking levels, 'minimum', 'medium' and 'full'. The richest experience is to be expected from the 'full', and all levels are enabled by default. * lisp/progmodes/js.el (js--treesit-font-lock-settings): New defvar renamed from 'js--treesit-settings'. (js--font-lock-minimum-settings, js--font-lock-medium-settings, js--font-lock-full-settings): New defvars. (js--treesit-font-lock-settings): New defvar renamed from 'js--json-treesit-settings'. * lisp/progmodes/ts-mode.el (ts-mode--font-lock-settings): New defvar renamed from 'ts-mode--settings'. (ts-mode--font-lock-minimum-settings, ts-mode--font-lock-medium-settings, ts-mode--font-lock-full-settings): New defvars. --- lisp/progmodes/js.el | 104 ++++++++++++-------- lisp/progmodes/ts-mode.el | 195 +++++++++++++++++++------------------- 2 files changed, 164 insertions(+), 135 deletions(-) diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index 667416852e..62f83fe831 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -3454,19 +3454,40 @@ js--treesit-keywords "debugger" "default" "delete" "do" "else" "export" "extends" "finally" "for" "from" "function" "get" "if" "import" "in" "instanceof" "let" "new" "of" "return" "set" "static" "switch" "switch" "target" "throw" "try" - "typeof" "var" "void" "while" "with" "yield")) + "typeof" "var" "void" "while" "with" "yield") + "JavaScript keywords for tree-sitter font-locking.") -(defvar js--treesit-settings - (treesit-font-lock-rules +(defvar js--font-lock-minimum-settings + (list :language 'javascript - :feature 'basic :override t - `(((identifier) @font-lock-constant-face + :feature 'minimal + `( + ((identifier) @font-lock-constant-face (:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face)) - (new_expression - constructor: (identifier) @font-lock-type-face) + [(this) (super)] @font-lock-keyword-face + [(true) (false) (null)] @font-lock-constant-face + (regex pattern: (regex_pattern)) @font-lock-string-face + (number) @font-lock-constant-face + + (string) @font-lock-string-face + (comment) @font-lock-comment-face + [,@js--treesit-keywords] @font-lock-keyword-face + + (template_string) @js--fontify-template-string + (template_substitution ["${" "}"] @font-lock-constant-face))) + "Font lock settings for minimal TypeScript highlights. +This level will font-lock only keywords, strings, comments and +some identifiers.") + +(defvar js--font-lock-medium-settings + (list + :language 'javascript + :override t + :feature 'medium + `( (function name: (identifier) @font-lock-function-name-face) @@ -3479,6 +3500,26 @@ js--treesit-settings (method_definition name: (property_identifier) @font-lock-function-name-face) + (variable_declarator + name: (identifier) @font-lock-variable-name-face) + + (new_expression + constructor: (identifier) @font-lock-type-face) + + (for_in_statement + left: (identifier) @font-lock-variable-name-face) + + (arrow_function + parameter: (identifier) @font-lock-variable-name-face))) + "Font lock settings for medium TypeScript highlights. +This levels adds some flair to the more advanced patterns.") + +(defvar js--font-lock-full-settings + (list + :language 'javascript + :override t + :feature 'full + `( (variable_declarator name: (identifier) @font-lock-function-name-face value: [(function) (arrow_function)]) @@ -3502,20 +3543,11 @@ js--treesit-settings property: (property_identifier) @font-lock-function-name-face)]) - (variable_declarator - name: (identifier) @font-lock-variable-name-face) - (assignment_expression left: [(identifier) @font-lock-variable-name-face (member_expression property: (property_identifier) @font-lock-variable-name-face)]) - (for_in_statement - left: (identifier) @font-lock-variable-name-face) - - (arrow_function - parameter: (identifier) @font-lock-variable-name-face) - (pair key: (property_identifier) @font-lock-variable-name-face) (pair value: (identifier) @font-lock-variable-name-face) @@ -3546,20 +3578,17 @@ js--treesit-settings (jsx_attribute (property_identifier) - @font-lock-constant-face) - - [(this) (super)] @font-lock-keyword-face - - [(true) (false) (null)] @font-lock-constant-face - (regex pattern: (regex_pattern)) @font-lock-string-face - (number) @font-lock-constant-face - - (string) @font-lock-string-face - (comment) @font-lock-comment-face - [,@js--treesit-keywords] @font-lock-keyword-face - - (template_string) @js--fontify-template-string - (template_substitution ["${" "}"] @font-lock-constant-face)))) + @font-lock-constant-face))) + "Font lock settings for full TypeScript highlights. +This level yields the richest experience, with support for +pattern matching and TSX.") + +(defvar js--treesit-font-lock-settings + (apply #'treesit-font-lock-rules + (append js--font-lock-minimum-settings + js--font-lock-medium-settings + js--font-lock-full-settings)) + "Tree-sitter font-lock settings.") (defun js--fontify-template-string (beg end node) "Fontify template string but not substitution inside it. @@ -3655,8 +3684,8 @@ js--treesit-enable (setq-local end-of-defun-function #'js--treesit-end-of-defun) (setq-local font-lock-keywords-only t) - (setq-local treesit-font-lock-settings js--treesit-settings) - (setq-local treesit-font-lock-feature-list '((basic))) + (setq-local treesit-font-lock-settings js--treesit-font-lock-settings) + (setq-local treesit-font-lock-feature-list '((minimal medium full))) (add-hook 'which-func-functions #'js-treesit-current-defun nil t) @@ -3761,10 +3790,10 @@ js-json-use-tree-sitter :type 'boolean :safe 'booleanp) -(defvar js--json-treesit-settings +(defvar js-json--treesit-font-lock-settings (treesit-font-lock-rules :language 'json - :feature 'basic + :feature 'minimal :override t `( (pair @@ -3778,8 +3807,8 @@ js--json-treesit-settings (escape_sequence) @font-lock-constant-face - (comment) @font-lock-comment-face - ))) + (comment) @font-lock-comment-face)) + "Font-lock settings for JSON.") (defvar js--json-treesit-indent-rules @@ -3809,8 +3838,9 @@ js--json-treesit-enable (setq-local end-of-defun-function #'ignore) (setq-local font-lock-defaults '(nil t)) - (setq-local treesit-font-lock-settings js--json-treesit-settings) + (setq-local treesit-font-lock-settings js-json--treesit-font-lock-settings) + (setq treesit-font-lock-feature-list '((minimal))) (treesit-font-lock-enable)) diff --git a/lisp/progmodes/ts-mode.el b/lisp/progmodes/ts-mode.el index 6e4aeebde8..656f655aed 100644 --- a/lisp/progmodes/ts-mode.el +++ b/lisp/progmodes/ts-mode.el @@ -104,17 +104,55 @@ ts-mode--indent-rules (no-node parent-bol 0))) "Tree-sitter indent rules.") -(defvar ts-mode--settings - (treesit-font-lock-rules +(defvar ts-mode--keywords + '("!" "abstract" "as" "async" "await" "break" + "case" "catch" "class" "const" "continue" "debugger" + "declare" "default" "delete" "do" "else" "enum" + "export" "extends" "finally" "for" "from" "function" + "get" "if" "implements" "import" "in" "instanceof" "interface" + "keyof" "let" "namespace" "new" "of" "private" "protected" + "public" "readonly" "return" "set" "static" "switch" + "target" "throw" "try" "type" "typeof" "var" "void" + "while" "with" "yield") + "TypeScript keywords for tree-sitter font-locking.") + +(defvar ts-mode--font-lock-minimum-settings + (list :language 'tsx :override t - :feature 'basic - '(((identifier) @font-lock-constant-face + :feature 'minimal + `( + ((identifier) @font-lock-constant-face (:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face)) + [,@ts-mode--keywords] @font-lock-keyword-face + [(this) (super)] @font-lock-keyword-face + + [(true) (false) (null)] @font-lock-constant-face + (regex pattern: (regex_pattern)) @font-lock-string-face + (number) @font-lock-constant-face + + (string) @font-lock-string-face + + (template_string) @ts-mode--fontify-template-string + (template_substitution ["${" "}"] @font-lock-builtin-face) + + (comment) @font-lock-comment-face)) + "Font lock settings for minimal TypeScript highlights. +This level will font-lock only keywords, strings, comments and +some identifiers.") + +(defvar ts-mode--font-lock-medium-settings + (list + :language 'tsx + :override t + :feature 'medium + '( (nested_type_identifier module: (identifier) @font-lock-type-face) + (type_identifier) @font-lock-type-face + (predefined_type) @font-lock-type-face (new_expression @@ -129,6 +167,34 @@ ts-mode--settings (method_definition name: (property_identifier) @font-lock-function-name-face) + (variable_declarator + name: (identifier) @font-lock-variable-name-face) + + (enum_declaration (identifier) @font-lock-type-face) + + (enum_body (property_identifier) @font-lock-type-face) + + (enum_assignment name: (property_identifier) @font-lock-type-face) + + (assignment_expression + left: [(identifier) @font-lock-variable-name-face + (member_expression + property: (property_identifier) @font-lock-variable-name-face)]) + + (for_in_statement + left: (identifier) @font-lock-variable-name-face) + + (arrow_function + parameter: (identifier) @font-lock-variable-name-face))) + "Font lock settings for medium TypeScript highlights. +This levels adds some flair to the more advanced patterns.") + +(defvar ts-mode--font-lock-full-settings + (list + :language 'tsx + :override t + :feature 'full + '( (variable_declarator name: (identifier) @font-lock-function-name-face value: [(function) (arrow_function)]) @@ -151,33 +217,12 @@ ts-mode--settings (member_expression property: (property_identifier) @font-lock-function-name-face)]) - (variable_declarator - name: (identifier) @font-lock-variable-name-face) - - (enum_declaration (identifier) @font-lock-type-face) - - (enum_body (property_identifier) @font-lock-type-face) - - (enum_assignment name: (property_identifier) @font-lock-type-face) - - (assignment_expression - left: [(identifier) @font-lock-variable-name-face - (member_expression - property: (property_identifier) @font-lock-variable-name-face)]) - - (for_in_statement - left: (identifier) @font-lock-variable-name-face) - - (arrow_function - parameter: (identifier) @font-lock-variable-name-face) - (arrow_function parameters: [(_ (identifier) @font-lock-variable-name-face) (_ (_ (identifier) @font-lock-variable-name-face)) (_ (_ (_ (identifier) @font-lock-variable-name-face)))]) - (pair key: (property_identifier) @font-lock-variable-name-face) (pair value: (identifier) @font-lock-variable-name-face) @@ -211,80 +256,33 @@ ts-mode--settings [(nested_identifier (identifier)) (identifier)] @font-lock-function-name-face) - (jsx_attribute (property_identifier) @font-lock-constant-face) - - [(this) (super)] @font-lock-keyword-face - - [(true) (false) (null)] @font-lock-constant-face - (regex pattern: (regex_pattern)) @font-lock-string-face - (number) @font-lock-constant-face - - (string) @font-lock-string-face + (jsx_attribute (property_identifier) @font-lock-constant-face))) + "Font lock settings for full TypeScript highlights. +This level yields the richest experience, with support for +pattern matching and TSX.") - (template_string) @js--fontify-template-string - (template_substitution - ["${" "}"] @font-lock-constant-face) - - ["!" - "abstract" - "as" - "async" - "await" - "break" - "case" - "catch" - "class" - "const" - "continue" - "debugger" - "declare" - "default" - "delete" - "do" - "else" - "enum" - "export" - "extends" - "finally" - "for" - "from" - "function" - "get" - "if" - "implements" - "import" - "in" - "instanceof" - "interface" - "keyof" - "let" - "namespace" - "new" - "of" - "private" - "protected" - "public" - "readonly" - "return" - "set" - "static" - "switch" - "target" - "throw" - "try" - "type" - "typeof" - "var" - "void" - "while" - "with" - "yield" - ] @font-lock-keyword-face - - (comment) @font-lock-comment-face - )) +(defvar ts-mode--font-lock-settings + (apply #'treesit-font-lock-rules + (append ts-mode--font-lock-minimum-settings + ts-mode--font-lock-medium-settings + ts-mode--font-lock-full-settings)) "Tree-sitter font-lock settings.") +(defun ts-mode--fontify-template-string (beg end node) + "Fontify template string but not substitution inside it. +BEG, END, NODE refers to the template_string node." + (ignore end) + ;; Stolen from `js--fontify-template-string' + (let ((child (treesit-node-child node 0))) + (while child + (if (equal (treesit-node-type child) "template_substitution") + (put-text-property beg (treesit-node-start child) + 'face 'font-lock-string-face) + (put-text-property beg (treesit-node-end child) + 'face 'font-lock-string-face)) + (setq beg (treesit-node-end child) + child (treesit-node-next-sibling child))))) + (defvar ts-mode--defun-type-regexp (rx (or "class_declaration" "method_definition" @@ -354,9 +352,10 @@ ts-mode (unless font-lock-defaults (setq font-lock-defaults '(nil t))) - (setq-local treesit-font-lock-settings ts-mode--settings) + (setq-local treesit-font-lock-settings ts-mode--font-lock-settings) + + (setq treesit-font-lock-feature-list '((minimal medium full))) - (setq treesit-font-lock-feature-list '((basic))) (treesit-font-lock-enable)) (t (message "Tree sitter for TypeScript isn't available, defaulting to js-mode") -- 2.34.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 11:02 ` Theodor Thornhill via Emacs development discussions. @ 2022-10-18 0:20 ` Yuan Fu 2022-10-18 5:04 ` Theodor Thornhill 0 siblings, 1 reply; 14+ messages in thread From: Yuan Fu @ 2022-10-18 0:20 UTC (permalink / raw) To: Theodor Thornhill; +Cc: emacs-devel > On Oct 17, 2022, at 4:02 AM, Theodor Thornhill <theo@thornhill.no> wrote: > >>> BTW, if you have time and energy, could you look into separating the >>> queries into roughly three levels: minimum, moderate, and full >>> fontification, and mark each with the new :feature flag? Or even >>> better, separate them into different features (as suggested in the >>> docstring of treesit-font-lock-feature-list). >>> >> >> I will do that promptly and attach patches for ts-mode and js-mode to >> this thread. >> >> Theo > > > See attached patch :-) Thanks! I think you have a bit of misunderstanding of the :feature flag. You should only need to change (defvar xxx-font-lock-settings (treesit-font-lock-rules :language 'xxx '(1111111111111 2222222222222 3333333333333))) to (defvar xxx-font-lock-settings (treesit-font-lock-rules :language 'xxx :feature 'minimum '(1111111111111) :language 'xxx :feature 'moderate '(2222222222222) :language 'xxx :feature 'full '(3333333333333))) Ie, no need to create separate variables. And you should set treesit-font-lock-feature-list to (setq treesit-font-lock-feature-list '((minimum) (moderate) (full))) Yuan ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-18 0:20 ` Yuan Fu @ 2022-10-18 5:04 ` Theodor Thornhill 2022-10-18 20:07 ` Theodor Thornhill 0 siblings, 1 reply; 14+ messages in thread From: Theodor Thornhill @ 2022-10-18 5:04 UTC (permalink / raw) To: Yuan Fu; +Cc: emacs-devel On 18 October 2022 02:20:02 CEST, Yuan Fu <casouri@gmail.com> wrote: > > >> On Oct 17, 2022, at 4:02 AM, Theodor Thornhill <theo@thornhill.no> wrote: >> >>>> BTW, if you have time and energy, could you look into separating the >>>> queries into roughly three levels: minimum, moderate, and full >>>> fontification, and mark each with the new :feature flag? Or even >>>> better, separate them into different features (as suggested in the >>>> docstring of treesit-font-lock-feature-list). >>>> >>> >>> I will do that promptly and attach patches for ts-mode and js-mode to >>> this thread. >>> >>> Theo >> >> >> See attached patch :-) > >Thanks! I think you have a bit of misunderstanding of the :feature flag. You should only need to change > >(defvar xxx-font-lock-settings > (treesit-font-lock-rules > :language 'xxx > '(1111111111111 > 2222222222222 > 3333333333333))) > >to > >(defvar xxx-font-lock-settings > (treesit-font-lock-rules > :language 'xxx > :feature 'minimum > '(1111111111111) > :language 'xxx > :feature 'moderate > '(2222222222222) > :language 'xxx > :feature 'full > '(3333333333333))) > >Ie, no need to create separate variables. And you should set treesit-font-lock-feature-list to > >(setq treesit-font-lock-feature-list > '((minimum) (moderate) (full))) > >Yuan Oh, right, thanks! The separate variables was more for readability, but I can change that back :) Theo ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-18 5:04 ` Theodor Thornhill @ 2022-10-18 20:07 ` Theodor Thornhill 2022-10-18 20:44 ` Yuan Fu 0 siblings, 1 reply; 14+ messages in thread From: Theodor Thornhill @ 2022-10-18 20:07 UTC (permalink / raw) To: Yuan Fu; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 157 bytes --] Theodor Thornhill <theo@thornhill.no> writes: > The separate variables was more for readability, but I can change that back :) Something like this? Theo [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-Add-more-granular-features-in-font-locking.patch --] [-- Type: text/x-diff, Size: 13083 bytes --] From 0b44ad45133dbdff85120e056c7ff95eef07e492 Mon Sep 17 00:00:00 2001 From: Theodor Thornhill <theo@thornhill.no> Date: Mon, 17 Oct 2022 12:49:19 +0200 Subject: [PATCH] Add more granular features in font-locking There is now support for three font-locking levels, 'minimal', 'moderate' and 'full'. The richest experience is to be expected from the 'full', and all levels are enabled by default. * lisp/progmodes/js.el (js--treesit-font-lock-settings): New defvar renamed from 'js--treesit-settings'. (js--treesit-font-lock-settings): New defvar renamed from 'js--json-treesit-settings'. * lisp/progmodes/ts-mode.el (ts-mode--font-lock-settings): New defvar renamed from 'ts-mode--settings'. --- lisp/progmodes/js.el | 82 ++++++++++-------- lisp/progmodes/ts-mode.el | 175 +++++++++++++++++--------------------- 2 files changed, 123 insertions(+), 134 deletions(-) diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index 667416852e..32e1e5027d 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -3454,19 +3454,34 @@ js--treesit-keywords "debugger" "default" "delete" "do" "else" "export" "extends" "finally" "for" "from" "function" "get" "if" "import" "in" "instanceof" "let" "new" "of" "return" "set" "static" "switch" "switch" "target" "throw" "try" - "typeof" "var" "void" "while" "with" "yield")) + "typeof" "var" "void" "while" "with" "yield") + "JavaScript keywords for tree-sitter font-locking.") -(defvar js--treesit-settings +(defvar js--treesit-font-lock-settings (treesit-font-lock-rules :language 'javascript - :feature 'basic :override t - `(((identifier) @font-lock-constant-face + :feature 'minimal + `( + ((identifier) @font-lock-constant-face (:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face)) - (new_expression - constructor: (identifier) @font-lock-type-face) + [(this) (super)] @font-lock-keyword-face + [(true) (false) (null)] @font-lock-constant-face + (regex pattern: (regex_pattern)) @font-lock-string-face + (number) @font-lock-constant-face + + (string) @font-lock-string-face + (comment) @font-lock-comment-face + [,@js--treesit-keywords] @font-lock-keyword-face + + (template_string) @js--fontify-template-string + (template_substitution ["${" "}"] @font-lock-constant-face)) + :language 'javascript + :override t + :feature 'moderate + `( (function name: (identifier) @font-lock-function-name-face) @@ -3479,6 +3494,21 @@ js--treesit-settings (method_definition name: (property_identifier) @font-lock-function-name-face) + (variable_declarator + name: (identifier) @font-lock-variable-name-face) + + (new_expression + constructor: (identifier) @font-lock-type-face) + + (for_in_statement + left: (identifier) @font-lock-variable-name-face) + + (arrow_function + parameter: (identifier) @font-lock-variable-name-face)) + :language 'javascript + :override t + :feature 'full + `( (variable_declarator name: (identifier) @font-lock-function-name-face value: [(function) (arrow_function)]) @@ -3502,20 +3532,11 @@ js--treesit-settings property: (property_identifier) @font-lock-function-name-face)]) - (variable_declarator - name: (identifier) @font-lock-variable-name-face) - (assignment_expression left: [(identifier) @font-lock-variable-name-face (member_expression property: (property_identifier) @font-lock-variable-name-face)]) - (for_in_statement - left: (identifier) @font-lock-variable-name-face) - - (arrow_function - parameter: (identifier) @font-lock-variable-name-face) - (pair key: (property_identifier) @font-lock-variable-name-face) (pair value: (identifier) @font-lock-variable-name-face) @@ -3546,20 +3567,8 @@ js--treesit-settings (jsx_attribute (property_identifier) - @font-lock-constant-face) - - [(this) (super)] @font-lock-keyword-face - - [(true) (false) (null)] @font-lock-constant-face - (regex pattern: (regex_pattern)) @font-lock-string-face - (number) @font-lock-constant-face - - (string) @font-lock-string-face - (comment) @font-lock-comment-face - [,@js--treesit-keywords] @font-lock-keyword-face - - (template_string) @js--fontify-template-string - (template_substitution ["${" "}"] @font-lock-constant-face)))) + @font-lock-constant-face))) + "Tree-sitter font-lock settings.") (defun js--fontify-template-string (beg end node) "Fontify template string but not substitution inside it. @@ -3655,8 +3664,8 @@ js--treesit-enable (setq-local end-of-defun-function #'js--treesit-end-of-defun) (setq-local font-lock-keywords-only t) - (setq-local treesit-font-lock-settings js--treesit-settings) - (setq-local treesit-font-lock-feature-list '((basic))) + (setq-local treesit-font-lock-settings js--treesit-font-lock-settings) + (setq-local treesit-font-lock-feature-list '((minimal) (moderate) (full))) (add-hook 'which-func-functions #'js-treesit-current-defun nil t) @@ -3761,10 +3770,10 @@ js-json-use-tree-sitter :type 'boolean :safe 'booleanp) -(defvar js--json-treesit-settings +(defvar js-json--treesit-font-lock-settings (treesit-font-lock-rules :language 'json - :feature 'basic + :feature 'minimal :override t `( (pair @@ -3778,8 +3787,8 @@ js--json-treesit-settings (escape_sequence) @font-lock-constant-face - (comment) @font-lock-comment-face - ))) + (comment) @font-lock-comment-face)) + "Font-lock settings for JSON.") (defvar js--json-treesit-indent-rules @@ -3809,8 +3818,9 @@ js--json-treesit-enable (setq-local end-of-defun-function #'ignore) (setq-local font-lock-defaults '(nil t)) - (setq-local treesit-font-lock-settings js--json-treesit-settings) + (setq-local treesit-font-lock-settings js-json--treesit-font-lock-settings) + (setq treesit-font-lock-feature-list '((minimal))) (treesit-font-lock-enable)) diff --git a/lisp/progmodes/ts-mode.el b/lisp/progmodes/ts-mode.el index 6e4aeebde8..b5adf0744e 100644 --- a/lisp/progmodes/ts-mode.el +++ b/lisp/progmodes/ts-mode.el @@ -104,17 +104,49 @@ ts-mode--indent-rules (no-node parent-bol 0))) "Tree-sitter indent rules.") -(defvar ts-mode--settings +(defvar ts-mode--keywords + '("!" "abstract" "as" "async" "await" "break" + "case" "catch" "class" "const" "continue" "debugger" + "declare" "default" "delete" "do" "else" "enum" + "export" "extends" "finally" "for" "from" "function" + "get" "if" "implements" "import" "in" "instanceof" "interface" + "keyof" "let" "namespace" "new" "of" "private" "protected" + "public" "readonly" "return" "set" "static" "switch" + "target" "throw" "try" "type" "typeof" "var" "void" + "while" "with" "yield") + "TypeScript keywords for tree-sitter font-locking.") + +(defvar ts-mode--font-lock-settings (treesit-font-lock-rules :language 'tsx :override t - :feature 'basic - '(((identifier) @font-lock-constant-face + :feature 'minimal + `( + ((identifier) @font-lock-constant-face (:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face)) + [,@ts-mode--keywords] @font-lock-keyword-face + [(this) (super)] @font-lock-keyword-face + + [(true) (false) (null)] @font-lock-constant-face + (regex pattern: (regex_pattern)) @font-lock-string-face + (number) @font-lock-constant-face + + (string) @font-lock-string-face + + (template_string) @ts-mode--fontify-template-string + (template_substitution ["${" "}"] @font-lock-builtin-face) + + (comment) @font-lock-comment-face) + :language 'tsx + :override t + :feature 'moderate + '( (nested_type_identifier module: (identifier) @font-lock-type-face) + (type_identifier) @font-lock-type-face + (predefined_type) @font-lock-type-face (new_expression @@ -129,6 +161,29 @@ ts-mode--settings (method_definition name: (property_identifier) @font-lock-function-name-face) + (variable_declarator + name: (identifier) @font-lock-variable-name-face) + + (enum_declaration (identifier) @font-lock-type-face) + + (enum_body (property_identifier) @font-lock-type-face) + + (enum_assignment name: (property_identifier) @font-lock-type-face) + + (assignment_expression + left: [(identifier) @font-lock-variable-name-face + (member_expression + property: (property_identifier) @font-lock-variable-name-face)]) + + (for_in_statement + left: (identifier) @font-lock-variable-name-face) + + (arrow_function + parameter: (identifier) @font-lock-variable-name-face)) + :language 'tsx + :override t + :feature 'full + '( (variable_declarator name: (identifier) @font-lock-function-name-face value: [(function) (arrow_function)]) @@ -151,33 +206,12 @@ ts-mode--settings (member_expression property: (property_identifier) @font-lock-function-name-face)]) - (variable_declarator - name: (identifier) @font-lock-variable-name-face) - - (enum_declaration (identifier) @font-lock-type-face) - - (enum_body (property_identifier) @font-lock-type-face) - - (enum_assignment name: (property_identifier) @font-lock-type-face) - - (assignment_expression - left: [(identifier) @font-lock-variable-name-face - (member_expression - property: (property_identifier) @font-lock-variable-name-face)]) - - (for_in_statement - left: (identifier) @font-lock-variable-name-face) - - (arrow_function - parameter: (identifier) @font-lock-variable-name-face) - (arrow_function parameters: [(_ (identifier) @font-lock-variable-name-face) (_ (_ (identifier) @font-lock-variable-name-face)) (_ (_ (_ (identifier) @font-lock-variable-name-face)))]) - (pair key: (property_identifier) @font-lock-variable-name-face) (pair value: (identifier) @font-lock-variable-name-face) @@ -211,80 +245,24 @@ ts-mode--settings [(nested_identifier (identifier)) (identifier)] @font-lock-function-name-face) - (jsx_attribute (property_identifier) @font-lock-constant-face) - - [(this) (super)] @font-lock-keyword-face - - [(true) (false) (null)] @font-lock-constant-face - (regex pattern: (regex_pattern)) @font-lock-string-face - (number) @font-lock-constant-face - - (string) @font-lock-string-face - - (template_string) @js--fontify-template-string - (template_substitution - ["${" "}"] @font-lock-constant-face) - - ["!" - "abstract" - "as" - "async" - "await" - "break" - "case" - "catch" - "class" - "const" - "continue" - "debugger" - "declare" - "default" - "delete" - "do" - "else" - "enum" - "export" - "extends" - "finally" - "for" - "from" - "function" - "get" - "if" - "implements" - "import" - "in" - "instanceof" - "interface" - "keyof" - "let" - "namespace" - "new" - "of" - "private" - "protected" - "public" - "readonly" - "return" - "set" - "static" - "switch" - "target" - "throw" - "try" - "type" - "typeof" - "var" - "void" - "while" - "with" - "yield" - ] @font-lock-keyword-face - - (comment) @font-lock-comment-face - )) + (jsx_attribute (property_identifier) @font-lock-constant-face))) "Tree-sitter font-lock settings.") +(defun ts-mode--fontify-template-string (beg end node) + "Fontify template string but not substitution inside it. +BEG, END, NODE refers to the template_string node." + (ignore end) + ;; Stolen from `js--fontify-template-string' + (let ((child (treesit-node-child node 0))) + (while child + (if (equal (treesit-node-type child) "template_substitution") + (put-text-property beg (treesit-node-start child) + 'face 'font-lock-string-face) + (put-text-property beg (treesit-node-end child) + 'face 'font-lock-string-face)) + (setq beg (treesit-node-end child) + child (treesit-node-next-sibling child))))) + (defvar ts-mode--defun-type-regexp (rx (or "class_declaration" "method_definition" @@ -354,9 +332,10 @@ ts-mode (unless font-lock-defaults (setq font-lock-defaults '(nil t))) - (setq-local treesit-font-lock-settings ts-mode--settings) + (setq-local treesit-font-lock-settings ts-mode--font-lock-settings) + + (setq treesit-font-lock-feature-list '((minimal) (moderate) (full))) - (setq treesit-font-lock-feature-list '((basic))) (treesit-font-lock-enable)) (t (message "Tree sitter for TypeScript isn't available, defaulting to js-mode") -- 2.34.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-18 20:07 ` Theodor Thornhill @ 2022-10-18 20:44 ` Yuan Fu 0 siblings, 0 replies; 14+ messages in thread From: Yuan Fu @ 2022-10-18 20:44 UTC (permalink / raw) To: Theodor Thornhill; +Cc: emacs-devel > On Oct 18, 2022, at 1:07 PM, Theodor Thornhill <theo@thornhill.no> wrote: > > Theodor Thornhill <theo@thornhill.no> writes: >> The separate variables was more for readability, but I can change that back :) > > > Something like this? > > Theo > > <0001-Add-more-granular-features-in-font-locking.patch> Merged and pushed, thanks! Yuan ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 9:41 ` Theodor Thornhill 2022-10-17 11:02 ` Theodor Thornhill via Emacs development discussions. @ 2022-10-18 5:06 ` Yuan Fu 1 sibling, 0 replies; 14+ messages in thread From: Yuan Fu @ 2022-10-18 5:06 UTC (permalink / raw) To: Theodor Thornhill; +Cc: emacs-devel > On Oct 17, 2022, at 2:41 AM, Theodor Thornhill <theo@thornhill.no> wrote: > > Yuan Fu <casouri@gmail.com> writes: > >> >> Actually, thinking more of it, it working relies on the exact order of which these rules are applied: >> 1. Outer template_string >> 2. Outer template_substitution >> 3. Inner template_string >> 4. Inner template_substitution > > That's correct. > >> >> Relying on such un-guaranteed fact is a bit uncomfortable, so I just >> wrote a function that did what you suggested initially: to fontify >> parts of template_string that’s not a template_substitution. WDYT? (I >> just pushed the change.) >> > > I agree! The change looks good to me. Is there any change in performance > doing this? I'm not yet 100% on the inner workings, but if this would > slow things down that wouldn't be so nice. I didn’t do benchmarks, but I’ll be surprised if there are any difference. Yuan ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: Disable tree-sitter font-locking for smaller ranges 2022-10-17 9:00 ` Yuan Fu 2022-10-17 9:41 ` Theodor Thornhill @ 2022-10-18 1:23 ` Trey Peacock 1 sibling, 0 replies; 14+ messages in thread From: Trey Peacock @ 2022-10-18 1:23 UTC (permalink / raw) To: Yuan Fu, Theodor Thornhill; +Cc: emacs-devel "Yuan Fu" <casouri@gmail.com> writes: > Actually, thinking more of it, it working relies on the exact order of which these rules are applied: > 1. Outer template_string > 2. Outer template_substitution > 3. Inner template_string > 4. Inner template_substitution > If it's useful, I believe the reason why the queries you were using didn't work was because you were using the alternation which only allows for selecting a single option. This should work, regardless of the order: (template_substitution "${" @font-lock-constant-face "}" @font-lock-constant-face) @default (escape_sequence) @font-lock-constant-face (template_string) @font-lock-string-face However, I am unsure how to address potentially nested template substitutions. Perhaps a function could assist in that. Trey ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2022-10-18 20:44 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-10-16 10:32 Disable tree-sitter font-locking for smaller ranges Theodor Thornhill 2022-10-17 5:04 ` Yuan Fu 2022-10-17 5:49 ` Theodor Thornhill 2022-10-17 6:01 ` Yuan Fu 2022-10-17 6:33 ` Theodor Thornhill 2022-10-17 9:00 ` Yuan Fu 2022-10-17 9:41 ` Theodor Thornhill 2022-10-17 11:02 ` Theodor Thornhill via Emacs development discussions. 2022-10-18 0:20 ` Yuan Fu 2022-10-18 5:04 ` Theodor Thornhill 2022-10-18 20:07 ` Theodor Thornhill 2022-10-18 20:44 ` Yuan Fu 2022-10-18 5:06 ` Yuan Fu 2022-10-18 1:23 ` Trey Peacock
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).