[分享]在 Eglot 中使用 flycheck 代替 flymake

Eglot 是Emacs中的一款轻量化的LSP前端,我已经用了很长一段时间,除了它强依赖 Flymake(Emacs内置),其他方面总体上还是很不错的。

由于一直以来在语法检查方面都是使用Flycheck,习惯了。于是想能否让 eglot 作为flycheck 的检查器,这样就完美了。

以前也知道 doom-emacs 实现了 eglot+flycheck的组合,但一直都没尝试。最近尝试了一下,发现使用效果还不错。不知道 doom 用户有没有用 eglot 的,体验如何?

Doom 的 flycheck-eglot.el 拿过来适配一下语法,直接就能使用。但是,有以下不足:

  1. 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)

  1. 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 算了。

没错,这个折腾性价比很低。

2 个赞

最近 Purcell 已经更新他的配置支持 LSP(eglot) , 语法检查也切换到了 flymake(不过后端还是可以使用flycheck)

只有我感觉flycheck比flymake的体验更好么 :joy:

又有人写了个 flycheck-eglot。我还没试过,因为已经习惯了 flymake。