怎样使 lsp-mode 在 js-mode 自动运行,json-mode 不自动运行?

我在 js-mode-hook 里加了 lsp,但在打开 json 文件时也会运行 lsp。

我注意到 json-mode 是从 javascript-mode define-derived-mode 而来的,不知道是不是这个原因(javascript-mode 是 js-mode 的别名)。要怎么才能做到在 js-mode 下自启动,而 json-mode 下不启动?或者还有其他的原因?

json-mode-hook 里强制关闭即可。

(add-hook 'json-mode-hook (lambda ()
                            (lsp-mode -1)))

可以把hook改成

(lambda () 
  (unless (member major-mode '(json-mode))
    (lsp-deferred)))

但json mode也有json-ls,不是也挺好的

;; NOTE: avoid lsp for json-mode
  (define-derived-mode my-js-mode js-mode "JavaScript"
    (js-use-syntactic-mode-name))
  (add-to-list 'auto-mode-alist '("\\.js\\'" . my-js-mode))

(use-package lsp-mode
  :hook
  (my-js-mode-hook . lsp-deferred))

创建新mode或改了原来的derived是最好的。不然即使开了再关,有时打开大JSON,lsp直接就先把emacs搞歇菜了,更不用说关闭。

1 个赞

我自己很少需要编辑 json 文件,只是查看一下内容,感觉开启 lsp 没必要。

1 个赞

@braineo 的答案更适合我的配置方法,也感谢其他朋友提供的思路。