c-ts-mode 报错

Problem

启用 c-ts-mode 报错,但 python-ts-mode, c+±ts-mode 正常运行

⛔ Warning (treesit): Cannot activate tree-sitter, because language grammar for c is unavailable (version-mismatch): 15
⛔ Warning (treesit): Cannot activate tree-sitter, because language grammar for c is unavailable (version-mismatch): 15
⛔ Warning (treesit): Cannot activate tree-sitter, because language grammar for c is unavailable (version-mismatch): 15

my config

use built-in packages treesit, instead of tree-sitter

(setq treesit-language-source-alist
      '((bash "https://github.com/tree-sitter/tree-sitter-bash")
        (c "https://github.com/tree-sitter/tree-sitter-c")
        ......))

(setq major-mode-remap-alist
      '((c-mode . c-ts-mode)
         ......))

treesit-language-source-alist

这个变量我记得只是指定 grammar 的源,并不下载 grammar. 你还要 treesit-install-language-grammar 才行。看看 .emacs.d/tree-sitter 下面是不是没有 c 的 grammar

这个当然有

.emacs.d/tree-sitter on  master [!]
❯ ls
libtree-sitter-bash.so        libtree-sitter-markdown.so
libtree-sitter-cpp.so         libtree-sitter-org.so
libtree-sitter-c.so           libtree-sitter-python.so
libtree-sitter-css.so         libtree-sitter-toml.so
libtree-sitter-html.so        libtree-sitter-tsx.so
libtree-sitter-javascript.so  libtree-sitter-typescript.so
libtree-sitter-json.so        libtree-sitter-yaml.so

报错最后说的是 version mismatch, 你的 libtree-sitter-c.so 是啥时候下的,要不更新一下

hhh,就是昨天下的。所以我才疑惑。

你的 emacs, 系统里的 tree-sitter lib 和这个 grammar 的版本都得对上才行。不能一个新一个旧,这就得你自己来确定了。有时候可能得降级 libtree-sitter-c.so

原來如此。 我去看看到底是怎么回事。 这是我 emacs 的版本

❯ apt list emacs
emacs/testing,testing,now 1:30.1+1-5 all [installed]

我的

Name            : emacs
Version         : 30.1-5

Name            : tree-sitter
Version         : 0.25.7-1

Library installed to /home/noel/.emacs.d/tree-sitter/libtree-sitter-c.so
("https://github.com/tree-sitter/tree-sitter-c" "v0.24.1" "src")

用起来没报错和警告

使用 20.7 的版本成功了。 下面列举一下我是如何编译的。

npm install
gcc -shared -fPIC \
    src/parser.c \
    -I./src \
    -o libtree-sitter-c.so