[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Treesitter query question, matching only substring of a node
From: |
Yuan Fu |
Subject: |
Re: Treesitter query question, matching only substring of a node |
Date: |
Sun, 4 Dec 2022 20:05:45 -0800 |
> On Dec 4, 2022, at 10:27 AM, Danny Freeman <danny@dfreeman.email> wrote:
>
> Hello,
>
> I am currently seeing what it will look like to add treesitter support
> for clojure-mode. I am using this grammer:
> https://github.com/sogaiu/tree-sitter-clojure
> and it is working great so far.
>
> It has definitions for nodes that match full namespaced keywords and
> symbols, such that
>
> :plain-keyword matches (kwd_lit) node
> :namespace/keyword matches (kwd_lit) node
>
> and similarly for symbols
>
> 'plain-symbol matches (sym_lit) node
> 'namespaced/symbol matches (sym_lit) node
>
> In clojure, the part before the / character is the NAMESPACE, and the
> part after the / character is the NAME.
>
> The current clojure-mode highlights the namespaced part with a different
> face than the name part.
>
> I am trying to use this existing grammer to apply different faces to the
> namespaced and named part. I can write a query that matches the whole
> keyword easily, using `treesit-font-lock-rules`
>
> ```
> (treesit-font-lock-rules
> ...
> :feature 'keyword
> :language 'clojure
> '((kwd_lit) @clojure-keyword-face)
> ...
> )
> ```
> This works fine.
>
> What I'm trying to do now is capture a substring of that node, the
> namespaced part.
>
> I can use the `:match` predicate to identify the namespace part, but the
> matched group doesn't get captured by anything
>
> ```
> (defvar kw-query
> `((((kwd_lit) @kw)
> (:match "^:.*/" @kw) ;; Can I capture this??
> )))
>
> (treesit-query-string ":namespaced/keyword" kw-query 'clojure)
> ```
>
> Is something like this possible with the treesitter query engine in
> Emacs? Or do I need to handle this at the grammer level? Perhaps with a
> field?
>
> There is an issue that was closed in the grammer's repository asking
> about this, but their advise was to do some substring matching in the
> editor, so here I am
> https://github.com/sogaiu/tree-sitter-clojure/issues/28
I suggest capturing the whole node and using a function to fontify the symbol.
With a function you can do anything you want, including applying different
faces to substrings. To do that, simply define a function and use the function
name as the capture name.
You can have a look at c-ts-mode--fontify-variable for a simple example.
Yuan