使用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做出了极大的改进,如果你还没有用它,我强烈推荐你下载来试一试.