Sublimetext3 修改sublime文本3中的现有构建系统

Sublimetext3 修改sublime文本3中的现有构建系统,sublimetext3,build-system,sublime-build,Sublimetext3,Build System,Sublime Build,我目前正在使用ST3中的以下构建系统编译.cpp代码 { "cmd": ["mingw32-g++.exe", "-c", "$file", "-o", "${file_path}/${file_base_name}.o", "&&", "mingw32-g++.exe", "-o", "${file_path}/${file_base_name}.exe", "${file_path}/${file_base_name}.o", "&&", "start

我目前正在使用ST3中的以下构建系统编译.cpp代码

{
    "cmd": ["mingw32-g++.exe", "-c", "$file", "-o", "${file_path}/${file_base_name}.o", "&&",
"mingw32-g++.exe", "-o", "${file_path}/${file_base_name}.exe", "${file_path}/${file_base_name}.o", "&&",
"start","${file_path}/${file_base_name}.exe"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c++,source.cpp",
    "shell": true
}
我面临的问题是,我需要将输入一个接一个地输入cmd,这很耗时

是否有可能以某种方式调整上述构建系统以执行下面给出的类似操作

在cmd上

${file_base_name}.exe < TestCases.txt > TestAnswers.txt

这可以通过标准方式实现,即在命令行上使用输入和输出重定向,如问题本身所述。然而,为了使其工作,您需要更改定义构建的方式

在当前操作中同时使用cmd和shell,将命令行指定为要运行的程序,并指定它应该获得的参数。这就是您现在正在执行的操作

这里要使用的是shell_cmd,在这种情况下,您可以提供一个字符串来表示完整的命令行,就像您在命令提示符中输入它一样,这总体上更容易

在不深入了解底层机制的细节的情况下,Python运行时对这两种机制的处理和执行方式有所不同,但使用shell_cmd将命令行直接交给命令处理器处理

修改的构建示例如下:

{
    "shell_cmd": "mingw32-g++.exe \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\" < Input.txt > Answers.txt",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",
}
这里要注意的第一件事是,因为shell_cmd是一个字符串,所以所有文件名都需要用引号括起来,以防止文件名包含空格,这不是使用cmd时必须做的事情,因为在这种情况下,每个参数都是一个单独的字符串

此外,这里的命令行已经清理了一点,因为您应该能够直接将文件编译成可执行文件,而不必执行单独的链接步骤。如果您使用gcc/mingw,如果您愿意,该步骤很容易添加回来

正如这里定义的,工作目录被设置为正在编译的文件存储的路径,这意味着命令正在查找的输入文件需要位于该文件夹中,而输出文件将在该文件夹中创建


如果打开输出文件,升华将在每次运行构建时重新加载它。根据您的偏好,可能会提示您,也可能不会提示您。

经过多次尝试,我想出了以下解决此问题的方法

更新的构建系统

{
    "cmd": ["C++_compile_Sublime.bat", "$file"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++,source.cpp,source.cc",
    "shell": true
}
C++_compile_Sublime.bat如下所示

mingw32-g++.exe -c %~n1.c -o %~n1.o
mingw32-g++.exe -o %~n1.exe %~n1.o
cls
%~n1.exe < Input.txt > Output.txt
正如@OdatNurd shell_cmd所指出的,它的工作非常完美


注意:C++_compile_Sublime.bat必须在环境变量中

是否尝试在现有命令中包含重定向以查看发生了什么情况?否,请您帮助我解决问题?我将只将它们作为单独的参数包含,就像您对其他所有操作所做的那样。我尝试了同样的操作,现在它只会打开一个空白的cmd屏幕。我检查了TestAnswers.txt的内容,但它仍然是空的。如果您不打算与它交互,那么在单独的窗口中启动它对您来说重要吗?