如何在 Sublime Text 3 中捕获忍者构建系统的输出?

How to capture output of ninja build system in Sublime Text 3?

我正在尝试在 Sublime Text 3 中设置 ninja 构建系统,该系统不支持开箱即用。我用介子生成 ninja.build 文件。我的构建系统配置如下:

{
    "cmd": ["ninja", "-C", "$folder/build/"],
    "keyfiles": ["meson.build", "build.ninja"],
    "file_regex": "^../([^:\n]*):([0-9]+)?.([0-9]+)?(.*):? (.*)$",
}

根据 manual,我需要使用正则表达式捕获 2、3 或 4 个组。示例错误如下所示:

../src/View/Setup.vala:345.36-345.38: error: The name `loc' does not exist in the context of `View.Setup.setup_storage_location._lambda10_'
                storage_location = loc;
                                   ^^^

我可以用 F4 跳转到错误,但文件没有打开,即使第一组是文件。 即使 ninja 提供错误的开始(行、列)和结束(行、列),我如何获得所有 4 个组(文件、行、列、消息)?

为了捕获 Sublime 支持的所有部分(文件、row/col 和消息),您需要制作一个只捕获这些部分的 file_regex。在这种情况下,这意味着您需要匹配(但不捕获)结束范围,以便您可以在结束时获取错误消息。

该正则表达式可能如下所示:

"file_regex": "^([^:]+):(\d+)?\.(\d+)-\d+\.\d+: (.*)"

根据上面的输出,这将捕获文件名,前两个值作为行和列,然后匹配但忽略结束范围位置,将其他所有内容作为消息。

另请注意,输出中的文件名是相对文件名,因此 Sublime 将尝试这样打开它们。然而,当前目录可能不是你所期望的,因为 Sublime 的当前目录可能与你构建的执行目录不同。

如果您发现即使使用当前的正则表达式,文件似乎也无法打开(但会创建一个选项卡),这就是发生这种情况的原因。

要解决该问题,您需要将错误中显示的所有文件名都设为绝对路径,或者需要将 working_dir 键添加到构建系统以明确指定路径的相对路径。

一个例子如下:

    "working_dir": "${folder:${project_path:${file_path}}}",

这会将工作目录设置为侧边栏中的第一个顶级文件夹,如果不存在文件夹则回退到当前项目存储的位置,如果不存在则回退到当前文件的路径也没有项目。