修改现有构建系统中的文字3

时间:2019-02-11 20:17:55

标签: 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","${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

2 个答案:

答案 0 :(得分:1)

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

同时使用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会在每次运行构建时重新加载它(根据您的喜好,系统可能会提示或不提示您)。

答案 1 :(得分:0)

经过反复尝试,我想出了以下解决此问题的方法。

更新的构建系统

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