emacs-devel
[Top][All Lists]
Advanced

[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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]