From 972944b977ba9c126268e60aebbed06cd609d54b Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 20 Aug 2025 23:45:39 +0300 Subject: [PATCH] first commit --- .vscode/launch.json | 17 ++ .vscodeignore | 4 + README.md | Bin 0 -> 1946 bytes icons/icon192_dark.png | Bin 0 -> 4165 bytes icons/icon192_light.png | Bin 0 -> 4085 bytes language-configuration.json | 20 ++ package.json | 272 ++++++++++++++++++++++ snippets/bsnc.json | 27 +++ src/extension.js | 28 +++ syntaxes/bsnc.tmLanguage.json | 425 ++++++++++++++++++++++++++++++++++ themes/bsnc-colors.json | 14 ++ vsc-extension-quickstart.md | 50 ++++ 12 files changed, 857 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 .vscodeignore create mode 100644 README.md create mode 100644 icons/icon192_dark.png create mode 100644 icons/icon192_light.png create mode 100644 language-configuration.json create mode 100644 package.json create mode 100644 snippets/bsnc.json create mode 100644 src/extension.js create mode 100644 syntaxes/bsnc.tmLanguage.json create mode 100644 themes/bsnc-colors.json create mode 100644 vsc-extension-quickstart.md diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..44a86ab --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +// A launch configuration that launches the extension inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ] + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..f369b5e --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,4 @@ +.vscode/** +.vscode-test/** +.gitignore +vsc-extension-quickstart.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e09f03c5d9ce57f0b8fabe636c2b71461aa9f33d GIT binary patch literal 1946 zcmZuy(QeyD5acs~{=+(YsO?CUjlTJzfZ;f((WWgd*G?J*;E7yH7n64^@6M9?^_@LZ zvZ4kM1c|#hyEikt9FfsX_C{9T&D~*p#GAQHN5}r9frt+OFlF<3h4smZqZ- zy=Ub^$1Y9ZMWh9jYq`*sE~pw}WUJ$@UcphG(dx>2_uV{Fv0O%Xjao9b%C8)$PCBiX z*Dp-oqC@b|^Fo!b8NIy+6}(YRTQliO?tnAMQigOya$$i>m7paU`99*U?d(_Fl-9O; zcC9M-Doy7n^UuSj=;Qp${4^rD>F{i_$y&3VpQY)~^q|`-`k>5~THA(N9Z2FRcwOs% z8NC3YCzEz+qCeggT-R(+Ty5ogU}p_-j#)gRr$fPz)%h`$DuUzk034TBK61v&MZjLo zUcr0*C+Lo$xrd5(u?Vdch?VZUgD8R0l3SRAO`+M1NtLLxbHw1KMQ<7F1fV2o9aqrC zc~#f(QDIG`mvD`!()3;2?hQL*FD8{h5@gCz z$ai`XJiBaHH1eGv3`lFW@!uK-Qb##nr|1AFLLZJp-!9IaQ{HU%7s=SDMa}sY-Nql& zQagEo^RVF_Iy*jwuvy|1co5?9MXgr3{3>At+i;Bcr2T5_+R&YIK?d*!{0jFrczTWz z9V1l0Q!B1ps&%71!5tlD4LVA88QNMG%FA#F4ymOQv5w|p=am{3V*1^J(lq@mBB{2; z*3bfhnT&BGaZ*k|ux(0-eJf$a8_{KUkzI(=SWK$kpU1+;vV)XM%(LFW)Uihz?L#=9 zrq^YO(0>$xY_^d)rTxt)5XWlNX>Pi{f&KJSE=!_XyhMsWckawEj zH09fQPT0|nD*l+sbmcd`tA~eA+Mq?Tc}c%%6EQ|hM$LIf(`J;OUnT56mXJ1ZN-nUoNX@SYkULyZ4(vKl-rll?1v{q&r@IG+U zW{~ns@b~@9w#KUs-E#%0Ou;>-1E>r_wuA}7BEqT8>!LmYnkf7XN*sl1=hMk|zHF1FN1* literal 0 HcmV?d00001 diff --git a/icons/icon192_dark.png b/icons/icon192_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c525003ed2dab31f026de8766016ddf41a04e92a GIT binary patch literal 4165 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 h3$AIS8&;qBVI)z7WUyo89{r { + var symbols = []; + for (var i = 0; i < document.lineCount; i++) { + var line = document.lineAt(i); + if (line.text.startsWith(";*** ")) { + symbols.push({ + name: line.text.substr(4).trim(), + kind: vscode.SymbolKind.Module, + location: new vscode.Location(document.uri, line.range) + }); + } + } + resolve(symbols); + }); + } +} +function deactivate() { } +exports.deactivate = deactivate; \ No newline at end of file diff --git a/syntaxes/bsnc.tmLanguage.json b/syntaxes/bsnc.tmLanguage.json new file mode 100644 index 0000000..7662cc9 --- /dev/null +++ b/syntaxes/bsnc.tmLanguage.json @@ -0,0 +1,425 @@ +{ + "scopeName": "source.bsnc", + "patterns": [ + { + "include": "#lineComments" + }, + { + "include": "#tripleCodes" + }, + { + "include": "#uao" + }, + { + "include": "#ucg" + }, + { + "include": "#variablesE" + }, + { + "include": "#toolChange" + }, + { + "include": "#spindleWithM" + }, + { + "include": "#gMoves" + }, + { + "include": "#coords" + }, + { + "include": "#cycles" + }, + { + "include": "#gArcs" + }, + { + "include": "#arcParams" + }, + { + "include": "#mCodes" + }, + { + "include": "#rptCycle" + }, + { + "include": "#gCodesValid" + }, + { + "include": "#comments" + } + ], + "repository": { + "lineComments": { + "patterns": [ + { + "match": ";.*$", + "name": "comment.line.semicolon.bsnc" + } + ] + }, + "tripleCodes": { + "patterns": [ + { + "begin": "(\\()([A-Z]{3})", + "beginCaptures": { + "1": { + "name": "punctuation.section.parens.begin.nc310" + }, + "2": { + "name": "entity.name.function.triplecode.nc310" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.parens.end.nc310" + } + }, + "patterns": [ + { + "match": ",", + "name": "punctuation.separator.comma.nc310" + }, + { + "match": "\"[^\"]*\"", + "name": "string.quoted.double.nc310" + }, + { + "match": "'[^']*'", + "name": "string.quoted.single.nc310" + }, + { + "match": "(E\\d+)", + "name": "variable.other.e-variable.nc310" + }, + { + "match": "([XYZ])([-+]?\\d+(?:\\.\\d+)?)", + "captures": { + "1": { + "name": "variable.parameter.axis.nc310" + }, + "2": { + "name": "constant.numeric.axis-value.nc310" + } + } + }, + { + "match": "([-+]?\\d+(?:\\.\\d+)?)", + "name": "constant.numeric.triplecode-arg.nc310" + } + ] + } + ] + }, + "uao": { + "patterns": [ + { + "match": "\\((UAO),(\\-?\\d+(?:\\.\\d+)?)\\)", + "captures": { + "1": { + "name": "entity.name.function.uao.bsnc" + }, + "2": { + "name": "constant.numeric.uao-value.bsnc" + } + } + } + ] + }, + "ucg": { + "patterns": [ + { + "match": "\\((UCG),(\\-?\\d+(?:\\.\\d+)?),([XYZ])([-+]?\\d+(?:\\.\\d+)?)([XYZ])([-+]?\\d+(?:\\.\\d+)?),([XYZ])([-+]?\\d+(?:\\.\\d+)?),(\\-?\\d+(?:\\.\\d+)?),(\\-?\\d+(?:\\.\\d+)?)\\)", + "captures": { + "1": { + "name": "entity.name.function.ucg.bsnc" + }, + "2": { + "name": "constant.numeric.ucg-main.bsnc" + }, + "3": { + "name": "variable.parameter.axis.bsnc" + }, + "4": { + "name": "constant.numeric.axis-value.bsnc" + }, + "5": { + "name": "variable.parameter.axis.bsnc" + }, + "6": { + "name": "constant.numeric.axis-value.bsnc" + }, + "7": { + "name": "variable.parameter.axis.bsnc" + }, + "8": { + "name": "constant.numeric.axis-value.bsnc" + }, + "9": { + "name": "constant.numeric.ucg-extra.bsnc" + }, + "10": { + "name": "constant.numeric.ucg-extra.bsnc" + } + } + } + ] + }, + "mCodes": { + "patterns": [ + { + "match": "\\b(M)(0?[0-9]{1,2})\\b", + "captures": { + "1": { + "name": "support.function.mcode.bsnc" + }, + "2": { + "name": "constant.numeric.mcode-value.bsnc" + } + } + } + ] + }, + "variablesE": { + "patterns": [ + { + "match": "\\b(E\\d+)(=)([-+]?[0-9]+(?:\\.[0-9]+)?)\\b", + "captures": { + "1": { + "name": "variable.other.e-variable.bsnc" + }, + "2": { + "name": "keyword.operator.assignment.bsnc" + }, + "3": { + "name": "constant.numeric.e-value.bsnc" + } + } + }, + { + "match": "\\b(E\\d+)\\b", + "captures": { + "1": { + "name": "variable.other.e-variable.bsnc" + } + } + } + ] + }, + "toolChange": { + "patterns": [ + { + "match": "\\b(T\\d+)(\\.\\d+)?(M6)\\b", + "captures": { + "1": { + "name": "entity.name.function.tool-number.bsnc" + }, + "2": { + "name": "constant.numeric.tool-offset.bsnc" + }, + "3": { + "name": "support.function.mcode.bsnc" + } + } + } + ] + }, + "spindleWithM": { + "patterns": [ + { + "match": "\\b(S)([0-9]+(?:\\.[0-9]+)?)(?:\\s*|)(M)(0?[0-9]{1,2})\\b", + "captures": { + "1": { + "name": "entity.name.function.spindle-speed.bsnc" + }, + "2": { + "name": "constant.numeric.spindle-speed-value.bsnc" + }, + "3": { + "name": "support.function.mcode.bsnc" + }, + "4": { + "name": "constant.numeric.mcode-value.bsnc" + } + } + } + ] + }, + "gMoves": { + "patterns": [ + { + "match": "(G0)(?=[XYZF]|$)", + "captures": { + "1": { + "name": "keyword.control.motion.rapid.bsnc" + } + } + }, + { + "match": "(G1)(?=[XYZEF]|$)", + "captures": { + "1": { + "name": "keyword.control.motion.linear.bsnc" + } + } + } + ] + }, + "gArcs": { + "patterns": [ + { + "match": "(G2)(?=[XYZRIJEF]|$)", + "captures": { + "1": { + "name": "keyword.control.motion.arc.cw.bsnc" + } + } + }, + { + "match": "(G3)(?=[XYZRIJEF]|$)", + "captures": { + "1": { + "name": "keyword.control.motion.arc.ccw.bsnc" + } + } + } + ] + }, + "arcParams": { + "patterns": [ + { + "match": "([XYZ])([-+]?[0-9]+(?:\\.[0-9]+)?)", + "captures": { + "1": { + "name": "variable.parameter.axis.bsnc" + }, + "2": { + "name": "constant.numeric.axis-value.bsnc" + } + } + }, + { + "match": "([IJ])([-+]?[0-9]+(?:\\.[0-9]+)?)", + "captures": { + "1": { + "name": "variable.parameter.arc-center.bsnc" + }, + "2": { + "name": "constant.numeric.arc-center-value.bsnc" + } + } + }, + { + "match": "(R)([-+]?[0-9]+(?:\\.[0-9]+)?)", + "captures": { + "1": { + "name": "variable.parameter.arc-radius.bsnc" + }, + "2": { + "name": "constant.numeric.arc-radius-value.bsnc" + } + } + }, + { + "match": "(F)([0-9]+(?:\\.[0-9]+)?)", + "captures": { + "1": { + "name": "variable.parameter.feedrate.bsnc" + }, + "2": { + "name": "constant.numeric.feedrate-value.bsnc" + } + } + }, + { + "match": "(E\\d+)", + "captures": { + "1": { + "name": "variable.other.e-variable.bsnc" + } + } + } + ] + }, + "coords": { + "patterns": [ + { + "match": "([XYZ])([-+]?[0-9]+(?:\\.[0-9]+)?)", + "captures": { + "1": { + "name": "variable.parameter.axis.bsnc" + }, + "2": { + "name": "constant.numeric.axis-value.bsnc" + } + } + }, + { + "match": "(F)([0-9]+(?:\\.[0-9]+)?)", + "captures": { + "1": { + "name": "variable.parameter.feedrate.bsnc" + }, + "2": { + "name": "constant.numeric.feedrate-value.bsnc" + } + } + }, + { + "match": "(E\\d+)", + "captures": { + "1": { + "name": "variable.other.e-variable.bsnc" + } + } + } + ] + }, + "cycles": { + "patterns": [ + { + "name": "keyword.control.cycle.rpt.bsnc", + "match": "\\(RPT\\s*,?\\s*E?\\d*\\)" + }, + { + "name": "keyword.control.cycle.urt.bsnc", + "match": "\\(URT\\s*,?\\s*\\d*\\)" + }, + { + "name": "keyword.control.cycle.erp.bsnc", + "match": "\\(ERP\\)" + } + ] + }, + "rptCycle": { + "patterns": [ + { + "match": "\\(RPT\\s*,?\\s*E?\\d*\\)", + "name": "keyword.control.cycle.rpt.start.bsnc" + }, + { + "match": "\\(ERP\\)", + "name": "keyword.control.cycle.rpt.end.bsnc" + } + ] + }, + "gCodesValid": { + "patterns": [ + { + "match": "\\b(G(?:0[0-9]|1|2|3|4|6|9|17|18|19|20|21|27|28|29|33|34|35|40|41|42|70|71|72|73|74|79|80|81|82|83|84|85|86|89|90|91|93|94|95|96|97))\\b", + "name": "keyword.control.gcode.valid.bsnc" + } + ] + }, + "comments": { + "patterns": [ + { + "match": "\\([^A-Z]{3}.*?\\)", + "name": "comment.block.bsnc" + } + ] + } + } +} \ No newline at end of file diff --git a/themes/bsnc-colors.json b/themes/bsnc-colors.json new file mode 100644 index 0000000..5f3b36f --- /dev/null +++ b/themes/bsnc-colors.json @@ -0,0 +1,14 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "BSNC Embedded Colors", + "type": "dark", + "tokenColors": [ + { "scope": "entity.name.function.triplecode.bsnc", "settings": { "foreground": "#FF69B4" } }, + { "scope": "constant.numeric.triplecode-arg.bsnc", "settings": { "foreground": "#40E0D0" } }, + { "scope": "variable.other.e-variable.bsnc", "settings": { "foreground": "#FFD700" } }, + { "scope": "support.function.mcode.bsnc", "settings": { "foreground": "#FFA500" } }, + { "scope": "constant.numeric.mcode-value.bsnc", "settings": { "foreground": "#40E0D0" } }, + { "scope": "keyword.control.cycle.rpt.start.bsnc", "settings": { "foreground": "#FFFFFF", "background": "#FF4500", "fontStyle": "bold" } }, + { "scope": "keyword.control.cycle.rpt.end.bsnc", "settings": { "foreground": "#FFFFFF", "background": "#228B22", "fontStyle": "bold" } } + ] +} diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md new file mode 100644 index 0000000..17f0a68 --- /dev/null +++ b/vsc-extension-quickstart.md @@ -0,0 +1,50 @@ +# BSNC Syntax & Highlighting + +Расширение для Visual Studio Code, добавляющее полноценную подсветку синтаксиса, автодополнение и цветовые схемы для программ ЧПУ в формате **BSNC / NC-310**. + +## ✨ Возможности + +- **Подсветка G/M-кодов** + Разделение кода и числовой части, поддержка слитной и раздельной записи (`G1X0Y0F500`, `S600 M3` и т.д.). +- **Подсветка трёхбуквенных кодов в скобках** + (`UCG`, `UAO`, `URT`, `RPT`, `ERP` и др.) с разбором аргументов по типам: числа, переменные, строки. +- **Подсветка переменных E** + (`E30=0`, `ZE30`) с раздельным цветом для имени и значения. +- **Выделение начала и конца циклов** + `(RPT,...)` и `(ERP)` — яркие цвета для мгновенного поиска в коде. +- **Подсветка допустимых и недопустимых G-кодов** + Валидные коды из документации — обычный цвет, неизвестные — выделяются как ошибка. +- **Подсветка комментариев** + Однострочные (`; ...`) и блочные в скобках. +- **Встроенная цветовая схема** + Все цвета для токенов уже встроены в расширение, интерфейс VS Code не меняется. + +## 📦 Установка + +1. Скачайте `.vsix` или установите из [Visual Studio Marketplace](#) (ссылка после публикации). +2. В VS Code: `Ctrl+Shift+P` → **Extensions: Install from VSIX** → выберите файл. +3. Расширение активируется автоматически для файлов с кодом BSNC. + +## 🚀 Использование + +- Откройте файл программы ЧПУ (с расширением или без). +- Подсветка и цвета применяются автоматически. +- Сниппеты: + - `ucg` → `(UCG,2,X-33X33,Y-33Y33,Z-15Z0,1,-3)` + - `urt` → `(URT,0)` + - `rpt` → `(RPT,E0)` +- Недопустимые G-коды будут выделены красным фоном. + +## ⚙️ Кастомизация + +Если хотите изменить цвета: +1. Откройте `settings.json`. +2. Добавьте свои правила в `editor.tokenColorCustomizations.textMateRules` — они перекроют встроенные. + +## 📄 Лицензия + +MIT — используйте, модифицируйте и делитесь. + +--- + +💡 **Совет:** Расширение можно использовать вместе с любыми тёмными или светлыми темами — встроенные цвета будут работать поверх.