MAML
提供开发增强功能和诊断工具。
主要功能
文本编辑和格式化
- XML 属性排序 — 自动排序和格式化 XML 属性,支持属性权重优化
- 诊断自动选中 — 点击诊断错误时自动选中内容,便于快速修改
- 表达式格式化 — 自动格式化复杂表达式,提高可读性
- 序列插入 — 快速生成数字序列、日期序列、字符串序列,支持历史记录(功能从https://marketplace.visualstudio.com/items?itemName=volkerdobler.insertnums提取并修改)
视觉反馈和预览
- 图片预览 — 悬浮预览图片 URL 和本地路径,支持多种格式和路径映射 (功能从https://marketplace.visualstudio.com/items?itemName=kisstkondoros.vscode-gutter-preview提取并修改)
- 颜色高亮 — 高亮显示颜色值,支持多种格式,可快速复制和修改透明度
- 缓动函数预览 — 30+ 种缓动函数(Sine、Quad、Cubic 等)和 SVG 曲线可视化
- 混合模式演示 — 交互式混合模式选择器和实时视觉演示
- 括号范围高亮 — 光标在括号内时高亮匹配的括号对和包含范围
智能代码补全和提示
- 属性名智能补全 — 根据标签类型智能提示可用属性,属性名右侧直接显示描述说明
- 智能排序 — 属性补全按标签专属性、语义优先级、使用频率综合排序
- 属性值智能提示 — 显示命令、动作、类型、传感器等属性值的详细说明和文档
- 图片路径补全 — 为 src 属性提供项目内图片文件路径补全,支持 .png/.jpg/.svg/.pag/.mp4 等格式
- 变量补全 — 输入 @/#/$/$$ 触发变量补全,包括全局变量、用户自定义变量
- SDK 点变量补全 — 输入
#elementName. 触发 SDK 自动变量后缀补全(x, y, alpha 等)
- 内置函数补全 — 智能提示 MAML 内置函数(sin、cos、ifelse 等),显示函数签名和参数说明
- 智能引用补全 — 根据标签上下文补全 target、name、states 等引用属性
- Hover 悬浮提示 — 展示表达式、属性、类型等详细信息,支持点击快速填充
- 标签名悬浮提示 — 悬浮在标签名上显示该标签的功能简介
- 传感器类型表 — 悬浮提示时显示传感器数据索引表,支持交互式切换
代码导航
- 定义跳转(F12) — 快速跳转到变量、函数、状态等定义位置
- 查找引用(Shift+F12) — 查找变量、函数、动画状态等的所有引用
- 表达式变量跳转 — 在表达式中点击变量引用直接跳转到定义
代码重构
- 变量重命名(F2) — 重命名变量时同时更新所有引用,支持 @/#/$/$$ 前缀
- 提取变量 — 选中表达式后可提取为新变量,自动推断类型
- 内联变量 — 将变量引用替换为其表达式值
快速修复(CodeAction)
- 添加 Permanence 声明 — 自动添加缺失的持久化变量声明
- 添加 const 属性 — 为被覆盖的变量添加 const="true"
- 移除无效属性 — 移除字符串类型变量的 threshold 属性
- 修复变量类型 — 修改变量类型以匹配 JSON 函数返回值
- 添加缺失按钮 — 为 Clock 添加 clock_button 按钮
- 添加 name 属性 — 自动生成变量名
表达式编辑
- 表达式语法高亮 — 为表达式内容提供语法高亮(函数、变量、数字、运算符、括号)
- 表达式语义标记 — 基于 Semantic Token 的精确着色,可自定义颜色
- 括号匹配检查 — 检查表达式中括号是否完全匹配
- 表达式完整支持 — 支持所有 MAML 表达式属性,包括变量、函数、运算符等
语言诊断和代码检查
| 检查项 |
描述 |
| 重复属性定义 |
检查标签内是否有相同属性出现多次 |
| 重复变量声明 |
检查 Var 标签是否有重复的变量声明 |
| 标签重复定义 |
检查仅允许一次的标签是否重复定义 |
| 缺失必需父标签 |
检查标签是否在其必需的父标签内 |
| 数组初始化检查 |
检查数组类型变量是否有 size 或 values 初始化 |
| 括号匹配 |
检查表达式中括号是否完全匹配 |
| 函数递归检测 |
检测 Function 直接或间接调用自身形成循环 |
| Permanence 引用 |
检查 PermanenceCommand 是否引用了已声明的 Permanence |
| 变量命令覆盖 |
检查 VariableCommand 是否会被 Var 表达式覆盖 |
| 变量名冲突 |
检查变量名是否与内置函数名冲突 |
| 数组约束 |
检查数组类型 VariableCommand 的约束条件 |
| 变量引用前缀 |
检查表达式中变量引用的前缀(#、@、$)是否正确 |
| 字符串阈值 |
检查字符串类型变量是否设置了无效的 threshold |
| 颜色属性格式 |
检查颜色属性格式是否合法 |
| GraphicsCommand 检查 |
检查 GraphicsCommand 的属性和参数 |
| Trigger 位置 |
检查 Trigger 是否在允许的父标签内 |
| 枚举属性值 |
检查 xfermode、align、cap 等枚举属性值是否合法 |
| 变量类型有效性 |
检查 Var 标签的 type 属性值是否有效 |
| 未定义变量引用 |
检查表达式中是否引用了未定义的变量 |
| 表达式循环引用 |
检测变量表达式循环引用 |
| Binder 循环调用 |
检测 Binder 循环调用(refresh 链、dependency 订阅链、自循环刷新) |
| Format 占位符 |
检查 format 属性的占位符与 paras 参数匹配 |
| JSON 函数参数 |
检查 JSON 操作函数的参数类型 |
| 必需属性 |
检查标签是否缺少必需属性 |
| Object 引用前缀 |
检查 object 类型变量的引用前缀 |
| EaseType 值 |
检查动画 easeType 属性值是否合法 |
| 关键帧时间顺序 |
检查动画关键帧的时间顺序是否正确 |
| Var_config 约束 |
检查 var_config.xml 中的约束 |
| 标签间无效文本 |
检查标签之间是否有无效文本 |
| LoopCommand 终止 |
检测 LoopCommand 无终止条件或循环次数过多 |
| 数值范围 |
检测数值属性超出范围(rate、alpha、cornerRadius 等) |
| 渐变必填属性 |
检测渐变标签缺少必填属性 |
| 高频刷新检测 |
检测高频变量触发 Binder 频繁刷新(#time, #time_sys 等) |
| Folme 冲突检测 |
检测 Folme 模式下旧动画冲突(AlphaAnimation 等子标签、scale 属性) |
| FolmeCommand 检查 |
检查 FolmeCommand 的 target、command、states 属性 |
| FolmeState 属性 |
检查 FolmeState/AnimState 的属性名是否有效 |
| Folme 颜色格式 |
检查 FolmeState/AnimState 颜色属性是否为 0xAARRGGBB |
| 三元运算符检查 |
检查三元运算符使用是否正确 |
| 比较运算符检查 |
检查无效的比较运算符(如 =、!= 等) |
| XML 实体检查 |
检查表达式中是否误用 XML 实体(< > 等) |
| MethodCommand 参数 |
检查 MethodCommand 的 params 和 paramTypes 长度匹配 |
| 渐变颜色数量 |
检查渐变的 colors 和 positions 数量匹配 |
| ifelse 参数 |
检查 ifelse 函数的参数数量为 2n+1 |
| 动画名称重复 |
检查动画标签的 name 是否重复 |
| 未使用变量 |
检测未使用的变量 |
| 未使用帧率控制器 |
检测未使用的 FramerateController |
| 无需帧率 |
检测无动态元素时设置帧率 |
| 复杂表达式重复 |
检测重复的复杂表达式,建议预存变量 |
| 大数组检测 |
检测数组 size > 1000 |
| 表达式嵌套深度 |
检测表达式嵌套深度 > 5 层 |
| LoopCommand 复杂表达式 |
检测循环内的复杂表达式或高频变量 |
配置
在 VSCode 设置中搜索 maml-tools 可以配置以下选项:
模块开关
| 配置项 |
说明 |
默认值 |
insertSequence |
启用序列插入功能 |
true |
colorHighlight |
启用颜色高亮功能 |
true |
xmlAttributeSorter |
启用XML属性排序功能 |
true |
completionAndHint |
启用提示和补全功能(包含补全、缓动函数、混合模式等8个子功能) |
true |
definitionProvider |
启用定义跳转功能(Peek Definition) |
true |
expressionColoring |
启用表达式语法着色 |
true |
bracketRangeHighlight |
启用括号范围高亮 |
true |
lspDiagnostics |
启用LSP语言诊断(独立进程,不阻塞UI) |
true |
所有模块可在 VSCode 设置中独立启用/禁用:
{
"maml-tools.modules.insertSequence": true,
"maml-tools.modules.colorHighlight": true,
"maml-tools.modules.expressionColoring": true
}
序列插入配置
| 配置项 |
说明 |
示例 |
historyLimit |
历史记录最大数量,0表示无限制 |
100 |
editHistory |
历史记录中的项目是否可以编辑 |
false |
start |
默认起始值 |
1 |
step |
默认增量值 |
1 |
cast |
默认转换函数:S=字符串, I=整数, F=浮点数, B=布尔值 |
s |
dateFormat |
日期格式(支持 yyyy-MM-dd, MM/dd/yyyy 等) |
yyyy-MM-dd |
示例:
{
"maml-tools.insertSeq.historyLimit": 100,
"maml-tools.insertSeq.editHistory": false,
"maml-tools.insertSeq.start": "1",
"maml-tools.insertSeq.step": "1",
"maml-tools.insertSeq.cast": "s",
"maml-tools.insertSeq.dateFormat": "yyyy-MM-dd"
}
图片预览配置
sourceFolder / sourceFolders — 额外搜索文件夹
在查找图片时,除了从项目根目录,还会在这些文件夹中查找。支持相对路径(相对项目根)和绝对路径(系统路径)。
查找流程 — 当代码写 src="logo.png" 时,会依次查找:
项目根/logo.png
项目根/images/logo.png(sourceFolder 中的相对路径)
项目根/assets/logo.png(sourceFolders 中的相对路径)
/usr/local/images/logo.png(sourceFolders 中的绝对路径)
{
"maml-tools.imagePreview.sourceFolder": "images",
"maml-tools.imagePreview.sourceFolders": ["images", "assets", "/usr/local/images"]
}
说明:
- 相对路径基于项目根目录
- 绝对路径使用系统路径(跨越项目外的文件夹)
- sourceFolder 和 sourceFolders 的查找顺序是依次尝试
showUnderline — 显示下划线
控制识别到的图片 URL 是否显示下划线装饰。默认为 true。
{
"maml-tools.imagePreview.showUnderline": true
}
快捷键
| 快捷键 |
功能 |
平台 |
F2 |
重命名变量 |
通用 |
F12 |
跳转到定义 |
通用 |
Shift+F12 |
查找所有引用 |
通用 |
Ctrl+Shift+. |
插入序列 |
Windows/Linux |
Cmd+Shift+. |
插入序列 |
macOS |
Ctrl+Shift+, |
显示历史记录 |
Windows/Linux |
Cmd+Shift+, |
显示历史记录 |
macOS |
Ctrl+Shift+C |
复制颜色 |
Windows/Linux |
Cmd+Shift+C |
复制颜色 |
macOS |
Ctrl+Shift+A |
修改透明度 |
Windows/Linux |
Cmd+Shift+A |
修改透明度 |
macOS |
Ctrl+Shift+X |
打开混合模式选择器 |
Windows/Linux |
Cmd+Shift+X |
打开混合模式选择器 |
macOS |
反馈
以下问题请联系 QQ: 1452281131