为什么emacs的treesit语法高亮没有neovim的颜色分类多,看起来感觉和

为什么emacs的treesit语法高亮没有neovim的颜色分类多,已经设置了font face level为4了,就是看起来没有neovim的好看

  1. 主题,有些主题甚至是单色调的
  2. ts-mode 的高亮 query 不全或者将一些关键字定义为使用一般的face ( xxx-ts-mode-font-lock-rules)

感觉高亮颜色颜色确实比较少,不过能自己加(可以参考一下这里面的方式)

自定义的话是不是得跟着主题走?我用过emacs lsp 的语法高亮,比treesit好很多,就是经常蹦,而且有的时候没有编译代码 所以后来没用了

我改了一点, 没啥公共接口, 看了 mode 实现, 找了个能 hook的地方干的, 好歹没有直接改 mode 源码。 不过现在我已经忘记到底啥意思了

(defun my-fontify-variable (node override start end &rest _)
  (let ((parent (treesit-node-parent node)) tyn)
    (catch 'break
      (while parent
        (setq tyn (treesit-node-type parent))
        (cond ((or (equal tyn "call_expression") (equal tyn "template_function"))
               (progn
                 (treesit-fontify-with-override (treesit-node-start node) (treesit-node-end node) 'font-lock-function-call-face override start end)
                 (throw 'break nil))))
        (cond ((or (equal tyn "argument_list") (equal tyn "field_expression")) (progn (setq parent nil) (throw 'break nil))))
        (cond (t (setq parent (treesit-node-parent parent))))))
    (when (not parent) (treesit-fontify-with-override (treesit-node-start node) (treesit-node-end node) 'font-lock-variable-use-face override start end))))
(advice-add 'c-ts-mode--fontify-variable :around (lambda (fn &rest args) (eval `(my-fontify-variable ,@args))))

(defun my-c-font-lock-settings (fn mode)
  (if (eq mode 'cpp)
      `(
        ,@(treesit-font-lock-rules
           :language 'cpp
           :feature 'function
           '((destructor_name (identifier) @font-lock-function-name-face))
           :language mode
           :feature 'property
           '((template_method (field_identifier) @font-lock-function-call-face)))
        ,@(funcall fn mode))
    (funcall fn mode)))
(advice-add 'c-ts-mode--font-lock-settings :around 'my-c-font-lock-settings)

不跟着主题走也行,可以用自己定义的face

我试一下,十分感谢。

可以对着tree-sitter-hl-mode 抄一波。 自带的确实颜色素了很多,而且不同mode之间的font lock rules的水平也参差不齐

例如29.2的cmake-ts-mode里如果elseif()里不带条件会导致整个文件的font lock退化到warning face (整个文件都是黄色的)

我当时还觉得很奇怪为什么有的文件可以高亮有的不行。人肉二分了这个1000多行的cmakelists.txt并参考了几个Melpa的包之后,我决定……不修了

emacs如果能多吸收一些casual contributor的话这样的小问题说不定能少一些

虽然说casual contributor在统计上可能帮不上什么特别大的忙,多一个手总还是好的吧

感觉大佬们对配色颜值确实不是很在意。 neovim的主题对treesiter的支持度确实蛮高的,看起来比较精致。

至少报个 bug,说不定就有人顺手修了

参考此文,需要定制几个 face

It’s worth experimenting with the font lock level: the default is conservative and in line with what Emacs normally font locks. This is one of the capstone features of tree-sitter, and you should absolutely tweak it to your liking. To go along with each feature is an equivalent font-lock--face. You can list all the pertinent faces with M-x customize-apropos-faces RET ^font-lock-. It’s very likely your theme (or your own face customizations if you maintain your own faces, like I do) is missing these customizations, so be sure to check, as their defaults make everything look rather samey.

主要不确定是不是在emacs 30里已经修了

这个很好判斷,在 github 的 emacs mirror 上找到 emacs/lisp/progmodes/cmake-ts-mode.el at 2f5c9b31161306b2b4c46c77c351c6ea6a46ff98 · emacs-mirror/emacs · GitHub

和你本地的 diff 一下就出来的,甚至你可以替換掉本地的 el.gz 文件,byte-compile 下替換 .elc 试试有没有区別。

我也不用 master,所以有几次遇到 stable release 的 bug 都是这么确认的。

这个我也遇到了,我用的ef-theme,然后使用对应的treesit mode后发现有些font lock没有实现,然后我提了issue,但是作者觉得这些新增的font lock意义不大,你可以自己看下使用的treesit mode中用了哪些font,然后自己定义缺失的就好了。 我提的issue如下: