【问题标题】:Custom Build System not displayed when set to Automatic设置为自动时不显示自定义构建系统
【发布时间】:2019-10-01 10:46:40
【问题描述】:

我写了一个自定义构建系统来编译和运行一个cpp文件,如下:

{
    "cmd": [
        "clang++",
        "-o",
        "$file_base_name.out",
        "$file",
        "&&",
        "./$file_base_name.out"
    ],
    "selector": "source.cpp",
    "quiet": true
}

它没有显示在自动构建系统中,我认为这是由于 selector 未被识别。我需要改变什么?

【问题讨论】:

  • 当我手动设置构建系统时,它显示clang: error: no such file or directory: '&&',这在技术上不应该发生。

标签: sublimetext3 sublimetext build-system


【解决方案1】:

确实,您使用的 scope 选择器在这里不正确; C++ 文件的scopesource.c++ 而不是source.cpp。您可以在编辑文件时使用菜单中的Tools > Developer > Show Scope Name(或相关键)来查看当前光标位置的完整范围。对于构建系统,范围弹出窗口中的第一行是您要使用的。

您的构建还有另一个问题(您在 cmets 中提到过),即构建无法按预期工作。原因是您使用 cmd 执行构建,但您使用的是 shell 构造(&&)。

当您在构建系统中指定cmd 时,您提供了一个字符串列表;第一项是您要执行的程序的名称(这里是clang++),其余项是要提供给正在执行的程序的参数。

所以在这种情况下,您要求 Sublime 直接执行 clang++,而您提供给它的参数之一是 &&,它假定它是文件名。目的是在成功编译后尝试运行该程序,但使用 && 是您的 shell(例如 bash 等)的函数,而不是 clang 的函数。

您可以尝试将"shell": true 添加到您的构建中,这会告诉Sublime 它应该尝试通过系统shell 执行cmd;它将所有内容作为一个整体传递给 shell,它知道如何处理 &&

另一种选择是改用shell_cmd;在这种情况下,您提供一个字符串,表示您将输入到终端的命令行。在这种情况下,当你执行构建时,Sublime 会自动将值传递给 shell 执行。

在你的情况下,这可能看起来像:

"shell_cmd": "clang++ -o \"${file_base_name}.out\" \"$file\" && \"./${file_base_name}.out\"",

除了值是单个字符串之外,还需要注意的是,如果您的文件名可能包含空格,则需要将所有文件名参数用双引号括起来,以便 shell 正确处理。

【讨论】:

  • 谢谢!将selector 更改为source.c++ 确实有效。但我仍然有问题。我使用cmd 能够跨行划分命令。我包含了shell: true,但它显示“clang: error: no input files”。
  • { "cmd": [ "clang++", "$file", "-o", "$file_base_name.out", "&&", "./$file_base_name.out" ], "working_dir":"$file_path", "selector": "source.c++", "shell": true }
  • 首先想到的是确保您尝试构建的文件存在于磁盘上(例如,如果您创建一个全新的文件并且从不保存它,则不会);在这种情况下,文件没有名称,$file 扩展为空。如果不是这种情况,请尝试在我的答案中将cmd 行与shell_cmd 交换,看看是否有帮助。
  • 该文件确实存在。我现在很奇怪。我想我必须坚持使用shell_cmd
  • 我见过使用"shell": true 并不总是完全复制使用shell_cmd 的情况;我很确定这是 Python 的事情,因为 Sublime 只是使用标准的 Python 模块来生成子进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多