Neomake快速入门

先说说我想解决的问题是什么。
其实主要还是想提升Linux下编程的效率。因为我的工作环境是Ubuntu (Linux) + gcc +Makefile,所以之前一直以来都是Vim编辑文件,terminal底下编译(make)调试(gdb)。因为要从文件编辑器(Vim)跳出到终端,实际上是做了两次上下文切换,没有IDE那样可以very focus。于是想到,可否通过Vim(或者NeoVim)插件来做到编译和调试。结论是可以的,只是工作的不是那么完美。
Vim GDB也有很多选择,目前我选择的是sakhnik/nvim-gdb。使用体验还不错,配合nvim,可以做到vim下进行GDB调试。虽然有bug,但还好不太影响正常使用。
Vim make相信其实也是比较普通的需求了,可以通过:make + makeprg参数来解决。缺点是不能异步执行,如果是一个大项目,就只能在那儿等着了。后来翻到"著名"的Neomake。网上搜了一下,发现虽然口碑不错,但真正用的人似乎不多,所以我用了个双引号。尤其用Neomake来编译C程序的就更凤毛麟角了。
因为没有什么快速入门的文档,所以打算写这篇博文,一方面记录自己的心得,便于以后回顾,另一方面帮助需要的人。

简单介绍

按照作者的说法,Neomake的诞生只是为了证明Vim的老牌lint插件syntastic可以异步执行。

Its origin is a proof-of-concept for Syntastic to be asynchronous.

不过现在的Neomake能做的显然比syntax checking(也就是所谓的linting)要多。起码我想用的功能就不是syntax checking。从我对Neomake文档的理解,起码有以下两大功能:
1.Syntax checking,支持各种语言,前提是指定对应的lint工具
2.automake,自动编译,其实还是目标做lint工具
3.异步make,用quickfix,location window过滤错误信息
前两者对我毫无吸引力,因为自动编译耗时耗资源,没什么意义。况且因为工作语言是C语言,这种强类型语言,编译设置太麻烦,所以没有lint的价值。
为什么要用第3条,原因是,平时用vim或nvim编辑文件,然后切到终端编译调试,上下文切换太多,感觉没有达到极致效率。当然如果能用上IDE,这一切都不是问题。IDE需要的是图形界面,工作环境里没有,否则用VS code或JetBrain家族的CLion也是个不错的选择

Neomake使用简单介绍

Neomake提供了2个基本命令来执行所谓的make操作。
第一种就是最简单默认的Neomake,它是针对文件的。主要的用途就是做lint检查,也就是很多IDE都提供的语法检查或者叫Instant build。
另一种是Neomake!,带个感叹号,它是针对项目的,即当前的工作目录(也可以通过maker的选项设置)。主要用途就是是编译,在设置好的目录下进行编译。所有的设置都是由maker提供,后文详述。
Neomake还提供了其他的功能,例如NeomakeSh来运行shell命令等等,本文不作讨论。
下面是运行Neomake做lint的界面:

automake

Neomake的automake和IDE的syntax checking非常相似。可以自动触发语法检查。但是对于C/C++这种强类型语言似乎不太友好。因为要特别的去设置头文件搜索路径,否则永远都是头文件找不到的错误。不过看起来这个功能还是挺高级的,而且似乎并不很影响性能。试试:help neomake-automake了解更多详细内容。
简单来说automake可以根据不同的模式设置编译延时时间,例如:

" When writing a buffer.
call neomake#configure#automake('w')
" When writing a buffer, and on normal mode changes (after 750ms).
call neomake#configure#automake('nw', 750)
" When reading a buffer (after 1s), and when writing.
call neomake#configure#automake('rw', 1000)

这样设置的目的是为了少做无意义的编译。当然你还可以在vimrc中做更多的酷炫的配置。
但其实我想分享的是disable automake的方法,可能因为它对C/C++不太友好吧。有两种方法可以禁止:

  • :NeomakeDisable/Toggle
  • call neomake#configure#disable_automake()
    第二种方法是从Neomake源码中搜索出来的,不知道效果如何。

Maker

maker定义了Neomake如何来lint或compile。其实就是定义了具体的命令行,以及需要识别的error format。

A maker is an object that tells Neomake how to run a job for you.

通常使用maker的方法是调用下面的Vim命令

:Neomake <maker name>

当不传入maker name的时候,Neomake会使用系统默认的maker,即makeprg maker。看,按照作者的推荐,如果只是想异步地执行make,只要配置好makeprg和error format就已经可以用了。

If you just want an easy way to run |:make| asynchronously, you're all set.
Just set your |'makeprg'| and |'errorformat'| as usual, and run |:Neomake!|.

自定义maker

定义一个最简单的maker如下:

let g:neomake_make_maker = {
    \ 'exe': 'make',
    \ 'args': ['--build'],
    \ 'errorformat': '%f:%l:%c: %m',
    \ }
" Use the maker like this:
:Neomake! make

这几个参数还是比较直接的。具体也可以参考:help neomake。对于makeprg maker,exe就是make,args就是makeprg指定的参数,而error format就是Vim默认的error format,可以通过命令set efm=xxx来设置。error format那些神奇的占位符可以参考:help errorformat帮助文档。

*注:当前目录下的.clang文件会影响到clang maker的参数。例如在.clang里写上

{
    "c": "c11",
    "cpp": "c++1z",
    "objc": "c11",
    "objcpp": "c++1z",
}

Neomake的参数会多出下面这一溜:

Define a new filetype or project-level maker

g:neomake_<name>_maker
g:neomake_<ft>_<name>_maker
" <ft> = filetype, 例如定义一个C语言的maker
g:neomake_c_clang_maker = {...}

Configure properties for a maker

g:neomake_<name>_<property>
g:neomake_<ft>_<name>_<property>
b:neomake_<name>_<property>
b:neomake_<ft>_<name>_<property>
" g: 表示全局变量, b: 表示buffer级变量

where <property> is one of 'exe', 'args', 'errorformat', 'buffer_output', 'remove_invalid_entries', 'append_file', or 'supports_stdin'.

Eabled makers

" This setting will tell Neomake which makers to use by default for the given filetype `<ft>` (when called without a maker as an argument,
g:neomake_enabled_makers
b:neomake_enabled_makers

" This setting will tell Neomake which makers to use by default for the given filetype `<ft>` (when called without a maker as an argument,
g:neomake_<ft>_enabled_makers
b:neomake_<ft>_enabled_makers

通过查看上面的全局变量可以了解到当前使能的一些maker。所有语言相关的maker都定义在neomake/neomake/autoload/neomake/makers/中。例如neomake/neomake/autoload/neomake/makers/ft/c.vim, neomake/neomake/autoload/neomake/makers/ft/cpp.vim等等。
当用户调用Neomake并传入maker名时,则直接使用对应的maker来编译。如果未传入maker名,则根据以上使能的maker来调用对应的maker编译。

当使用:Neomake时:

  • 首先尝试使用g:neomake_<ft>_enabled_makers<ft>为当前buffer的filetype
  • 若当前没有为<ft>定义的maker,则使用g:neomake_enabled_makers定义的maker

当使用:Neomake!时,则直接使用g:neomake_enabled_makers定义的maker

有用的配置

Neomake的所有信息都在它的帮助文档里,用:help neomake命令来查看吧。也可以看网页版
下面摘录一些我通读过neomake帮助文档后,认为有用的一些信息,以飨读者。

