emacs -Q + 最小配置才能说明问题。
你前面贴的看起来是从一个大配置中摘录了一小部分,无法判断这部分之外还有其他什么操作、会产生什么影响,例如以下这句用的变量来自第三方的 tree-sitter
包,但是却没有声明:
emacs -Q + 最小配置才能说明问题。
你前面贴的看起来是从一个大配置中摘录了一小部分,无法判断这部分之外还有其他什么操作、会产生什么影响,例如以下这句用的变量来自第三方的 tree-sitter
包,但是却没有声明:
如果需要额外手动设置 major-mode-remap-alist
,说明 treesit-auto
根本没生效。
你可以观察 treesit-auto--ready-p
或 treesit-ready-p
的返回值,只有当它返回 t
的时候 treesit-auto
才会起作用。
以下是一份带调试输出的最小配置:(请酌情修改)
(setq user-emacs-directory "~/.emacs.d/")
(setq package-user-dir (format "~/.emacs.d/%s.%s/elpa/"
emacs-major-version emacs-minor-version))
(package-initialize)
(require 'use-package)
(advice-add 'treesit-auto--ready-p :around
(defun treesit-auto--ready-p@debug (orig-fn mode)
(let ((return (funcall orig-fn mode)))
(message "==> [treesit-auto--ready-p] mode: %s, return: (actual: %s, expected: t)" mode return)
return)))
(use-package treesit-auto
:config
(setq treesit-font-lock-level 4)
;; 为减少输出干扰, 去掉多余的定义
(setq treesit-auto-recipe-list
`(,(make-treesit-auto-recipe
:lang 'c
:ts-mode 'c-ts-mode
:remap 'c-mode
:url "https://github.com/tree-sitter/tree-sitter-c"
:ext "\\.c\\'")))
(global-treesit-auto-mode))
(add-hook 'emacs-startup-hook
(lambda ()
(view-echo-area-messages)
(find-file "/path/to/file.c")))
我试了一下, treesit-auto--ready-p
或 treesit-ready-p
的结果如下,是不是说明实际上treesit-auto
并未起作用,我把 treesit-auto
的配置删了,好像确实不影响。 这是为啥捏,我是通过melpa安装了呀。
目前有好几个问题,
treesit-auto
为啥无效?看配置,好像就这几句话和 treesit-auto
相关。major-mode-remap-alist
起来的?也就是说把c-mode
转化成c-ts-mode
,tree-sitter
就起效果了?那我把 treesit-auto
删了,直接用这个就行。我只用C语言,这样会有问题吗?treesit-auto
不要行不行,后续我想变一下主题和语法,因为现在的颜色渲染太过单调了,局部变量,全局变量,宏定义,都是一个颜色。这个怎么配置。我看到别人的配置颜色好专业酷炫。
最后的我配置如下
;; 1. 编译emacs29.1
;; 2. 添加动态模块
(add-to-list 'treesit-extra-load-path "~/.emacs.d/tree-sitter/tree-sitter-module")
;; 3. melpa 下载 tree-auto
;; (use-package treesit-auto
;; :config
;; (global-treesit-auto-mode))
;; 这句话最管用,一下子从白茫茫一片变好了.
(setq treesit-font-lock-level 4)
;; 4. 添加模式链接
(setq major-mode-remap-alist
'((c-mode . c-ts-mode)))
原因我在 #22 楼已经说了,也给了完整的验证代码。
不生效的直接原因是 treesit-auto--ready-p
何 treesit-ready-p
返回了 nil。返回 nil 的原因是无法找到 treesit 动态库文件。你应该把动态库文件放在 ~/.emacs.d/tree-sitter
,不要有下一级目录。
我看了一下,发现我这个目录下其实一直有这两个东西。
如果现在能正常运行的话,是不是意味着treesit-auto
这玩意要不要都行?反正我自己编译了动态模块,也添加了自己的路径。现在tree-sitter
已经生效了。
你可以把你的tree-sitter 配置全部删了,用这个,然后进去执行M-x treesit-auto-install-all
这段代码会帮你把所有官方维护的grammer下载下来编译好。然后会自动帮你在有tree-sitter 模式的时候打开。
(use-package treesit-auto
:pin melpa
:demand t
:config
(setq treesit-auto-install t)
(setq treesit-font-lock-level 4)
(treesit-auto-add-to-auto-mode-alist)
(global-treesit-auto-mode))