在 sublime text 3 中修改现有的构建系统

Modify existing build system in sublime text 3

我目前在 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中一个一个输入,很费时间。

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

在命令中。

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

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

同时使用 cmdshell(正如您目前所做的那样),您将命令行指定为 运行 的程序以及它应该获取的参数(这就是你现在正在做的)。

您要在此处使用的是 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是一个字符串,所以所有的文件名都需要用"quotes"包裹起来,以防止文件名中包含空格,这不是使用 cmd 时你必须做的事情,因为在那种情况下每个参数都是一个单独的字符串。

另外,这里的命令行已经被清理了一点,因为如果您使用 gcc/mingw(如果您我更愿意,尽管该步骤很容易添加回去)。

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

如果您打开输出文件,每次 运行 构建时 Sublime 都会重新加载它(可能会提示也可能不会提示,具体取决于您的喜好)。

经过大量的尝试和尝试,我想出了以下解决这个问题的方法。

更新构建系统

{
    "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必须在环境变量