开files.trimTrailingWhitespace即可自动删除行尾空格(含空行内空格),但不删空行或换行符;需设为true并写入项目级.vscode/settings.json,避免被.editorconfig、语言配置或只读状态覆盖。

开 files.trimTrailingWhitespace 就行,别碰 Prettier 或 ESLint 的空格规则——那是绕远路,还容易冲突。
怎么配才真正生效
这个配置默认是 false,必须手动设为 true 才起作用。最稳妥的方式是写进项目根目录的 .vscode/settings.json,而不是用户级设置:
- 只改用户设置 → 别人 clone 代码后 Git diff 里全是空格变更
- 已存在
.vscode/settings.json→ 检查有没有某处显式写了"files.trimTrailingWhitespace": false(比如语言专属块"[markdown]") - 右下角状态栏显示的语言 ID 是
plaintext而不是javascript→ 语言专属配置压根没加载 - 文件被 Git LFS 锁定或权限为只读 → VSCode 不会对只读文件执行任何 trim
为什么保存了空格还在
不是配置没写对,而是被更高优先级的规则“截胡”了:
-
.editorconfig里写了trim_trailing_whitespace = false→ 它会覆盖 VSCode 设置 - 用了
editor.formatOnSave+ Prettier → 格式化器输出带空格,但 VSCode 的files.trimTrailingWhitespace是在格式化之后才执行的;如果 Prettier 本身没删空格,VSCode 还会再扫一遍;但如果 Prettier 输出时插入了新空行,再 trim 可能破坏结构 - 某些语言(如
makefile、shellscript)在 VSCode 内置逻辑中默认禁用该行为 → 得单独加语言级配置:"[makefile]": {"files.trimTrailingWhitespace": true} - 光标不在编辑器内(停在终端、搜索框或侧边栏)→
Ctrl+S实际没触发文件保存
files.trimTrailingWhitespace 到底删什么、不删什么
它名字很老实:只删“尾随空白字符”,即每行末尾的空格、\t、\r,包括空行里的空格 —— 但不会动换行符本身:
- 一行末尾有 5 个空格 → 保存后变成纯内容 + 换行符
- 一行只有 3 个空格 → 保存后变成空行(只剩一个
\n) - 一行本来就是纯
\n(干净空行)→ 完全不动,仍保留为空行 - 文件末尾连续 5 个
\n→ 全部保留,一个不少
想压缩末尾多个换行符?得额外开 files.trimFinalNewlines;想确保结尾一定有且仅有一个换行?再加 files.insertFinalNewline。这三个配置常一起用,但各自职责分明,混用前先看清谁管哪一段。


















