使用 Flycheck 替代 Flymake 来进行语法检查
今天的主角是 Flycheck,一个很好的 Flymake 替代品。
如果你用 Emacs 有一段时间了,那你也许听说过 Flymake,它是一个 Emacs 内建的 package,可以为你提供实时语法检查和高亮错误的功能。它内置于 Emacs 有超过 10 年的历史了,虽然它依然很有用,但也开始变得有些过时了。幸好,我们还有一个替代品,那就是 Sebastian Wiesner 写的 flycheck。本文就告诉你如何从 Flymake 过渡到 Flycheck.
Flycheck 的原理和 Flymake 是一样的,都是调用外部工具(可能是一个 linter,编辑器或解释器),再将当前编辑的 buffer 内容拷贝为一个文件传递给这个外部程序,然后解析返回的错误与警告并在 buffer 的相应位置高亮出来。
那么为什么我们要弃用 Flymake 呢? 其中一个原因是它默认支持的语言太少了,也就是说,你需要为大多数的编程语言来自己编写 Flymake 上的处理器。对于大多数人来说,尤其是那些对 elisp 不熟悉的人来说,这太困难了。
Flycheck 则默认支持大多数的编程语言和开发环境,比如它就支持 C 和 C++,是否带 Clang 都支持。对大多数 Emacs 用户来说,下载,安装,启用都很方便. 你只需要在 buffer 中执行 M-x flycheck-mode
就行了,也可以执行 M-x global-flycheck-mode
来为所有 buffer 开启 flycheck 功能。
使用 Flycheck 还有一个好处就是其拥有大量的第三方插件 – 如果你发现 flycheck 默认不支持你所需要的语言,可以从其他 package 仓库中查看是否有相应的插件。
就我的经验来说,切换到 Flycheck 非常的容易. 完全可以做到无缝切换。另一个重大的优势在与速度方面. Flycheck 高效的多,你甚至还可以控制语法检查的时机(用 M-x customize-group flycheck
来定制)。
Flycheck 也有它自己的快捷键前缀,默认是 C-c !
, 它为很多有用命令都分配了快捷键:
Key | Binding |
---|---|
C-c ! ? | Describe a Flycheck Checker |
C-c ! C-c | Compile using checker |
C-c ! C-w | Copy error point is on to kill ring |
C-c ! C | Clear all highlights from buffer |
C-c ! V | Report Flycheck version |
C-c ! c | Start syntax checking current buffer |
C-c ! e | Change Flycheck executable |
C-c ! i | Open Flycheck info manual |
C-c ! l | List all Flycheck errors |
C-c ! n | Jump to next error |
C-c ! p | Jump to previous error |
C-c ! s | Change Flycheck checker |
C-c ! v | Verifies the Flycheck checker works |
C-c ! x | Disable Flycheck checker in buffer |
尤其值得关注的是 C-c ! v
,它可以作为诊断工具来使用,你执行这个命令后,Flycheck 会显示当前 buffer 所用 checker 的诊断信息,可以用来发现由于 $PATH
配置错误或未安装 checker 所造成的问题。
命令 C-c ! C-c
也很方便。你不仅进可以用 Flycheck 来检查 buffer 的源代码,还能用它来编译文件,当然是否能够正常编译取决于你的编程语言以及你所使用的 checker。
Flycheck 还有一个重大的优势在于你可以很方便的添加自己的 checkers. 借助一个名为 flycheck-define-checker
的宏,通过传递几个参数你就可以创建一个 checker 了。
我特别中意使用 LISP 宏的模式匹配特性以及 rx 库,这样我就无需像 Flymake 那样写一堆的难以理解的正则表达式了。例如,下面的代码定义了一个 XML linter,你会发现它很易理解也容易修改:
(flycheck-define-checker xml-xmllint
"A XML syntax checker and validator using the xmllint utility.
The xmllint is part of libxml2, see URL
` http://www.xmlsoft.org/'."
:command ("xmllint" "--noout" source)
:error-patterns
((error line-start (file-name) ":" line ": " (message) line-end))
:modes (xml-mode nxml-mode))
总之 Flycheck 针对原始的 Flymake 做出了极大的改进,如果你还没有用它,我强烈推荐你下载来试一试。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 使用 ERT 进行 elisp 单元测试
下一篇: 使用 ido 进行 Emacs 补全
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论