Я работал с некоторыми очень простыми c awk-сценариями, которые я запускал с входным каналом из inotifywait для генерации классов машинописи с информацией из шейдеров WebGL при каждом изменении исходных файлов шейдера. Работает как очарование для того, что начиналось как расширенный oneliner.
Тогда у меня появилась милая идея начать все это с задачи vscode с помощью специального средства сопоставления проблем, чтобы посмотреть, смогу ли я получить свои 50 строк сценария для также обеспечиваем ворсинки. Я имею в виду, что они все равно просматривали файлы.
Конечно, никаких проблем там нет. Просто скопируйте пример сопоставления проблем с веб-сайта vscode, немного подправьте его для запуска в фоновом режиме, а затем добавьте некоторые выходные данные из сценария awk, которые соответствуют регулярному выражению, которое они использовали в примере. Работает как сон.
То есть если бы не было проблем и исправлений ошибок, которые невозможно удалить после того, как они были сгенерированы ...
Я действительно не использовал задачи в vscode раньше, так что я, вероятно, что-то упустил. Но то, что я получаю от некоторого прибегания к гуглу, состоит в том, что у сопоставителей проблем или их задач нет возможности устранить любые проблемы, которые они генерируют, и это намеченный способ, потому что они должны обрабатываться с помощью расширения расширений и тому подобного. Они даже не могут быть удалены пользователем вручную.
Это действительно так? Кажется, что было бы невероятно полезно иметь указатели c проекта с кратким сценарием и регулярным выражением.
Я включу свои сценарии вместе с сопоставителем проблем ниже. Я бы не стал предостерегать от использования метода inotifywait + awk для чего-либо серьезного. Это не особенно переносимо.
задач. json:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "prep-shaders",
"type": "process",
"command": "./tsc-shader.sh",
"isBackground": true,
"problemMatcher": {
"fileLocation": ["relative", "${workspaceFolder}"],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
},
"background": {
"activeOnStart": false,
"beginsPattern": "^File change detected\\. Rebuilding '.+\\ts'$",
"endsPattern": "^Build complete\\.$"
}
}
}
]
}
ts c -shader.awk:
#!/usr/bin/gawk -f
BEGIN { FS = "[ ;]"; }
function printErr(location, severity, message) {
printf("%s: %s: %s\n", location, severity, message) > "/dev/stderr"
}
function addField(name, tstype, gltype, type) {
loc = sprintf("%s:%d:%d", FILENAME, FNR, index($0, $1));
errForm = "%s storage does not match declaration '%s' at '%s'";
if (name in fields && fields[name]["gl"] != gltype) {
printErr(loc, "error", sprintf(\
errForm, name, fields[name]["type"], fields[name]["loc"]));
if (fields[name]["err"]++ == 0)
printErr(fields[name]["loc"], "error", sprintf(\
errForm, name, type, loc));
} else {
fields[name]["ts"] = tstype;
fields[name]["gl"] = gltype;
fields[name]["loc"] = loc;
fields[name]["type"] = type;
}
}
($1 == "attribute") {
addField($3, "number", "Attrib", "attribute")
}
($1 == "uniform") {
addField($3, "WebGLUniformLocation | null", "Uniform", "uniform")
}
(FNR == 1) {
n = split(FILENAME, arr, ".");
printf("%sexport const %s_SOURCE: string = `\n",
(FNR != NR ? "`\n" : ""), toupper(arr[n]));
}
{
printf("\t%s\n", $0);
}
function declareProp(name, tstype) {
printf("\tpublic readonly %s: %s;\n", name, tstype);
}
function setProp(name, gltype) {
printf("%sthis.%s = gl.get%sLocation(\n%s\tthis.shaderProgram, '%s');\n",
"\t\t", name, gltype, "\t\t", name);
}
END {
printf("`;\nexport class ShaderInfo {\n");
for (name in fields)
declareProp(name, fields[name]["ts"]);
printf("\tconstructor(\n\t\tpublic readonly shaderProgram: WebGLProgram,\n"\
"\t\tgl: WebGL2RenderingContext) {\n");
for (i in fields)
declareProp(name, fields[name]["gl"]);
printf("\t}\n}");
}
ts c -shader . sh:
#!/bin/bash
inotifywait -e close_write,moved_to,create -m src |
grep -P --line-buffered 'vert$|frag$' |
while read -r directory _ filename; do
md5sum "$directory$filename"
done |
awk '
(!($2 in a) || a[$2] != $1) {
a[$2] = $1;
print(gensub(/^(.*\/)(.*)(\.vert$|\.frag$)/, "\\1\t\\2", "g", $2));
fflush();
}
' |
while read -r dir name; do
echo "File change detected. Rebuilding 'gen/$name.shader.ts'."
./tsc-shader.awk "$dir$name.vert" "$dir$name.frag" 2>&1 >"gen/$name.shader.ts"
echo "Build complete."
done
Структура файла:
./
| .vscode/
| | tasks.json
| gen/
| | gltest.shader.ts
| src/
| | gltest.frag
| | gltest.vert
| tsc-shader.awk*
| tsc-shader.sh*