sublime text 本身不提供 yaml 缩进静态检查,必须靠外部 linter 工具 + 插件桥接实现;只装语法高亮或格式化插件完全无效——它们既不报错,也不阻止 indentation error 导致的解析失败。

Sublime Text 本身不提供 YAML 缩进静态检查,必须靠外部 linter 工具 + 插件桥接实现;只装语法高亮插件或格式化工具(如 Pretty YAML)完全没用——它们既不报错,也不阻止 indentation error 导致的解析失败。
为什么缩进错误在 Sublime 里“看不出来”
YAML 的语义完全依赖缩进层级,但 Sublime 默认语法解析器遇到缩进错位(比如 spec: 下该缩进 2 空格却写了 3 或混用了 Tab)时,会直接放弃后续所有高亮,整段变灰白。这不是显示异常,是解析器主动退出——它不校验,只尝试匹配结构。
- 现象:打开
deployment.yaml后从某行开始全白,右下角仍显示 “YAML”,但metadata:和spec:颜色一样、括号不匹配、无法折叠 - 根本原因:Sublime 的
YAML.sublime-syntax没有内置缩进合法性断言,只做 token 匹配 - 后果:
kubectl apply -f报could not find expected ':'或did not find expected key,但 Sublime 里毫无提示
用 SublimeLinter + yamllint 实现真·缩进检查
真正起作用的是 yamllint 命令行工具,Sublime 只负责调用它并把错误标记在行尾。必须两步都走对:
- 先在系统安装
yamllint:pip install yamllint(确认yamllint --version能输出) - 用 Package Control 安装
SublimeLinter和SublimeLinter-contrib-yamllint(注意不是SublimeLinter-yamllint,后者已停更) - 确保
yamllint在 PATH 中;若不在(如用 pyenv),需在 SublimeLinter 设置里手动填路径:"paths": {"linux": ["/path/to/bin"], "osx": ["/opt/homebrew/bin"]} - 打开
Preferences → Package Settings → SublimeLinter → Settings,确认"lint_mode": "background"已启用
生效后,缩进错一位就会立刻标红:比如 containers: 下漏空格,光标悬停显示 [error] wrong indentation: expected 4 but found 2。
缩进规则必须显式配置才生效
yamllint 默认只检查基础语法,YAML 缩进策略(如是否允许 Tab、缩进宽度)要靠配置文件驱动。Sublime 不读项目根目录的 .yamllint 自动,得手动指定:
- 在项目根目录放
.yamllint,内容示例:rules: indentation: spaces: 2 indent-sequences: true line-length: disable - 在 SublimeLinter 设置中加:
"configs": {"yamllint": ".yamllint"},否则它只用默认规则 - 关键点:
indent-sequences: true才能捕获- name: nginx这种列表项缩进错误;不设这个,yamllint会放过大部分缩进问题
别信“自动修复缩进”的插件
像 Pretty YAML 或 YAML Formatter 会重排缩进,但它们按“视觉对齐”而非“语义层级”操作。常见翻车:
- 把
environment:下的- name: DB_HOST错误缩进成同级,变成无效字段 - 对含 Jinja2 的 Ansible
{{ item }}行盲目补空格,导致模板渲染失败 - 不识别 Kubernetes 的
ports:是列表还是对象,强行统一缩进宽度
缩进检查必须和校验绑定:先由 yamllint 标出问题,再人工判断该缩进几格、是否该用破折号、是否在 block sequence 内——机器改不如人眼审。











