Eglot 是Emacs中的一款轻量化的LSP前端,我已经用了很长一段时间,除了它强依赖 Flymake(Emacs内置),其他方面总体上还是很不错的。
由于一直以来在语法检查方面都是使用Flycheck,习惯了。于是想能否让 eglot 作为flycheck 的检查器,这样就完美了。
以前也知道 doom-emacs 实现了 eglot+flycheck的组合,但一直都没尝试。最近尝试了一下,发现使用效果还不错。不知道 doom 用户有没有用 eglot 的,体验如何?
Doom 的 flycheck-eglot.el 拿过来适配一下语法,直接就能使用。但是,有以下不足:
- flycheck 原来的第一个检查器会和 Eglot 叠加,造成诊断错误结果有太多重复。
可以通过加入下面的判断,在启动eglot的时候自动关闭当前buffer的指定检查器。
(defun +lsp-eglot-prefer-flycheck-h ()
(when eglot--managed-mode
(flymake-mode -1)
(when-let ((current-checker (flycheck-get-checker-for-buffer)))
;; 关闭不需要的检查器
(when (memq current-checker (list 'c/c++-clang 'rust-cargo 'python-pycompile))
(flycheck-disable-checker current-checker))
(unless (equal current-checker 'eglot)
(flycheck-add-next-checker 'eglot current-checker)))
(flycheck-add-mode 'eglot major-mode)
(flycheck-mode 1)
;; Call flycheck on initilization to make sure to display initial
;; errors
(flycheck-buffer-deferred)))
(add-hook 'eglot-managed-mode-hook #'+lsp-eglot-prefer-flycheck-h)
- flycheck 默认检查的太频繁,会加大eglot的负担。
可以通过设置更长的idle时间,并且在换行时不要检查,来让flycheck更加顺滑。
这是我的flycheck配置,Doom 中也进行了相应的flycheck设置
其实也想过直接全部用 flymake 的,但是没找到 flymake 的使用文档,如果不用LSP,在c/c++ 都不知道怎么让它跑起来。
附上目前我的个人配置:
3 个赞
顺便说一下,doom 使用的这个方案,最开始是 purcell 提出来的,但是他本人觉得太 hacky,不满意。最后他采用 eglot 作者建议的相反的方式,将 flycheck 的检查器当作 flymake 的后端,于是有了下面这个包,但我是没用起来,没有 doom 的方案好。
如果给他们配上相似的快捷键,用哪个其实没有什么区别吧?
快捷键其实我基本不用的,查询错误是直接用 consult-flycheck/consult-flymake。
主要是 flycheck 在不用LSP时支持的语言更多一些。
我就是在不同的 mode 里面启动不同的,感觉用起来没有区别。
你是需要 eglot 的mode 用 flymake,其他 mode 用 flycheck?
我之前试过这种方式,但UI图标不一样,有点让人难受。个人有点强迫症😓
这种方式还有一个问题:Eglot 的 eglot-code-actions
功能用不了了,估计是因为这个功能依赖 Flymake 来标记位置。
看来还是直接用 Flymake 算了。
最近 Purcell 已经更新他的配置支持 LSP(eglot) , 语法检查也切换到了 flymake(不过后端还是可以使用flycheck)
只有我感觉flycheck比flymake的体验更好么
又有人写了个 flycheck-eglot。我还没试过,因为已经习惯了 flymake。