就是想用一下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
即可。其它语言同理。