EMACS-DOCUMENT

=============>随便,谢谢

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