tree sitter 导致lsp失效

就是想用一下tree sitter的颜色模式。但是发现它会导致lsp失效。打开.c文件之后lsp没开启。clangd 版本是15.emacs版本是29.1.

会是什么原因?

(setq major-mode-remap-alist
      '(
        (bash-mode . bash-ts-mode)
        (c-mode . c-ts-mode)
        (rust-mode . rust-ts-mode)
        (python-mode . python-ts-mode)
        (json-mode . json-ts-mode)
        (yaml-mode . yaml-ts-mode)        
        (js2-mode . js-ts-mode)
        (typescript-mode . typescript-ts-mode)
        (css-mode . css-ts-mode)
      ))

(setq c-ts-mode-hook c-mode-hook)
(setq rust-ts-mode-hook rust-mode-hook)

你没贴 lsp 相关的配置,盲猜 lsp 只默认在原始 mode 启用了,ts-mode 没启动。可以试着手动 M-x lsp 确认下

原来的lsp和 c-mode配置是这样的:

(if (executable-find "clangd")
    (add-hook 'c-mode-hook 'lsp)
  (add-hook 'c-mode-hook 'helm-gtags-mode)
  )

后来我试着修改成下面这样,也不行


(if (executable-find "clangd")
    (add-hook 'c-ts-mode-hook 'lsp)
  (add-hook 'c-ts-mode-hook 'helm-gtags-mode)
  )

lsp 本身的配置是这样的:

(use-package lsp-mode
  :ensure
  :commands lsp
  :custom
  (lsp-eldoc-render-all nil) ; 自动在minibuf显示函数的文档打扰太多,关闭。
  (lsp-idle-delay 0.5)
  (gc-cons-threshold (* 100 1024 1024))
  (read-process-output-max (* 1024 1024))
  (treemacs-space-between-root-nodes nil)
  (company-idle-delay 0.0)
  (company-minimum-prefix-length 1)
  ;; This controls the overlays that display type and other hints inline. Enable
  ;; / disable as you prefer. Well require a `lsp-workspace-restart' to have an
  ;; effect on open projects.
  ;; what to use when checking on-save. "check" is default, I prefer clippy
  (lsp-rust-analyzer-cargo-watch-command "clippy")
  (lsp-rust-analyzer-server-display-inlay-hints t)
  (lsp-rust-analyzer-display-lifetime-elision-hints-enable "skip_trivial")
  (lsp-rust-analyzer-display-chaining-hints t)
  (lsp-rust-analyzer-display-lifetime-elision-hints-use-parameter-names nil)
  (lsp-rust-analyzer-display-closure-return-type-hints t)
  (lsp-rust-analyzer-display-parameter-hints nil)
  (lsp-rust-analyzer-display-reborrow-hints nil)
  :bind (:map lsp-mode-map
              ;; 跳到定义  M-.  xref-find-definitions
              ;; 返回      M-,  xref-pop-marker-stack              
              ("M-r" . lsp-find-references)
              ("M-j" . lsp-ui-imenu)                    ; 当前buff内的符号。没有模糊查找 helm-semantic-or-imenu 或 helm-imenu 更好.
              ("C-c C-c S" . lsp-treemacs-symbols)      ; 当前buff内的符号。没模糊查找。
              ("C-c x i" . helm-lsp-workspace-symbol)   ; 整个项目的符号。
              
              ("C-c C-c g" . lsp-find-definition)      ; 同 M-.
              ("C-c C-c d" . lsp-find-declaration)     ; 同 M-.
              ("C-c C-c t" . lsp-find-type-definition) ; 同 M-.
              ("C-c C-c i" . lsp-find-implementation)
              ("C-c C-c h" . lsp-treemacs-call-hierarchy)  ; 显示函数调用级别
              
              ("C-c C-p r" . lsp-ui-peek-find-references)
              ("C-c C-p d" . lsp-ui-peek-find-definitions)   ; 同 M-.
              ("C-c C-p i" . lsp-ui-peek-find-implementation)
              ;; ("C-c C-p s" . lsp-ui-peek-find-workspace-symbol) ; 整个项目的符号。c语言中找不到。helm-lsp-workspace-symbol 更好

              ("C-c C-c l" . flycheck-list-errors)
              ("C-c C-c r" . lsp-rename)
              
              ("C-c C-c p" . lsp-describe-thing-at-point)
              ("C-c C-c u" . lsp-ui-doc-glance)
              ("C-c C-c s" . lsp-rust-analyzer-status)
              ("C-c C-c e" . lsp-rust-analyzer-expand-macro)

              ;; ("C-c C-c a" . lsp-execute-code-action)
              ;; ("C-c C-c q" . lsp-workspace-restart)
              ;; ("C-c C-c Q" . lsp-workspace-shutdown)
              )
  :config
  (setq lsp-lens-enable nil)
  (setq lsp-eldoc-hook nil)                                 ; minibuf提示的文档说明,太打扰。用lsp-ui-doc-glance
  (setq lsp-enable-symbol-highlighting nil)                 ; 光标所在位置关键字高亮
  ;; (setq lsp-signature-auto-activate nil)
  (setq lsp-rust-analyzer-server-display-inlay-hints nil)   ; 在变量函数后面标记类型说明,容易被误以为实际写的代码
  (setq lsp-headerline-breadcrumb-enable nil)               ; 在编辑器抬头显示文件路径和函数名。see: which-function-mode
  (setq lsp-modeline-code-actions-enable t)                 ; modeline上的灯泡
  ;; (setq lsp-enable-indentation nil)                      ; 关闭lsp的indent.目录下用.clang_format
  (add-hook 'lsp-mode-hook 'lsp-ui-mode)
  (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration)
  (add-hook 'rustic-mode-hook 'lsp)
  )

(define-derived-mode c-mode c-ts-mode "C")
(dolist (ext '("\\.c\\'"))
  (setf auto-mode-alist (assoc-delete-all ext auto-mode-alist))
  (add-to-list 'auto-mode-alist `(,ext . c-mode)))
1 个赞

多谢。这个可以了。

如果其他的mode python-mode之类,照抄一遍就可以么?

是的,这样设置完全不需要安装 c-mode 之类的,只留 c-ts-mode 即可。其它语言同理。

多谢。我试试。