neomake-args-file

When running a maker on a file with |:Neomake|, you may want to control where in the args list the file's path will appear. To do this, insert '%t' in the args list and use append_file=0:

let g:neomake_c_lint_maker = {
    \ 'exe': 'lint',
    \ 'args': ['%t', '--option', 'x'],
    \ 'append_file': 0,
    \ 'errorformat': '%f:%l:%c: %m',
    \ }

This will cause "lint /path/to/file.c --option x" to be run instead of
"lint --option x /path/to/file.c".

%t gets replaced with the absolute path to the file (handling any temporary
file).

neomake-makers-remove_invalid_entries

Default: 0
This option filters invalid entries from makers from the location/quickfix
list (i.e. entries that do not match the |'errorformat'|, and that would show
up with a || prefix in the location/quickfix list):

    let g:neomake_ft_maker_remove_invalid_entries = 1

NOTE: the default for this is 0, because unhandled/unexpected output might be
useful, e.g. when the program displays some error.
Makers should handle this properly through |errorformat|, e.g. by using '%-G'(see |efm-ignore| and |neomake-faq-errorformat|).
* 注: 事实证明有时候啥都没有,是因为error format没设置好

neomake-makers-cwd

The working directory of a maker defaults to the current working directory of the make run (|getcwd()|).
The cwd property overrides this, and gets expanded in the context of the current buffer. Special buffers (like fugitive blobs) get handled for values starting with %: (typically used in this context), falling back to |expand()|. See |filename-modifiers|.
Example: change to the buffer's directory:

let g:neomake_my_example_maker = {
    \ 'exe': 'pwd',
    \ 'cwd': '%:p:h'
    \ }

neomake_open_list

g:neomake_open_list
This setting will open the |location-list| or |quickfix| list (depending on whether it is operating on a file) when adding entries. A value of 2 will preserve the cursor position when the |location-list| or |quickfix| window is opened. Defaults to 0.
* 解释:当有新entry来的时候是否打开quickfix或location-list,取值为2时,表示打开,并且能keep原先的位置。显然选2比较好

neomake_virtualtext_current_error

g:neomake_virtualtext_current_error
选择是否显示virtual text,显然要显示啊,多么酷炫。

neomake log

g:neomake_verbose

0 - Errors only
1 - Quiet message
2 - Loud message (may log multiple messages at once, making the screen shift momentarily)
3 - Debug information (all messages). This will also add time information to messages.

这个在使用Neomake时毫无反应时,特别有用。开启log再用:messages命令查看就可以知道发生了什么。

总结

Neomake是个异步编译不错的选择,可以考虑取代vim自带的make + makeprg,并做到异步编译。不过前提是还是要好好了解一下error format,这其中对错误处的跳转和显示有着决定性的作用。

