在 vim 中验证 tab 插入的是空格还是制表符,需启用 :set list 并配置 :set listchars=tab:→\ ,space:·,按 tab 后若显示一个 → 则为制表符,若显示四个 · 则为四个空格。

怎么确认当前按 Tab 插入的是空格还是制表符
光看右下角显示 Tab Width: 4 或 Spaces: 4 不够,那只是视觉宽度或模式提示,不能反映真实插入字符。必须让空白字符“显形”才能验证。
在用户设置中加这一行:"draw_white_space": "all",保存后所有空格会显示为 ·,制表符显示为 →。新建一个文件,按一次 Tab,如果看到四个 ·,说明 translate_tabs_to_spaces 生效;如果只看到一个 →,说明开关没开、被覆盖,或 detect_indentation 在劫持。
- 临时验证不用改配置:按
Ctrl+`打开控制台,输入sublime.log_input(True),再按Tab,看输出里有没有key evt: tab—— 没输出说明按键根本没进 Sublime,可能是输入法或系统拦截 - 状态栏右下角点开缩进信息,如果显示
Detect Indentation,说明detect_indentation正在运行,你的设置大概率已被忽略
为什么刚配好设置,打开旧 Python 文件就失效
不是配置错了,是 detect_indentation 默认为 true,一打开文件就扫描前 200 行——只要某行开头有 \t,它立刻把当前视图切到 Tab 模式,并覆盖你设的 tab_size 和 translate_tabs_to_spaces。
Python 语言包自带的 Python.sublime-settings 还默认写了 "tab_size": 2 和 "translate_tabs_to_spaces": false,优先级高于用户设置。所以全局改了没用,必须走语法专属路径。
- 先打开一个
.py文件,确认右下角显示的是Python(不是Plain Text) - 菜单 →
Preferences → Settings – Syntax Specific,右侧只加两行:"tab_size": 4和"translate_tabs_to_spaces": true - 已打开的文件不会自动应用,需按
Ctrl+Shift+P→ 输入Reload Syntax回车 - 如果项目根目录有
.editorconfig且含indent_style = tab,EditorConfig 插件会直接接管,优先级更高,得删或改它
Convert Indentation to Spaces 为什么灰掉或转完错位
灰掉 ≠ 功能损坏,是 Sublime 主动保护:检测到混合缩进(部分行用 \t,部分用空格),拒绝自动转换以防错位。转完错位也不是命令出 bug,而是三个隐性条件不满足:当前 tab_size 值 ≠ 文件中原始 \t 的视觉宽度、文件混用缩进、状态栏没显示 Spaces: 4。
- 执行前务必点右下角缩进区域 → 选
Indent Using Spaces→ 再点Set Indent Width: 4,确保状态栏变成Spaces: 4 - 若仍灰掉,先开
"draw_white_space": "all",手动删掉前几行明显混搭的缩进(比如→·→开头的行),保存后再试 - 更稳妥做法:右下角切换语法为
Plain Text,再执行转换,避开语法插件干扰识别 - 转换完必须补一步:
Ctrl+Shift+P→ 输入Reindent Lines,否则缩进层级可能未对齐
Emmet 或其他插件让 Tab 键缩进失灵怎么办
Emmet 默认劫持 Tab 键用于 HTML/CSS 缩写展开,但它不该影响 Python、Markdown 等场景。如果在非 HTML 文件里按 Tab 没反应,大概率是 Emmet 的 context 规则没写对,或者绑定位置错了。
常见错误是把修复代码粘贴到 Preferences → Package Settings → Emmet → Key Bindings – User,这个路径根本不加载。必须改的是 Preferences → Key Bindings 右侧的 Key Bindings – User 文件。
- 正确做法是在
Key Bindings – User中插入带context的三段式 JSON:第一段只在source.html等范围内触发expand_abbreviation_by_tab;第二段处理补全;第三段对其他所有语法执行indent - 别硬删 Emmet 绑定,否则所有
Tab都失效;也别简单禁用 Emmet,保留其功能但隔离作用域才是关键 - 临时排查:菜单 →
Preferences → Package Control → Disable Package,逐个关掉Emmet、AutoFileName等插件,确认是否它们导致
detect_indentation 的静默覆盖行为——它不报错、不弹窗,只在右下角悄悄显示 Tab Width: 2,让你误以为配置生效了。关掉它,才是让所有缩进设置落地的前提。











