Subject: [Tree Sitter] [Feature Request] Allow Adding User-Defined Queries

From: Jacob Faibussowitsch <[email-masked]>
Date: Sun, 27 Aug 2023 14:37:16 -0400

Hello,

Is it possible for users to define their own custom font-lock queries? If so, how?

Per the documentation, font-locking is controlled by the contents of `treesit-font-lock-settings`. Perusing `lisp/progmodes/c-ts-mode.el` one finds `c-ts-mode--font-lock-settings`, which is used to populate `treesit-font-lock-settings`, but there seems to be no way to override or append to these settings.

For example, suppose that I — just for laughs — wanted to highlight the namespace name in the same face as integer-literals for:
```
// namespace.cpp
int x = 2;

namespace foo
{

}
```
I might do:
```
;; init.el

;; ensure the modes are overridden
(add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode))
(add-to-list 'major-mode-remap-alist '(c++-mode . c++-ts-mode))
(add-to-list 'major-mode-remap-alist '(c-or-c++-mode . c-or-c++-ts-mode))

;; to make it ~pop~
(set-face-attribute 'font-lock-number-face nil :foreground "red")

(use-package c-ts-mode
  :config
  (setq my-custom-font-lock-rules
    (treesit-font-lock-rules
      :language 'cpp
      :override t
      :feature 'type
      `((namespace_definition
         name: (namespace_identifier) @font-lock-number-face))))
  (setq-local treesit-font-lock-settings my-custom-font-lock-rules)
  (treesit-major-mode-setup))
```
But that does not seem to work.

You can see that 2 is obviously red, but foo is not (in fact, `M-x describe-face` reports it as “default” face). I want both foo and 2 to have the same font face.

You can reproduce this with (assuming you paste the above 2 snippets into some directory:
```
$ emacs --init-directory=`pwd` ./namespace.cpp
```

Best regards,

Jacob Faibussowitsch
(Jacob Fai - booss - oh - vitch)