%E5%85%88%E8%AF%B4%E8%AF%B4%E6%88%91%E6%83%B3%E8%A7%A3%E5%86%B3%E7%9A%84%E9%97%AE%E9%A2%98%E6%98%AF%E4%BB%80%E4%B9%88%E3%80%82%0A%E5%85%B6%E5%AE%9E%E4%B8%BB%E8%A6%81%E8%BF%98%E6%98%AF%E6%83%B3%E6%8F%90%E5%8D%87Linux%E4%B8%8B%E7%BC%96%E7%A8%8B%E7%9A%84%E6%95%88%E7%8E%87%E3%80%82%E5%9B%A0%E4%B8%BA%E6%88%91%E7%9A%84%E5%B7%A5%E4%BD%9C%E7%8E%AF%E5%A2%83%E6%98%AFUbuntu%20(Linux)%20%2B%20gcc%20%2BMakefile%2C%E6%89%80%E4%BB%A5%E4%B9%8B%E5%89%8D%E4%B8%80%E7%9B%B4%E4%BB%A5%E6%9D%A5%E9%83%BD%E6%98%AFVim%E7%BC%96%E8%BE%91%E6%96%87%E4%BB%B6%EF%BC%8Cterminal%E5%BA%95%E4%B8%8B%E7%BC%96%E8%AF%91(make)%E8%B0%83%E8%AF%95(gdb)%E3%80%82%E5%9B%A0%E4%B8%BA%E8%A6%81%E4%BB%8E%E6%96%87%E4%BB%B6%E7%BC%96%E8%BE%91%E5%99%A8(Vim)%E8%B7%B3%E5%87%BA%E5%88%B0%E7%BB%88%E7%AB%AF%EF%BC%8C%E5%AE%9E%E9%99%85%E4%B8%8A%E6%98%AF%E5%81%9A%E4%BA%86%E4%B8%A4%E6%AC%A1%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%EF%BC%8C%E6%B2%A1%E6%9C%89IDE%E9%82%A3%E6%A0%B7%E5%8F%AF%E4%BB%A5very%20focus%E3%80%82%E4%BA%8E%E6%98%AF%E6%83%B3%E5%88%B0%EF%BC%8C%E5%8F%AF%E5%90%A6%E9%80%9A%E8%BF%87Vim(%E6%88%96%E8%80%85NeoVim%EF%BC%89%E6%8F%92%E4%BB%B6%E6%9D%A5%E5%81%9A%E5%88%B0%E7%BC%96%E8%AF%91%E5%92%8C%E8%B0%83%E8%AF%95%E3%80%82%E7%BB%93%E8%AE%BA%E6%98%AF%E5%8F%AF%E4%BB%A5%E7%9A%84%EF%BC%8C%E5%8F%AA%E6%98%AF%E5%B7%A5%E4%BD%9C%E7%9A%84%E4%B8%8D%E6%98%AF%E9%82%A3%E4%B9%88%E5%AE%8C%E7%BE%8E%E3%80%82%0AVim%20GDB%E4%B9%9F%E6%9C%89%E5%BE%88%E5%A4%9A%E9%80%89%E6%8B%A9%EF%BC%8C%E7%9B%AE%E5%89%8D%E6%88%91%E9%80%89%E6%8B%A9%E7%9A%84%E6%98%AF%5Bsakhnik%2Fnvim-gdb%5D(https%3A%2F%2Fgithub.com%2Fsakhnik%2Fnvim-gdb)%E3%80%82%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E8%BF%98%E4%B8%8D%E9%94%99%EF%BC%8C%E9%85%8D%E5%90%88nvim%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%81%9A%E5%88%B0vim%E4%B8%8B%E8%BF%9B%E8%A1%8CGDB%E8%B0%83%E8%AF%95%E3%80%82%E8%99%BD%E7%84%B6%E6%9C%89bug%EF%BC%8C%E4%BD%86%E8%BF%98%E5%A5%BD%E4%B8%8D%E5%A4%AA%E5%BD%B1%E5%93%8D%E6%AD%A3%E5%B8%B8%E4%BD%BF%E7%94%A8%E3%80%82%0AVim%20make%E7%9B%B8%E4%BF%A1%E5%85%B6%E5%AE%9E%E4%B9%9F%E6%98%AF%E6%AF%94%E8%BE%83%E6%99%AE%E9%80%9A%E7%9A%84%E9%9C%80%E6%B1%82%E4%BA%86%EF%BC%8C%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%3Amake%20%2B%20makeprg%E5%8F%82%E6%95%B0%E6%9D%A5%E8%A7%A3%E5%86%B3%E3%80%82%E7%BC%BA%E7%82%B9%E6%98%AF%E4%B8%8D%E8%83%BD%E5%BC%82%E6%AD%A5%E6%89%A7%E8%A1%8C%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%98%AF%E4%B8%80%E4%B8%AA%E5%A4%A7%E9%A1%B9%E7%9B%AE%EF%BC%8C%E5%B0%B1%E5%8F%AA%E8%83%BD%E5%9C%A8%E9%82%A3%E5%84%BF%E7%AD%89%E7%9D%80%E4%BA%86%E3%80%82%E5%90%8E%E6%9D%A5%E7%BF%BB%E5%88%B0%22%E8%91%97%E5%90%8D%22%E7%9A%84Neomake%E3%80%82%E7%BD%91%E4%B8%8A%E6%90%9C%E4%BA%86%E4%B8%80%E4%B8%8B%EF%BC%8C%E5%8F%91%E7%8E%B0%E8%99%BD%E7%84%B6%E5%8F%A3%E7%A2%91%E4%B8%8D%E9%94%99%EF%BC%8C%E4%BD%86%E7%9C%9F%E6%AD%A3%E7%94%A8%E7%9A%84%E4%BA%BA%E4%BC%BC%E4%B9%8E%E4%B8%8D%E5%A4%9A%EF%BC%8C%E6%89%80%E4%BB%A5%E6%88%91%E7%94%A8%E4%BA%86%E4%B8%AA%E5%8F%8C%E5%BC%95%E5%8F%B7%E3%80%82%E5%B0%A4%E5%85%B6%E7%94%A8Neomake%E6%9D%A5%E7%BC%96%E8%AF%91C%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%B0%B1%E6%9B%B4%E5%87%A4%E6%AF%9B%E9%BA%9F%E8%A7%92%E4%BA%86%E3%80%82%0A%E5%9B%A0%E4%B8%BA%E6%B2%A1%E6%9C%89%E4%BB%80%E4%B9%88%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E7%9A%84%E6%96%87%E6%A1%A3%EF%BC%8C%E6%89%80%E4%BB%A5%E6%89%93%E7%AE%97%E5%86%99%E8%BF%99%E7%AF%87%E5%8D%9A%E6%96%87%EF%BC%8C%E4%B8%80%E6%96%B9%E9%9D%A2%E8%AE%B0%E5%BD%95%E8%87%AA%E5%B7%B1%E7%9A%84%E5%BF%83%E5%BE%97%EF%BC%8C%E4%BE%BF%E4%BA%8E%E4%BB%A5%E5%90%8E%E5%9B%9E%E9%A1%BE%EF%BC%8C%E5%8F%A6%E4%B8%80%E6%96%B9%E9%9D%A2%E5%B8%AE%E5%8A%A9%E9%9C%80%E8%A6%81%E7%9A%84%E4%BA%BA%E3%80%82%0A%23%23%20%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D%0A%E6%8C%89%E7%85%A7%E4%BD%9C%E8%80%85%E7%9A%84%E8%AF%B4%E6%B3%95%EF%BC%8CNeomake%E7%9A%84%E8%AF%9E%E7%94%9F%E5%8F%AA%E6%98%AF%E4%B8%BA%E4%BA%86%E8%AF%81%E6%98%8EVim%E7%9A%84%E8%80%81%E7%89%8Clint%E6%8F%92%E4%BB%B6%5Bsyntastic%5D(https%3A%2F%2Fgithub.com%2Fvim-syntastic%2Fsyntastic)%E5%8F%AF%E4%BB%A5%E5%BC%82%E6%AD%A5%E6%89%A7%E8%A1%8C%E3%80%82%0A%3E%20%20Its%20origin%20is%20a%20proof-of-concept%20for%20Syntastic%20to%20be%20asynchronous.%0A%0A%E4%B8%8D%E8%BF%87%E7%8E%B0%E5%9C%A8%E7%9A%84Neomake%E8%83%BD%E5%81%9A%E7%9A%84%E6%98%BE%E7%84%B6%E6%AF%94syntax%20checking%EF%BC%88%E4%B9%9F%E5%B0%B1%E6%98%AF%E6%89%80%E8%B0%93%E7%9A%84linting%EF%BC%89%E8%A6%81%E5%A4%9A%E3%80%82%E8%B5%B7%E7%A0%81%E6%88%91%E6%83%B3%E7%94%A8%E7%9A%84%E5%8A%9F%E8%83%BD%E5%B0%B1%E4%B8%8D%E6%98%AFsyntax%20checking%E3%80%82%E4%BB%8E%E6%88%91%E5%AF%B9Neomake%E6%96%87%E6%A1%A3%E7%9A%84%E7%90%86%E8%A7%A3%EF%BC%8C%E8%B5%B7%E7%A0%81%E6%9C%89%E4%BB%A5%E4%B8%8B%E4%B8%A4%E5%A4%A7%E5%8A%9F%E8%83%BD%EF%BC%9A%0A1.Syntax%20checking%EF%BC%8C%E6%94%AF%E6%8C%81%E5%90%84%E7%A7%8D%E8%AF%AD%E8%A8%80%EF%BC%8C%E5%89%8D%E6%8F%90%E6%98%AF%E6%8C%87%E5%AE%9A%E5%AF%B9%E5%BA%94%E7%9A%84lint%E5%B7%A5%E5%85%B7%0A2.automake%EF%BC%8C%E8%87%AA%E5%8A%A8%E7%BC%96%E8%AF%91%EF%BC%8C%E5%85%B6%E5%AE%9E%E8%BF%98%E6%98%AF%E7%9B%AE%E6%A0%87%E5%81%9Alint%E5%B7%A5%E5%85%B7%0A3.%E5%BC%82%E6%AD%A5make%EF%BC%8C%E7%94%A8quickfix%EF%BC%8Clocation%20window%E8%BF%87%E6%BB%A4%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%0A%E5%89%8D%E4%B8%A4%E8%80%85%E5%AF%B9%E6%88%91%E6%AF%AB%E6%97%A0%E5%90%B8%E5%BC%95%E5%8A%9B%EF%BC%8C%E5%9B%A0%E4%B8%BA%E8%87%AA%E5%8A%A8%E7%BC%96%E8%AF%91%E8%80%97%E6%97%B6%E8%80%97%E8%B5%84%E6%BA%90%EF%BC%8C%E6%B2%A1%E4%BB%80%E4%B9%88%E6%84%8F%E4%B9%89%E3%80%82%E5%86%B5%E4%B8%94%E5%9B%A0%E4%B8%BA%E5%B7%A5%E4%BD%9C%E8%AF%AD%E8%A8%80%E6%98%AFC%E8%AF%AD%E8%A8%80%EF%BC%8C%E8%BF%99%E7%A7%8D%E5%BC%BA%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80%EF%BC%8C%E7%BC%96%E8%AF%91%E8%AE%BE%E7%BD%AE%E5%A4%AA%E9%BA%BB%E7%83%A6%EF%BC%8C%E6%89%80%E4%BB%A5%E6%B2%A1%E6%9C%89lint%E7%9A%84%E4%BB%B7%E5%80%BC%E3%80%82%0A%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E7%94%A8%E7%AC%AC3%E6%9D%A1%EF%BC%8C%E5%8E%9F%E5%9B%A0%E6%98%AF%EF%BC%8C%E5%B9%B3%E6%97%B6%E7%94%A8vim%E6%88%96nvim%E7%BC%96%E8%BE%91%E6%96%87%E4%BB%B6%EF%BC%8C%E7%84%B6%E5%90%8E%E5%88%87%E5%88%B0%E7%BB%88%E7%AB%AF%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95%EF%BC%8C%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E5%A4%AA%E5%A4%9A%EF%BC%8C%E6%84%9F%E8%A7%89%E6%B2%A1%E6%9C%89%E8%BE%BE%E5%88%B0%E6%9E%81%E8%87%B4%E6%95%88%E7%8E%87%E3%80%82%E5%BD%93%E7%84%B6%E5%A6%82%E6%9E%9C%E8%83%BD%E7%94%A8%E4%B8%8AIDE%EF%BC%8C%E8%BF%99%E4%B8%80%E5%88%87%E9%83%BD%E4%B8%8D%E6%98%AF%E9%97%AE%E9%A2%98%E3%80%82IDE%E9%9C%80%E8%A6%81%E7%9A%84%E6%98%AF%E5%9B%BE%E5%BD%A2%E7%95%8C%E9%9D%A2%EF%BC%8C%E5%B7%A5%E4%BD%9C%E7%8E%AF%E5%A2%83%E9%87%8C%E6%B2%A1%E6%9C%89%EF%BC%8C%E5%90%A6%E5%88%99%E7%94%A8VS%20code%E6%88%96JetBrain%E5%AE%B6%E6%97%8F%E7%9A%84CLion%E4%B9%9F%E6%98%AF%E4%B8%AA%E4%B8%8D%E9%94%99%E7%9A%84%E9%80%89%E6%8B%A9%0A%23%23%23%20Neomake%E4%BD%BF%E7%94%A8%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D%0ANeomake%E6%8F%90%E4%BE%9B%E4%BA%862%E4%B8%AA%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E6%9D%A5%E6%89%A7%E8%A1%8C%E6%89%80%E8%B0%93%E7%9A%84make%E6%93%8D%E4%BD%9C%E3%80%82%0A%E7%AC%AC%E4%B8%80%E7%A7%8D%E5%B0%B1%E6%98%AF%E6%9C%80%E7%AE%80%E5%8D%95%E9%BB%98%E8%AE%A4%E7%9A%84Neomake%EF%BC%8C%E5%AE%83%E6%98%AF%E9%92%88%E5%AF%B9%E6%96%87%E4%BB%B6%E7%9A%84%E3%80%82%E4%B8%BB%E8%A6%81%E7%9A%84%E7%94%A8%E9%80%94%E5%B0%B1%E6%98%AF%E5%81%9Alint%E6%A3%80%E6%9F%A5%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E5%BE%88%E5%A4%9AIDE%E9%83%BD%E6%8F%90%E4%BE%9B%E7%9A%84%E8%AF%AD%E6%B3%95%E6%A3%80%E6%9F%A5%E6%88%96%E8%80%85%E5%8F%ABInstant%20build%E3%80%82%0A%E5%8F%A6%E4%B8%80%E7%A7%8D%E6%98%AFNeomake%EF%BC%81%EF%BC%8C%E5%B8%A6%E4%B8%AA%E6%84%9F%E5%8F%B9%E5%8F%B7%EF%BC%8C%E5%AE%83%E6%98%AF%E9%92%88%E5%AF%B9%E9%A1%B9%E7%9B%AE%E7%9A%84%EF%BC%8C%E5%8D%B3%E5%BD%93%E5%89%8D%E7%9A%84%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95%EF%BC%88%E4%B9%9F%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87maker%E7%9A%84%E9%80%89%E9%A1%B9%E8%AE%BE%E7%BD%AE%EF%BC%89%E3%80%82%E4%B8%BB%E8%A6%81%E7%94%A8%E9%80%94%E5%B0%B1%E6%98%AF%E6%98%AF%E7%BC%96%E8%AF%91%EF%BC%8C%E5%9C%A8%E8%AE%BE%E7%BD%AE%E5%A5%BD%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%8B%E8%BF%9B%E8%A1%8C%E7%BC%96%E8%AF%91%E3%80%82%E6%89%80%E6%9C%89%E7%9A%84%E8%AE%BE%E7%BD%AE%E9%83%BD%E6%98%AF%E7%94%B1maker%E6%8F%90%E4%BE%9B%EF%BC%8C%E5%90%8E%E6%96%87%E8%AF%A6%E8%BF%B0%E3%80%82%0ANeomake%E8%BF%98%E6%8F%90%E4%BE%9B%E4%BA%86%E5%85%B6%E4%BB%96%E7%9A%84%E5%8A%9F%E8%83%BD%EF%BC%8C%E4%BE%8B%E5%A6%82NeomakeSh%E6%9D%A5%E8%BF%90%E8%A1%8Cshell%E5%91%BD%E4%BB%A4%E7%AD%89%E7%AD%89%EF%BC%8C%E6%9C%AC%E6%96%87%E4%B8%8D%E4%BD%9C%E8%AE%A8%E8%AE%BA%E3%80%82%0A%E4%B8%8B%E9%9D%A2%E6%98%AF%E8%BF%90%E8%A1%8CNeomake%E5%81%9Alint%E7%9A%84%E7%95%8C%E9%9D%A2%EF%BC%9A%0A!%5Bffa363045ddb3db71e03a65a70bde5c9.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6061)%0A%E5%9C%A8Vim%E7%9A%84%E4%BB%A3%E7%A0%81%E7%95%8C%E9%9D%A2%EF%BC%8CNeomake%E4%B8%BA%E7%94%A8%E6%88%B7%E5%87%86%E5%A4%87%E4%BA%86%E5%B7%A6%E4%BE%A7%E5%B0%8F%E5%9B%BE%E6%A0%87%EF%BC%8C%E8%A1%A8%E7%A4%BA%E9%94%99%E8%AF%AF%E7%9A%84%E7%B1%BB%E5%9E%8B%EF%BC%8C%E4%BB%A3%E7%A0%81%E8%A1%8C%E4%B8%8B%E9%9D%A2%E6%9A%97%E6%9A%97%E7%9A%84%E4%B8%80%E8%A1%8C%E5%AD%97%E6%98%AFvirtual%20text%E6%98%BE%E7%A4%BA%E7%9A%84%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%E3%80%82%E8%BF%99%E4%BA%9B%E9%83%BD%E6%98%AF%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87Neomake%E7%9A%84%E9%80%89%E9%A1%B9%E8%AE%BE%E7%BD%AE%E6%88%96%E8%80%85%E5%85%B3%E9%97%AD%E7%9A%84%E3%80%82%0A%E8%AF%A6%E7%BB%86%E7%9A%84%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%E5%9C%A8quick%20fix%E6%88%96%E8%80%85location%20window%E4%B8%AD%E6%98%BE%E7%A4%BA%EF%BC%8C%E5%A6%82%E4%B8%8B%0A!%5B7cc28089f3f8bd6c477c6edfd4fb84cd.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6062)%0A%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%E6%98%BE%E7%A4%BA%E8%BF%9B%E8%A1%8C%E8%B7%B3%E8%BD%AC%E3%80%82%E8%83%BD%E4%B8%8D%E8%83%BD%E8%AF%86%E5%88%AB%E5%88%B0%E9%94%99%E8%AF%AF%E4%BD%8D%E7%BD%AE%EF%BC%8C%E5%8F%96%E5%86%B3%E4%BA%8Eerror%20format%E7%9A%84%E8%AE%BE%E7%BD%AE%E3%80%82Neomake!%E7%9A%84%E4%BD%BF%E7%94%A8%E4%B9%9F%E6%98%AF%E7%B1%BB%E4%BC%BC%E7%9A%84%EF%BC%8C%E4%B9%9F%E4%BC%9A%E4%BA%A7%E7%94%9F%E4%B8%80%E4%BA%9B%E9%94%99%E8%AF%AF%EF%BC%8C%E7%84%B6%E5%90%8E%E6%98%BE%E7%A4%BA%E5%9C%A8quick%20fix%E6%88%96location%20window%E4%B8%AD%E3%80%82%0A%23%23%23%20automake%0ANeomake%E7%9A%84automake%E5%92%8CIDE%E7%9A%84syntax%20checking%E9%9D%9E%E5%B8%B8%E7%9B%B8%E4%BC%BC%E3%80%82%E5%8F%AF%E4%BB%A5%E8%87%AA%E5%8A%A8%E8%A7%A6%E5%8F%91%E8%AF%AD%E6%B3%95%E6%A3%80%E6%9F%A5%E3%80%82%E4%BD%86%E6%98%AF%E5%AF%B9%E4%BA%8EC%2FC%2B%2B%E8%BF%99%E7%A7%8D%E5%BC%BA%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80%E4%BC%BC%E4%B9%8E%E4%B8%8D%E5%A4%AA%E5%8F%8B%E5%A5%BD%E3%80%82%E5%9B%A0%E4%B8%BA%E8%A6%81%E7%89%B9%E5%88%AB%E7%9A%84%E5%8E%BB%E8%AE%BE%E7%BD%AE%E5%A4%B4%E6%96%87%E4%BB%B6%E6%90%9C%E7%B4%A2%E8%B7%AF%E5%BE%84%EF%BC%8C%E5%90%A6%E5%88%99%E6%B0%B8%E8%BF%9C%E9%83%BD%E6%98%AF%E5%A4%B4%E6%96%87%E4%BB%B6%E6%89%BE%E4%B8%8D%E5%88%B0%E7%9A%84%E9%94%99%E8%AF%AF%E3%80%82%E4%B8%8D%E8%BF%87%E7%9C%8B%E8%B5%B7%E6%9D%A5%E8%BF%99%E4%B8%AA%E5%8A%9F%E8%83%BD%E8%BF%98%E6%98%AF%E6%8C%BA%E9%AB%98%E7%BA%A7%E7%9A%84%EF%BC%8C%E8%80%8C%E4%B8%94%E4%BC%BC%E4%B9%8E%E5%B9%B6%E4%B8%8D%E5%BE%88%E5%BD%B1%E5%93%8D%E6%80%A7%E8%83%BD%E3%80%82%E8%AF%95%E8%AF%95%60%3Ahelp%20neomake-automake%60%E4%BA%86%E8%A7%A3%E6%9B%B4%E5%A4%9A%E8%AF%A6%E7%BB%86%E5%86%85%E5%AE%B9%E3%80%82%0A%E7%AE%80%E5%8D%95%E6%9D%A5%E8%AF%B4automake%E5%8F%AF%E4%BB%A5%E6%A0%B9%E6%8D%AE%E4%B8%8D%E5%90%8C%E7%9A%84%E6%A8%A1%E5%BC%8F%E8%AE%BE%E7%BD%AE%E7%BC%96%E8%AF%91%E5%BB%B6%E6%97%B6%E6%97%B6%E9%97%B4%EF%BC%8C%E4%BE%8B%E5%A6%82%EF%BC%9A%0A%60%60%60%20vim%0A%22%20When%20writing%20a%20buffer.%0Acall%20neomake%23configure%23automake('w')%0A%22%20When%20writing%20a%20buffer%2C%20and%20on%20normal%20mode%20changes%20(after%20750ms).%0Acall%20neomake%23configure%23automake('nw'%2C%20750)%0A%22%20When%20reading%20a%20buffer%20(after%201s)%2C%20and%20when%20writing.%0Acall%20neomake%23configure%23automake('rw'%2C%201000)%0A%60%60%60%0A%E8%BF%99%E6%A0%B7%E8%AE%BE%E7%BD%AE%E7%9A%84%E7%9B%AE%E7%9A%84%E6%98%AF%E4%B8%BA%E4%BA%86%E5%B0%91%E5%81%9A%E6%97%A0%E6%84%8F%E4%B9%89%E7%9A%84%E7%BC%96%E8%AF%91%E3%80%82%E5%BD%93%E7%84%B6%E4%BD%A0%E8%BF%98%E5%8F%AF%E4%BB%A5%E5%9C%A8vimrc%E4%B8%AD%E5%81%9A%E6%9B%B4%E5%A4%9A%E7%9A%84%E9%85%B7%E7%82%AB%E7%9A%84%E9%85%8D%E7%BD%AE%E3%80%82%0A%E4%BD%86%E5%85%B6%E5%AE%9E%E6%88%91%E6%83%B3%E5%88%86%E4%BA%AB%E7%9A%84%E6%98%AFdisable%20automake%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E5%8F%AF%E8%83%BD%E5%9B%A0%E4%B8%BA%E5%AE%83%E5%AF%B9C%2FC%2B%2B%E4%B8%8D%E5%A4%AA%E5%8F%8B%E5%A5%BD%E5%90%A7%E3%80%82%E6%9C%89%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E7%A6%81%E6%AD%A2%EF%BC%9A%0A-%20%3ANeomakeDisable%2FToggle%0A-%20call%20neomake%23configure%23disable_automake()%0A%E7%AC%AC%E4%BA%8C%E7%A7%8D%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%8ENeomake%E6%BA%90%E7%A0%81%E4%B8%AD%E6%90%9C%E7%B4%A2%E5%87%BA%E6%9D%A5%E7%9A%84%EF%BC%8C%E4%B8%8D%E7%9F%A5%E9%81%93%E6%95%88%E6%9E%9C%E5%A6%82%E4%BD%95%E3%80%82%0A%0A%23%23%20Maker%0Amaker%E5%AE%9A%E4%B9%89%E4%BA%86Neomake%E5%A6%82%E4%BD%95%E6%9D%A5lint%E6%88%96compile%E3%80%82%E5%85%B6%E5%AE%9E%E5%B0%B1%E6%98%AF%E5%AE%9A%E4%B9%89%E4%BA%86%E5%85%B7%E4%BD%93%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%EF%BC%8C%E4%BB%A5%E5%8F%8A%E9%9C%80%E8%A6%81%E8%AF%86%E5%88%AB%E7%9A%84error%20format%E3%80%82%0A%3E%20A%20maker%20is%20an%20object%20that%20tells%20Neomake%20how%20to%20run%20a%20job%20for%20you.%0A%0A%E9%80%9A%E5%B8%B8%E4%BD%BF%E7%94%A8maker%E7%9A%84%E6%96%B9%E6%B3%95%E6%98%AF%E8%B0%83%E7%94%A8%E4%B8%8B%E9%9D%A2%E7%9A%84Vim%E5%91%BD%E4%BB%A4%0A%60%60%60vim%0A%3ANeomake%20%3Cmaker%20name%3E%0A%60%60%60%0A%E5%BD%93%E4%B8%8D%E4%BC%A0%E5%85%A5maker%20name%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8CNeomake%E4%BC%9A%E4%BD%BF%E7%94%A8%E7%B3%BB%E7%BB%9F%E9%BB%98%E8%AE%A4%E7%9A%84maker%EF%BC%8C%E5%8D%B3makeprg%20maker%E3%80%82%E7%9C%8B%EF%BC%8C%E6%8C%89%E7%85%A7%E4%BD%9C%E8%80%85%E7%9A%84%E6%8E%A8%E8%8D%90%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%8F%AA%E6%98%AF%E6%83%B3%E5%BC%82%E6%AD%A5%E5%9C%B0%E6%89%A7%E8%A1%8Cmake%EF%BC%8C%E5%8F%AA%E8%A6%81%E9%85%8D%E7%BD%AE%E5%A5%BDmakeprg%E5%92%8Cerror%20format%E5%B0%B1%E5%B7%B2%E7%BB%8F%E5%8F%AF%E4%BB%A5%E7%94%A8%E4%BA%86%E3%80%82%0A%3EIf%20you%20just%20want%20an%20easy%20way%20to%20run%20%7C%3Amake%7C%20asynchronously%2C%20you're%20all%20set.%0AJust%20set%20your%20%7C'makeprg'%7C%20and%20%7C'errorformat'%7C%20as%20usual%2C%20and%20run%20%7C%3ANeomake!%7C.%0A%23%23%23%20%E8%87%AA%E5%AE%9A%E4%B9%89maker%0A%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84maker%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%60%60%60vim%0Alet%20g%3Aneomake_make_maker%20%3D%20%7B%0A%20%20%20%20%5C%20'exe'%3A%20'make'%2C%0A%20%20%20%20%5C%20'args'%3A%20%5B'--build'%5D%2C%0A%20%20%20%20%5C%20'errorformat'%3A%20'%25f%3A%25l%3A%25c%3A%20%25m'%2C%0A%20%20%20%20%5C%20%7D%0A%22%20Use%20the%20maker%20like%20this%3A%0A%3ANeomake!%20make%0A%60%60%60%0A%E8%BF%99%E5%87%A0%E4%B8%AA%E5%8F%82%E6%95%B0%E8%BF%98%E6%98%AF%E6%AF%94%E8%BE%83%E7%9B%B4%E6%8E%A5%E7%9A%84%E3%80%82%E5%85%B7%E4%BD%93%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%8F%82%E8%80%83%60%3Ahelp%20neomake%60%E3%80%82%E5%AF%B9%E4%BA%8Emakeprg%20maker%EF%BC%8Cexe%E5%B0%B1%E6%98%AFmake%EF%BC%8Cargs%E5%B0%B1%E6%98%AFmakeprg%E6%8C%87%E5%AE%9A%E7%9A%84%E5%8F%82%E6%95%B0%EF%BC%8C%E8%80%8Cerror%20format%E5%B0%B1%E6%98%AFVim%E9%BB%98%E8%AE%A4%E7%9A%84error%20format%EF%BC%8C%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%60set%20efm%3Dxxx%60%E6%9D%A5%E8%AE%BE%E7%BD%AE%E3%80%82error%20format%E9%82%A3%E4%BA%9B%E7%A5%9E%E5%A5%87%E7%9A%84%E5%8D%A0%E4%BD%8D%E7%AC%A6%E5%8F%AF%E4%BB%A5%E5%8F%82%E8%80%83%60%3Ahelp%20errorformat%60%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E3%80%82%0A%0A%5C**%E6%B3%A8%EF%BC%9A%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84.clang%E6%96%87%E4%BB%B6%E4%BC%9A%E5%BD%B1%E5%93%8D%E5%88%B0clang%20maker%E7%9A%84%E5%8F%82%E6%95%B0%E3%80%82%E4%BE%8B%E5%A6%82%E5%9C%A8.clang%E9%87%8C%E5%86%99%E4%B8%8A*%0A%60%60%60json%0A%7B%0A%20%20%20%20%22c%22%3A%20%22c11%22%2C%0A%20%20%20%20%22cpp%22%3A%20%22c%2B%2B1z%22%2C%0A%20%20%20%20%22objc%22%3A%20%22c11%22%2C%0A%20%20%20%20%22objcpp%22%3A%20%22c%2B%2B1z%22%2C%0A%7D%0A%60%60%60%0ANeomake%E7%9A%84%E5%8F%82%E6%95%B0%E4%BC%9A%E5%A4%9A%E5%87%BA%E4%B8%8B%E9%9D%A2%E8%BF%99%E4%B8%80%E6%BA%9C%EF%BC%9A%0A!%5B1515429d7a7775c66c7264357294af48.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6063)%0A%E6%98%BE%E7%84%B6%E5%B0%B1%E6%98%AF%E6%8A%8A%E9%82%A3%E4%B8%AAjson%E5%AD%97%E5%85%B8%E6%94%BE%E5%88%B0%E5%8F%82%E6%95%B0%E9%87%8C%E5%8E%BB%E4%BA%86%E3%80%82SpaceVim%E7%94%A8.clang%E6%96%87%E4%BB%B6%E5%8F%AF%E4%BB%A5%E8%AF%86%E5%88%AB%E9%A1%B9%E7%9B%AE%E6%A0%B9%E7%9B%AE%E5%BD%95%EF%BC%8C%E6%89%80%E4%BB%A5%E8%A6%81%E5%B0%8F%E5%BF%83%E4%BA%86%EF%BC%8C%E4%B8%8D%E8%A6%81%E8%AE%A9%E4%BB%96%E7%A0%B4%E5%9D%8F%E4%BA%86Neomake%E7%9A%84%E5%8A%9F%E8%83%BD%E3%80%82%0A%0A%23%23%23%23%20Define%20a%20new%20filetype%20or%20project-level%20maker%0A%60%60%60vim%0Ag%3Aneomake_%3Cname%3E_maker%0Ag%3Aneomake_%3Cft%3E_%3Cname%3E_maker%0A%22%20%3Cft%3E%20%3D%20filetype%2C%20%E4%BE%8B%E5%A6%82%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AAC%E8%AF%AD%E8%A8%80%E7%9A%84maker%0Ag%3Aneomake_c_clang_maker%20%3D%20%7B...%7D%0A%60%60%60%0A%23%23%23%23%20Configure%20properties%20for%20a%20maker%0A%60%60%60vim%0Ag%3Aneomake_%3Cname%3E_%3Cproperty%3E%0Ag%3Aneomake_%3Cft%3E_%3Cname%3E_%3Cproperty%3E%0Ab%3Aneomake_%3Cname%3E_%3Cproperty%3E%0Ab%3Aneomake_%3Cft%3E_%3Cname%3E_%3Cproperty%3E%0A%22%20g%3A%20%E8%A1%A8%E7%A4%BA%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%EF%BC%8C%20b%3A%20%E8%A1%A8%E7%A4%BAbuffer%E7%BA%A7%E5%8F%98%E9%87%8F%0A%60%60%60%0Awhere%20%3Cproperty%3E%20is%20one%20of%20%60'exe'%2C%20'args'%2C%20'errorformat'%2C%20'buffer_output'%2C%20'remove_invalid_entries'%2C%20'append_file'%2C%20or%20'supports_stdin'%60.%0A%23%23%23%23%20Eabled%20makers%0A%60%60%60vim%0A%22%20This%20setting%20will%20tell%20Neomake%20which%20makers%20to%20use%20by%20default%20for%20the%20given%20filetype%20%60%3Cft%3E%60%20(when%20called%20without%20a%20maker%20as%20an%20argument%2C%0Ag%3Aneomake_enabled_makers%0Ab%3Aneomake_enabled_makers%0A%0A%22%20This%20setting%20will%20tell%20Neomake%20which%20makers%20to%20use%20by%20default%20for%20the%20given%20filetype%20%60%3Cft%3E%60%20(when%20called%20without%20a%20maker%20as%20an%20argument%2C%0Ag%3Aneomake_%3Cft%3E_enabled_makers%0Ab%3Aneomake_%3Cft%3E_enabled_makers%0A%60%60%60%0A%E9%80%9A%E8%BF%87%E6%9F%A5%E7%9C%8B%E4%B8%8A%E9%9D%A2%E7%9A%84%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E5%8F%AF%E4%BB%A5%E4%BA%86%E8%A7%A3%E5%88%B0%E5%BD%93%E5%89%8D%E4%BD%BF%E8%83%BD%E7%9A%84%E4%B8%80%E4%BA%9Bmaker%E3%80%82%E6%89%80%E6%9C%89%E8%AF%AD%E8%A8%80%E7%9B%B8%E5%85%B3%E7%9A%84maker%E9%83%BD%E5%AE%9A%E4%B9%89%E5%9C%A8%60neomake%2Fneomake%2Fautoload%2Fneomake%2Fmakers%2F%60%E4%B8%AD%E3%80%82%E4%BE%8B%E5%A6%82%60neomake%2Fneomake%2Fautoload%2Fneomake%2Fmakers%2Fft%2Fc.vim%60%2C%20%60neomake%2Fneomake%2Fautoload%2Fneomake%2Fmakers%2Fft%2Fcpp.vim%60%E7%AD%89%E7%AD%89%E3%80%82%0A%E5%BD%93%E7%94%A8%E6%88%B7%E8%B0%83%E7%94%A8Neomake%E5%B9%B6%E4%BC%A0%E5%85%A5maker%E5%90%8D%E6%97%B6%EF%BC%8C%E5%88%99%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8%E5%AF%B9%E5%BA%94%E7%9A%84maker%E6%9D%A5%E7%BC%96%E8%AF%91%E3%80%82%E5%A6%82%E6%9E%9C%E6%9C%AA%E4%BC%A0%E5%85%A5maker%E5%90%8D%EF%BC%8C%E5%88%99%E6%A0%B9%E6%8D%AE%E4%BB%A5%E4%B8%8A%E4%BD%BF%E8%83%BD%E7%9A%84maker%E6%9D%A5%E8%B0%83%E7%94%A8%E5%AF%B9%E5%BA%94%E7%9A%84maker%E7%BC%96%E8%AF%91%E3%80%82%0A%0A%E5%BD%93%E4%BD%BF%E7%94%A8%60%3ANeomake%60%E6%97%B6%EF%BC%9A%0A-%20%E9%A6%96%E5%85%88%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8%60g%3Aneomake_%3Cft%3E_enabled_makers%60%EF%BC%8C%60%3Cft%3E%60%E4%B8%BA%E5%BD%93%E5%89%8Dbuffer%E7%9A%84filetype%0A-%20%E8%8B%A5%E5%BD%93%E5%89%8D%E6%B2%A1%E6%9C%89%E4%B8%BA%60%3Cft%3E%60%E5%AE%9A%E4%B9%89%E7%9A%84maker%EF%BC%8C%E5%88%99%E4%BD%BF%E7%94%A8%60g%3Aneomake_enabled_makers%60%E5%AE%9A%E4%B9%89%E7%9A%84maker%0A%0A%E5%BD%93%E4%BD%BF%E7%94%A8%60%3ANeomake!%60%E6%97%B6%2C%E5%88%99%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8%60g%3Aneomake_enabled_makers%60%E5%AE%9A%E4%B9%89%E7%9A%84maker%0A%0A%23%23%20%E6%9C%89%E7%94%A8%E7%9A%84%E9%85%8D%E7%BD%AE%0ANeomake%E7%9A%84%E6%89%80%E6%9C%89%E4%BF%A1%E6%81%AF%E9%83%BD%E5%9C%A8%E5%AE%83%E7%9A%84%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%87%8C%EF%BC%8C%E7%94%A8%60%3Ahelp%20neomake%60%E5%91%BD%E4%BB%A4%E6%9D%A5%E6%9F%A5%E7%9C%8B%E5%90%A7%E3%80%82%E4%B9%9F%E5%8F%AF%E4%BB%A5%E7%9C%8B%5B%E7%BD%91%E9%A1%B5%E7%89%88%5D(https%3A%2F%2Fgithub.com%2Fneomake%2Fneomake%2Fblob%2Fmaster%2Fdoc%2Fneomake.txt)%E3%80%82%0A%E4%B8%8B%E9%9D%A2%E6%91%98%E5%BD%95%E4%B8%80%E4%BA%9B%E6%88%91%E9%80%9A%E8%AF%BB%E8%BF%87neomake%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E5%90%8E%EF%BC%8C%E8%AE%A4%E4%B8%BA%E6%9C%89%E7%94%A8%E7%9A%84%E4%B8%80%E4%BA%9B%E4%BF%A1%E6%81%AF%EF%BC%8C%E4%BB%A5%E9%A3%A8%E8%AF%BB%E8%80%85%E3%80%82%0A%0A%23%23%23%20neomake-args-file%0AWhen%20running%20a%20maker%20on%20a%20file%20with%20%7C%3ANeomake%7C%2C%20you%20may%20want%20to%20control%20where%20in%20the%20%60args%60%20list%20the%20file's%20path%20will%20appear.%20To%20do%20this%2C%20insert%20'%25t'%20in%20the%20%60args%60%20list%20and%20use%20%60append_file%3D0%60%3A%20%0A%60%60%60%20vim%0Alet%20g%3Aneomake_c_lint_maker%20%3D%20%7B%0A%20%20%20%20%5C%20'exe'%3A%20'lint'%2C%0A%20%20%20%20%5C%20'args'%3A%20%5B'%25t'%2C%20'--option'%2C%20'x'%5D%2C%0A%20%20%20%20%5C%20'append_file'%3A%200%2C%0A%20%20%20%20%5C%20'errorformat'%3A%20'%25f%3A%25l%3A%25c%3A%20%25m'%2C%0A%20%20%20%20%5C%20%7D%0A%60%60%60%0AThis%20will%20cause%20%22lint%20%2Fpath%2Fto%2Ffile.c%20--option%20x%22%20to%20be%20run%20instead%20of%0A%22lint%20--option%20x%20%2Fpath%2Fto%2Ffile.c%22.%0A%0A%60%25t%60%20gets%20replaced%20with%20the%20absolute%20path%20to%20the%20file%20(handling%20any%20temporary%0Afile).%0A%0A%23%23%23%20neomake-makers-remove_invalid_entries%0ADefault%3A%200%0AThis%20option%20filters%20invalid%20entries%20from%20makers%20from%20the%20location%2Fquickfix%0Alist%20(i.e.%20entries%20that%20do%20not%20match%20the%20%7C'errorformat'%7C%2C%20and%20that%20would%20show%0Aup%20with%20a%20%60%7C%7C%60%20prefix%20in%20the%20location%2Fquickfix%20list)%3A%0A%60%60%60%20vim%0A%20%20%20%20let%20g%3Aneomake_ft_maker_remove_invalid_entries%20%3D%201%0A%60%60%60%0ANOTE%3A%20the%20default%20for%20this%20is%200%2C%20because%20unhandled%2Funexpected%20output%20might%20be%0Auseful%2C%20e.g.%20when%20the%20program%20displays%20some%20error.%0A**Makers%20should%20handle%20this%20properly%20through%20%7Cerrorformat%7C%2C%20e.g.%20by%20using%20'%25-G'**(see%20%7Cefm-ignore%7C%20and%20%7Cneomake-faq-errorformat%7C).%0A%5C*%20*%E6%B3%A8%3A%20%E4%BA%8B%E5%AE%9E%E8%AF%81%E6%98%8E%E6%9C%89%E6%97%B6%E5%80%99%E5%95%A5%E9%83%BD%E6%B2%A1%E6%9C%89%EF%BC%8C%E6%98%AF%E5%9B%A0%E4%B8%BAerror%20format%E6%B2%A1%E8%AE%BE%E7%BD%AE%E5%A5%BD*%0A%0A%23%23%23%20neomake-makers-cwd%0AThe%20working%20directory%20of%20a%20maker%20defaults%20to%20the%20current%20working%20directory%20of%20the%20make%20run%20(%7Cgetcwd()%7C).%0AThe%20%60cwd%60%20property%20overrides%20this%2C%20and%20gets%20expanded%20in%20the%20context%20of%20the%20current%20buffer.%20Special%20buffers%20(like%20fugitive%20blobs)%20get%20handled%20for%20values%20starting%20with%20%60%25%3A%60%20(typically%20used%20in%20this%20context)%2C%20falling%20back%20to%20%7Cexpand()%7C.%20See%20%7Cfilename-modifiers%7C.%0AExample%3A%20change%20to%20the%20buffer's%20directory%3A%0A%60%60%60%20vim%0Alet%20g%3Aneomake_my_example_maker%20%3D%20%7B%0A%20%20%20%20%5C%20'exe'%3A%20'pwd'%2C%0A%20%20%20%20%5C%20'cwd'%3A%20'%25%3Ap%3Ah'%0A%20%20%20%20%5C%20%7D%0A%60%60%60%0A%0A%23%23%23%20neomake_open_list%0Ag%3Aneomake_open_list%0AThis%20setting%20will%20open%20the%20%7Clocation-list%7C%20or%20%7Cquickfix%7C%20list%20(depending%20on%20whether%20it%20is%20operating%20on%20a%20file)%20when%20adding%20entries.%20A%20value%20of%202%20will%20preserve%20the%20cursor%20position%20when%20the%20%7Clocation-list%7C%20or%20%7Cquickfix%7C%20window%20is%20opened.%20Defaults%20to%200.%0A%5C*%20*%E8%A7%A3%E9%87%8A%EF%BC%9A%E5%BD%93%E6%9C%89%E6%96%B0entry%E6%9D%A5%E7%9A%84%E6%97%B6%E5%80%99%E6%98%AF%E5%90%A6%E6%89%93%E5%BC%80quickfix%E6%88%96location-list%EF%BC%8C%E5%8F%96%E5%80%BC%E4%B8%BA2%E6%97%B6%EF%BC%8C%E8%A1%A8%E7%A4%BA%E6%89%93%E5%BC%80%EF%BC%8C%E5%B9%B6%E4%B8%94%E8%83%BDkeep%E5%8E%9F%E5%85%88%E7%9A%84%E4%BD%8D%E7%BD%AE%E3%80%82%E6%98%BE%E7%84%B6%E9%80%892%E6%AF%94%E8%BE%83%E5%A5%BD*%0A%0A%23%23%23%20neomake_virtualtext_current_error%0Ag%3Aneomake_virtualtext_current_error%0A%E9%80%89%E6%8B%A9%E6%98%AF%E5%90%A6%E6%98%BE%E7%A4%BAvirtual%20text%EF%BC%8C%E6%98%BE%E7%84%B6%E8%A6%81%E6%98%BE%E7%A4%BA%E5%95%8A%EF%BC%8C%E5%A4%9A%E4%B9%88%E9%85%B7%E7%82%AB%E3%80%82%0A%0A%23%23%23%20neomake%20log%0Ag%3Aneomake_verbose%0A%3E%200%20-%20Errors%20only%0A%20%201%20-%20Quiet%20message%0A%20%202%20-%20Loud%20message%20(may%20log%20multiple%20messages%20at%20once%2C%20making%20the%20screen%20shift%20momentarily)%0A%20%203%20-%20Debug%20information%20(all%20messages).%20This%20will%20also%20add%20time%20information%20to%20messages.%0A%20%20%0A%E8%BF%99%E4%B8%AA%E5%9C%A8%E4%BD%BF%E7%94%A8Neomake%E6%97%B6%E6%AF%AB%E6%97%A0%E5%8F%8D%E5%BA%94%E6%97%B6%EF%BC%8C%E7%89%B9%E5%88%AB%E6%9C%89%E7%94%A8%E3%80%82%E5%BC%80%E5%90%AFlog%E5%86%8D%E7%94%A8%60%3Amessages%60%E5%91%BD%E4%BB%A4%E6%9F%A5%E7%9C%8B%E5%B0%B1%E5%8F%AF%E4%BB%A5%E7%9F%A5%E9%81%93%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%E3%80%82%0A%0A%23%23%20%E6%80%BB%E7%BB%93%0ANeomake%E6%98%AF%E4%B8%AA%E5%BC%82%E6%AD%A5%E7%BC%96%E8%AF%91%E4%B8%8D%E9%94%99%E7%9A%84%E9%80%89%E6%8B%A9%EF%BC%8C%E5%8F%AF%E4%BB%A5%E8%80%83%E8%99%91%E5%8F%96%E4%BB%A3vim%E8%87%AA%E5%B8%A6%E7%9A%84make%20%2B%20makeprg%EF%BC%8C%E5%B9%B6%E5%81%9A%E5%88%B0%E5%BC%82%E6%AD%A5%E7%BC%96%E8%AF%91%E3%80%82%E4%B8%8D%E8%BF%87%E5%89%8D%E6%8F%90%E6%98%AF%E8%BF%98%E6%98%AF%E8%A6%81%E5%A5%BD%E5%A5%BD%E4%BA%86%E8%A7%A3%E4%B8%80%E4%B8%8Berror%20format%EF%BC%8C%E8%BF%99%E5%85%B6%E4%B8%AD%E5%AF%B9%E9%94%99%E8%AF%AF%E5%A4%84%E7%9A%84%E8%B7%B3%E8%BD%AC%E5%92%8C%E6%98%BE%E7%A4%BA%E6%9C%89%E7%9D%80%E5%86%B3%E5%AE%9A%E6%80%A7%E7%9A%84%E4%BD%9C%E7%94%A8%E3%80%82