treesit 如何设置才能打开treesit-explore-mode?

配置文件如下:

(require 'tree-sitter)
(require 'tree-sitter-langs)
(require 'tree-sitter-debug)
(require 'tree-sitter-query)
(global-tree-sitter-mode)
(add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode);;自动显示代码高亮
;;;
;;;https://github.com/casouri/tree-sitter-module/releases/tag/v2.1
(setq treesit-extra-load-path '("/Users/apple/.emacs.d/tree-sitter/build-module/dist"))
(require 'treesit)
(treesit-available-p)

但是当在python文件中运行M+x treesit-explore-mode 时出现:

treesit-explore-mode: Symbol’s function definition is void: treesit-parser-list?

运行:M+x treesit-inspect mode时出现:

Treesit-Inspect mode enabled in current buffer Error in post-command-hook (treesit-inspect-node-at-point): (void-function treesit-parser-p)?

应该如何设置?

这是我的理解: 你这里require的tree-sitter 和treesit 是两个东西

  1. 你这里的 tree-sitter 是 emacs 外置的tree-sitter 包 (GitHub - emacs-tree-sitter/elisp-tree-sitter: Tree-sitter bindings for Emacs Lisp),这个在29.1即将引入内置tree-sitter前,就已经存在。tree-sitter-langs, global-tree-sitter-mode 等,都是这个包相关的。
  2. treesit 是 Emacs 29.1 (即将进入pre-test 阶段 ) 内置引入的tree-sitter (starter-guide\tree-sitter\notes\admin - emacs.git - Emacs source repository),treesit-explore-mode 是调用29.1内置的命令(你可以利用C-h f 查看该函数实现在哪里)。目前29.1内置配置的tree-sitter mode 都是 [language]-ts-mode 命名。你在一个python文件中,运行 python-ts-mode 后,就可以运行 treesit-expore-mode了。
1 个赞

我在运行M+x python-ts-mode出现以下问题:

execute-extended-command: Autoloading file /Users/apple/.emacs.d/elpa/python-0.28/python.el failed to define function python-ts-mode

python-ts-mode如何设置?

python-ts-mode 是Emacs 29.1 自带的,你需要

  1. 确保你的系统有tree sitter,这个和Emacs 没有关系,如何安装,可以在网上查找,或者参考上述的第二个链接。mac 系统 brew install 应该可以。
  2. check你的Emacs是当前支持treesit (可以调用 treesit-available-p)
  3. 你需要编译python对应的tree-sitter parser, 参考上个回复的第二个链接,里面有介绍如何安装。
2 个赞

我的emacs是emacs-plus@30, mac系统。是不是已经自带了python-ts-mode ?

1 个赞

请参考我上面的回复,自己检测。

从这一楼往下看,我就不复述自己的步骤了。

这几行都可以不要了。这是老的 emacs-tree-sitter. 现在用内置的 treesit 就好。 我就下面几行配置:

(use-package treesit
  :when (and (fboundp 'treesit-available-p)
             (treesit-available-p))
  :custom (major-mode-remap-alist
           '((c-mode          . c-ts-mode)
             (c++-mode        . c++-ts-mode)
             (cmake-mode      . cmake-ts-mode)
             (conf-toml-mode  . toml-ts-mode)
             (css-mode        . css-ts-mode)
             (js-mode         . js-ts-mode)
             (js-json-mode    . json-ts-mode)
             (python-mode     . python-ts-mode)
             (sh-mode         . bash-ts-mode)
             (typescript-mode . typescript-ts-mode))))


这个 (setq treesit-extra-load-path '("/Users/apple/.emacs.d/tree-sitter/build-module/dist")) 也不用了。 直接把 grammar 放到你的/Users/apple/.emacs.d/tree-sitter 下就好了。

具体看文档 https://git.savannah.gnu.org/cgit/emacs.git/tree/admin/notes/tree-sitter/starter-guide

4 个赞

第2条里,如何调用 treesit-available-p?我看链接的帮助里

In the tree-sitter mode, check if we can use tree-sitter with
treesit-ready-p, it will error out if tree-sitter is not ready.

启动tree-sitter mode后python 文件中的字体颜色是有变化的。 在M+x 下并没有看到treesit-available-p命令。 是将(treesit-available-p)这行命令放在init.el文件中么? 目前将(treesit-available-p)放在其中在message 只有下面这一条信息:

tree-sitter-langs: Grammar bundle v0.12.8 was already installed; skipped

M-x 调用的是 command 命令,如果不是 interactive 的函数,那就不能通过 M-x 调用。

你应该在一个 buffer 里写下 (treesit-available-p) 然后用 C-x C-e 查看结果。或者用 M-x eval-expression。

基本功不扎实就认真读别人的回复和给到的参考资料、链接的内容。你踩的坑绝大部分人都踩过。

  1. M-x eval-expression, 然后 输入(treesit-available-p) 看输出。
  2. 请参考我第一条回复:tree-sitter-mode 和 treesit 是两个东西。
  3. 请参考aqua0210的回复,直接看配置。也可以参考suliveevil的回复,看他调试的过程。

非常感谢各位的帮助。 我的emacs-plus@30没有内置treesit. Debugger entered–Lisp error: (void-variable treesit-available-p) 按照链接上的intall了。在mac 下也用brew install tree-sitter.

    git clone https://github.com/tree-sitter/tree-sitter.git
    cd tree-sitter
    make
    make install

安装了tree-sitter。同时rebuild emacs-plus@30,还是没有treesit。 没太明白下面这句话的提示应该如何操作?

Then pull the tree-sitter branch (or the master branch, if it has
merged)

如果没有内置treesit,要如何安装?

你这是源码编译安装 tree-sitter,直接 brew install tree-sitter 就可以了,没必要编译的,除非你想用开发版的 tree-sitter.

然后你编译 emacs-29 或者 emacs master 就支持 tree-sitter 特性了。

  1. 请仔细阅读我们给你的回复。treesit-available-p 这个函数可以通过我们回复的方式运行,返回是t的话,表示Emacs有treesit 支持。目前Emacs 30 (Emacs master branch) 或者当前的Emacs 29, 他们已经自带treesit了,不应该没有。

  2. brew install tree-sitter后,就不需要再从源码编译了。

    • 目前tree-sitter,我主要用来高亮文本。我发现其实非内置的elisp-tree-sitter mode,本身挺好用的,也就是你提问时,最开始的几行对应的package。它会开一个高亮的minor mode,只要我们有对应的tree-sitter language parser就行,而后者tress-sitter-langs 提供了绝大多数。
    • 作为对比,Emacs29内置的treesit目前的运行逻辑,是要给每一个major mode 增添一个ts-mode 的major mode,如果你的语言没有对应的ts-mode,还不能用,需要自己魔改添加这样的mode,使用起来非常不方便。比如我常用的R语言,就没有r-ts-mode,但我完全可以使用elisp-tree-sitter。
    • 当然,你需要用的treesit-explore-mode,这个是Emacs 内置treesit才有的应该。
  3. 我个人觉得,tree-sitter好,但目前更是锦上添花,不需要过分折腾,且目前内置的treesit 的设置还是有点复杂,对新手不友好。即使你搞不定,也没关系的,这不是核心功能。希望你不要因为这个,而忽略Emacs 本身的使用和玩耍。

3 个赞

那 Elisp 本身的 treesit 怎么启用呢?

已经安装了 GitHub - Wilfred/tree-sitter-elisp: tree-sitter grammar for emacs lisp grammar, 其他的语言都可以通过 xx-ts-mode 启用, Elisp 怎么在 treesit 中启用呢?

阅读了一下 treesit 的源码, 和 tree-sitter 不一样。

主要是加这一句 (add-hook 'emacs-lisp-mode-hook #'(lambda () (treesit-parser-create 'elisp)))

具体可以看我的 treesit 配置:

lazycat-emacs/init-treesit.el at ded606f063d1256cd41ad59cfd6d78b53cc383fc · manateelazycat/lazycat-emacs · GitHub

2 个赞

我了解到的信息是 Emacs 还没做 elisp-ts-mode,因为大多数人觉得 elisp-mode 不需要用 tree-sitter 来高亮。

但是可以用treesit来做语法结构化编辑,主要我fingertip插件依赖treesit

2 个赞

请问 brew install tree-sitter 这句话具体的操作是指什么?

这个命令是用于在 macOS 系统中安装 tree-sitter 这个程序。 如果用的是 macports 这个包管理器,还可以这样安装:

sudo port install tree-sitter