Изменить существующую систему сборки в возвышенном тексте 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, что отнимает много времени.
Есть ли возможность каким-либо образом настроить вышеописанную систему сборки для выполнения аналогичного действия, приведенного ниже?
На cmd.
${file_base_name}.exe < TestCases.txt > TestAnswers.txt
2 ответа
Это возможно стандартным способом, который заключается в использовании перенаправления ввода и вывода в командной строке, как указано в самом вашем вопросе. Однако для того, чтобы это работало, вам нужно изменить способ определения вашей сборки.
С помощью 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
является одной строкой, все имена файлов должны быть заключены в "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 должен быть в переменной окружения