Изменить существующую систему сборки в возвышенном тексте 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 должен быть в переменной окружения

Другие вопросы по тегам