treesit 已经合并进 master 分支了

@aqua0210 这个 treesit 有问题,怎么提 issues? 我发现最新的 emacs master分支, 如果使用 c-ts-mode,代码里面有 auto 关键字,emacs 直接卡死。 比如:

    for (auto i = 0; i < 0; ++i) {
    }

或者 帮我提个 issues

为什么要在c-ts-mode里这样用auto?c语言里auto后面要跟类型吧,类似static和register

换成c++-ts-mode?

不管是什么都不应该卡死才对

    for (auto int i = 0; i < 0; ++i) {
    }

这样就不会卡死。 但是 只要一删 int ,立马卡死。 不管怎么说,不应该卡死。

你发的这个链接跟人家说的一点儿关系都没有。。。

人家提出的问题是:c-ts-mode 下,变量前只有 auto 关键字时会导致 Emacs 卡死

而你给的链接是:Emacs 长时间卡在某个地方,如何排查是哪个函数导致的

如果你通过 emacs -Q 启动 Emacs,可以重现问题,就可以直接M-x report-emacs-bug,然后输入一个能够简短描述问题的标题,就会自动生成一封邮件。可以把邮件内容拷贝到你日常使用的邮箱客户端进行发送。

在邮件中描述清楚重现问题的详细步骤,只要开发者能重现,应该就能修复。

还是有关系。找出哪个函数导致卡死对定位很有帮助啊

卡住后,cpu占用100%,不管按什么键都没反应啊,也没办法定位啊

C-g 按住十几二十秒也退不出么 :rofl:

向 Emacs 进程发送 SIGUSR2 信号也无法复活吗?

这是怎么发送的?terminal?

更新:有用的知识增加了:

二更:可以在Emacs内写个命令绑上快捷键 (来源:从上边链接里抄出来的,未仔细测试,谨慎抄)


;; fronzen emacs situation

(defun spray-mode-usr2-handler ()
  "Handle case where spray mode timer is left running when the w3m
buffer it is spraying is killed inadvertently instead of stopping
spray mode first and won't respond to C-g or other mechanisms.
This will stop spray mode via an external signal: pkill -USR2
emacs.
SRC https://emacs.stackexchange.com/a/70000/37266 ."
  (interactive)
  ;; arbitrary elisp you wish to execute:
  (message "Got USR2 signal")
  (spray-stop))
(global-set-key [signal usr2] 'spray-mode-usr2-handler)
;; ............. ^ here we register the event handler that will
;; automatically be called when send-usr2-signal-to-emacs fires

(defun send-usr2-signal-to-emacs ()
  "Send pkill -USR2 emacs without command line.
SRC https://emacs.stackexchange.com/a/70000/37266 ."
  (interactive)
  (signal-process (emacs-pid) 'sigusr2))
(global-set-key (kbd "M-G") 'send-usr2-signal-to-emacs)

1 个赞

C 中不主动说明类型默认 int。建议楼上报告个 bug 吧,emacs 在任何情况下也不应该卡死。

我用这个方法设置 python-mode 使用 python-ts-mode 可以生效,但对 js-ts-mode 无效。用的 Emacs 29 分支。

  (push '(js-mode . js-ts-mode) major-mode-remap-alist)

解决了,原来不叫 js-mode, 叫 javascript-mode, 这样写就生效了:

  (push '(javascript-mode . js-ts-mode) major-mode-remap-alist)

这是目前我个人用的设置:

(when (treesit-available-p)
  (push '(sh-mode . bash-ts-mode) major-mode-remap-alist)
  (push '(c-mode . c-ts-mode) major-mode-remap-alist)
  (push '(c++-mode . c++-ts-mode) major-mode-remap-alist)
  (push '(css-mode . css-ts-mode) major-mode-remap-alist)
  (push '(javascript-mode . js-ts-mode) major-mode-remap-alist)
  (push '(js-json-mode . json-ts-mode) major-mode-remap-alist)
  (push '(python-mode . python-ts-mode) major-mode-remap-alist))
4 个赞

应该是主要看你 auto-mode-alist 里打开文件调用的 mode 是哪个吧,我记得我配置 js 的时候看到过 javascript-mode 是 js-mode 的 alias,为啥设 js-mode 不起作用我就不知道了。

我这么写了一会儿,发现一直在添加新的 ts-mode,我就直接写成了 setq 的方式,这样删减也方便些

(when (treesit-available-p)
  (setq major-mode-remap-alist
        '((c-mode          . c-ts-mode)
          (c++-mode        . c++-ts-mode)
          (conf-toml-mode  . toml-ts-mode)
          (csharp-mode     . csharp-ts-mode)
          (css-mode        . css-ts-mode)
          (java-mode       . java-ts-mode)
          (js-mode         . js-ts-mode)
          (javascript-mode . js-ts-mode)
          (js-json-mode    . json-ts-mode)
          (python-mode     . python-ts-mode)
          (ruby-mode       . ruby-ts-mode)
          (sh-mode         . bash-ts-mode))))
2 个赞

是啊,以后这个列表会越来越长,要是有个变量可全局开启 tree-sitter 支持就好了。不想开的 mode 再关就是了。

我也是这么干的,直接setq就好了。

自定义设置 配色方案后,效果还是很不错的。 分享我的相关配置:

2 个赞

如果你只想用新的 -ts-mode,完全卸载掉老的 mode,以 elixir-mode 为例,可以这么写。

(define-derived-mode elixir-mode elixir-ts-mode "Elixir")

(add-to-list 'auto-mode-alist '("\\.elixir\\'" . elixir-mode))
(add-to-list 'auto-mode-alist '("\\.ex\\'" . elixir-mode))
(add-to-list 'auto-mode-alist '("\\.exs\\'" . elixir-mode))
(add-to-list 'auto-mode-alist '("mix\\.lock" . elixir-mode))

而用 major-mode-remap-alist 会有一些问题,比如 org babel 高亮没办法生效。

;; 这样写大部分地方 ok,但是会有些地方不认 major-mode-remap-alist
(define-derived-mode elixir-mode elixir-ts-mode "Elixir")
(push '(elixir-ts-mode . elixir-mode) major-mode-remap-alist)

回复错人了,怎么改 :rofl:

define-derived-mode 可以把原来 mode 的 hook 和 map 也继承到 -ts-mode 上吗