ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

VSCode书写风格与自动保存格式配置指南:从格式化工具到settings.json

VSCode书写风格与自动保存格式配置指南:从格式化工具到settings.json VSCode 是当下使用频率最高的编辑器之一新装完的朋友一般会先去找汉化包汉化完了紧接着就会遇到两个绕不开的问题一个是“为什么别人的代码整整齐齐我的代码一保存就乱成一团”另一个是“为什么我保存文件之后格式没变、或者文件被悄悄改了一堆东西”。这两类问题的根子基本都落在标题里说的这两件事上书写风格和自动保存格式。我把这两个方向拆开了揉碎了讲一讲顺带把热词里反复出现的“格式化工具选哪个”“保存时不生效”“配置文件放哪”一并解决。这篇文章不聊大道理只讲我实际配置过的方案、踩过的坑还有一份可以直接抄作业的settings.json。1. 为什么“书写风格”和“自动保存格式”值得单独配置很多新手觉得这两件事是“锦上添花”等写多了才发现这其实是“刚需”。书写风格解决的是“代码长什么样”自动保存格式解决的是“文件以什么形态落盘”两者叠加在一起直接决定了你每天写代码的体验也决定了团队协作时 git 提交记录干不干净。1.1 书写风格不是洁癖是团队协作的底线先讲一个我亲眼看过的场景。两个同事用同一个项目一个人习惯缩进用 4 个空格另一个人习惯 Tab两人提交完代码一合并diff 里全是空白字符的改动真正的业务逻辑改动反而淹没在里面。代码评审的时候reviewer 看半天看不出改了什么气得在群里发了一大段话。这种事情不是段子是每天都在发生的现实。所以“书写风格”并不只是美观问题。缩进用空格还是 Tab、字符串用单引号还是双引号、行尾有没有分号、对象最后一项要不要逗号、换行是 LF 还是 CRLF这些细节在没有统一约定的时候每个文件都可能是一个独立风格协作起来就是灾难。VSCode 默认的配置固然能用但它不会替你做“全局统一”这件事它只是给了你每一台机器上各自为政的默认值。我个人的习惯是凡是能自动化的绝不手动去调。让格式化工具在保存的那一瞬间把整个文件收拾干净人只负责写语义机器负责统一范式。这才是在 VSCode 里配置书写风格的核心逻辑。1.2 自动保存格式的错误往往是“保存”那一刻造成的“自动保存格式”这个说法有点绕其实包含两层。第一层是“什么时候保存”也就是files.autoSave的时机第二层是“保存成什么样”也就是编码、行尾符、末尾换行、缩进这些实际落盘时的文件格式。第二层经常被忽略但它才是“自动保存格式”里最容易埋坑的部分。举个例子Windows 上新建的文件默认行尾是 CRLF提交到 git 之后再被 Linux 上的同事打开他那里默认变成 LF于是整个文件的每一行都被判定为“被修改了”git diff 刷出来一片红。你根本没动过那个文件但它就是出现在提交记录里。再比如文件编码你保存成 GBK同事用 UTF-8 一打开中文全变乱码。这类问题的发生时机全都在“保存”这一刻所以只要配置对了自动保存的格式很多莫名其妙的问题从源头上就被掐断了。1.3 VSCode 默认值远没有你想的那么省心VSCode 开箱即用确实方便但它在“书写风格”和“文件格式”这两件事上给的默认值基本都是“跟随系统”的佛系方案。files.eol默认是auto意思是你在 Windows 上保存就是 CRLF在 macOS/Linux 上就是 LFfiles.encoding默认是utf8但打开旧文件时不会自动猜测编码editor.tabSize默认是 4而现代前端工程普遍用 2。这些默认值单独拿出来都不算错组合在一起就会给人一种“编辑器不听话”的挫败感。所以接下来的内容核心就两件事把“书写风格”用格式化器和配置文件固定下来把“自动保存格式”用明确的编码、行尾、时机设定锁死。2. 书写风格配置格式化引擎、保存时动作与全局风格文件2.1 格式化工具的选型逻辑VSCode 本身不做格式化的重活它负责把“谁来格式化”这件事交给不同的扩展。配置书写风格的第一步是选对扩展而且不同语言、不同技术栈选择逻辑还不一样。我整理了实际工程里最常见的搭配场景推荐工具说明JavaScript / TypeScript / CSS / JSON / MarkdownPrettier最强壮的通用格式化器支持语言多风格统一JavaScript 逻辑纠错ESLint和 Prettier 配合一个管格式一个管代码质量Pythonautopep8 或 Blackautopep8 保守Black 激进而彻底C / Cclang-format高度可配置支持 Google / LLVM / Chromium 等风格Java通过扩展调用 google-java-format团队规范优先HTML / VuePrettier VolarVue 项目里格式化由 prettier 接管LaTeXLaTeX-Workshop latexindent配合latex-workshop.formatting.latex使用这里面最容易犯的错是“装了一堆格式化器但没指定默认”。比如你装了 Prettier又装了 autopep8打开 Python 文件按ShiftAltF时编辑器不知道听谁的就会提示你选择默认格式化器或者干脆不动作。所以配置里的editor.defaultFormatter必须落到具体语言甚至落到具体文件类型。2.2 关键配置项逐条拆解先看这三个核心配置{ editor.formatOnSave: true, editor.defaultFormatter: esbenp.prettier-vscode, editor.codeActionsOnSave: { source.fixAll.eslint: explicit } }editor.formatOnSave的作用是保存时自动执行默认格式化器。这个配置在团队里基本应该统一为true因为它省心不给你“忘了按格式化快捷键”的机会。需要说明的是它只对 VSCode 支持格式化的语言生效你能在“扩展”列表里看到的格式化器都会参与进来。editor.defaultFormatter指定默认格式化器。这里容易踩的坑是它默认是null如果你机器上同时装了 Prettier 和别的格式化工具VSCode 会弹窗让你选。弹窗选过一次之后会在当前语言范围内记住选择但换一台电脑、换一个项目可能又变成另一个结果。所以团队项目里最好把这个配置写进工作区设置不要依赖每个人机器上的弹窗选择。editor.codeActionsOnSave稍微进阶一点。它不只是格式化而是“保存时顺手执行修复动作”。典型场景是 ESLint 的--fix保存的时候把可以自动修的问题修掉比如多余的 import、未使用的变量、单引号双引号的统一。这里要注意新版 VSCode 里 true 被标记为废弃建议写成explicit或always。还有两个和学习曲线相关的配置建议一起加上{ editor.formatOnPaste: true, editor.formatOnType: true }formatOnPaste是粘贴代码时自动格式化这个在从别处复制代码时特别有用不会把一堆混乱的缩进带进当前文件。formatOnType是输入完一个字符后立即格式化比如打完一行末尾的分号整行就自动规整。不过它对某些大型文件会带来轻微的输入卡顿性能敏感的项目可以考虑关掉 type留下 paste。2.3 EditorConfig 与语言特有的风格管束很多人不知道 VSCode 原生支持 EditorConfig。项目根目录放一个.editorconfig基本可以统一所有编辑器的行为不只是 VSCode包括 WebStorm、Sublime 都能读到。root true [*] charset utf-8 end_of_line lf insert_final_newline true trim_trailing_whitespace true [*.{js,ts,json,css}] indent_style space indent_size 2 [*.py] indent_style space indent_size 4这个文件的价值在于“跨编辑器、跨平台统一基线”。VSCode 默认就内置了 EditorConfig 支持不需要装扩展。我个人习惯把.editorconfig当作最低要求把 Prettier 等工具当作强约束两者叠在一起风格就锁死了。语言层面的风格约束比如 Python 的max-line-length、C 的IndentWidth这些不需要写进 VSCode 设置里而是写在语言工具自己的配置文件里。比如 Python 项目里有pyproject.toml或.pylintrcC 项目里有.clang-formatVSCode 的格式化器会自动读取这也是“让专业工具管专业事”的思路。3. 自动保存格式保存时机、编码与行尾符3.1 autoSave 选项逐个说清VSCode 的自动保存不是只有“开”和“关”它有四种模式藏在files.autoSave这个配置里配置值行为适用场景off只有手动保存CtrlS才会写盘适合对保存时机有强控制欲的场景onFocusChange编辑器失焦时自动保存最稳妥的折中方案切窗口就保存onWindowChange切换到 VSCode 窗口外时保存适合频繁在编辑器和浏览器间切换afterDelay停止输入一段时间后自动保存配合files.autoSaveDelay使用我把这个表放在前面是想说明一个点没有绝对正确的模式只有适合你工作流的模式。如果你是写前端经常要切到浏览器看效果onWindowChange就很好切过去的时候已经保存了如果你是想彻底无感afterDelay配 1000 毫秒很舒服但要注意它会在你打字的过程中不断后台写盘对极大型文件略有压力。我个人更推荐onFocusChange。原因很简单它既不会在输入中途打扰你又不会让你忘记保存。写代码时习惯性切到别的窗口看资料一回来文件已经保存了情绪非常稳定。3.2 编码、行尾符、末尾空行保存成什么样自动保存的“格式”问题主要在以下这些配置里{ files.encoding: utf8, files.autoGuessEncoding: true, files.eol: \n, files.trimTrailingWhitespace: true, files.insertFinalNewline: true, files.trimFinalNewlines: true }files.encoding建议锁死为utf8。现在的项目基本全面 UTF-8其他编码大多是历史遗留锁死可以避免“在 Windows 上保存出 GBK”这种问题。files.autoGuessEncoding建议开启文件是 GBK 的话打开时能自动识别显示不会直接乱码但保存时仍然按 UTF-8 落盘。files.eol是行尾符。统一设置\n即 LF 是最省事的方案尤其是在前端、Python、Shell 领域。Windows 上默认的 CRLF 会引发大量本不该出现的 git diff也会让脚本文件在某些环境下出问题。这个配置配合.editorconfig里的end_of_line lf效果最好。trimTrailingWhitespace去除行尾空格insertFinalNewline保证文件末尾有一个换行trimFinalNewlines去掉文件结尾多余的空行。这三兄弟是“为 git 减负”的黄金组合。很多工具链比如编译器、linter默认要求文件末尾有换行你手动维护容易忘全交给保存动作最省心。3.3 自动保存与外部工具连动时的注意事项自动保存不是什么时候都该开。如果你正在用 Live Server、nodemon、tsc --watch 这类监听文件变化的工具保存太频繁会导致它们反复触发编译或刷新。我自己遇到过把afterDelay设成 200ms配合 Vue 项目热更新CPU 直接飙到 90% 的情况。解决思路有两个一是把自动保存模式调回onFocusChange减少写盘次数二是明确配置files.autoSaveWhenNoExternalServer。这个配置名字听起来拗口实际含义是当没有外部服务监听文件变化时才允许自动保存。开了它之后VSCode 检测到有外部监听器比如 Live Server的时候就会退回到手动保存避免反复触发外部刷新的问题。补一个细节files.autoSaveDelay的单位是毫秒只在afterDelay模式下生效。如果你把files.autoSave改成了onFocusChange写这个 delay 是无效的别调了半天没反应。4. 一份可以直接抄作业的 settings.json前面讲了一堆散配置这节给出一份我目前在用的完整settings.json区分“用户全局”和“项目工作区”两种场景。4.1 基础配置与工作区覆盖用户级设置里我会把通用偏好放进去不跟具体技术栈绑死{ editor.fontSize: 14, editor.fontFamily: Cascadia Code, Consolas, Courier New, monospace, editor.tabSize: 2, editor.insertSpaces: true, editor.renderWhitespace: all, editor.rulers: [80, 120], editor.wordWrap: off, editor.formatOnSave: true, editor.formatOnPaste: true, editor.formatOnType: false, editor.suggestSelection: first, files.autoSave: onFocusChange, files.encoding: utf8, files.autoGuessEncoding: true, files.eol: \n, files.trimTrailingWhitespace: true, files.insertFinalNewline: true, files.trimFinalNewlines: true, diffEditor.ignoreTrimWhitespace: false }这里说几个我认为值得盯一下的配置。renderWhitespace设为all空格和 Tab 都能直接看见配合tabSize使用能第一时间发现缩进混用的问题。rulers画出参考线超过 80 或 120 列的代码一眼可辨这对 Python、Java 这类有行长度约定的语言尤其有用。diffEditor.ignoreTrimWhitespace设为false否则你 diff 的时候空格差异被隐藏git 里的大量空白变更根本看不出来。项目级设置和用户级设置的区别在于项目级设置会写进仓库的.vscode/settings.json跟着代码走。团队项目推荐把格式化、风格相关的配置放这里因为它是“强制约定”不需要每个人都手动改一遍本地配置。{ editor.defaultFormatter: esbenp.prettier-vscode, editor.codeActionsOnSave: { source.fixAll.eslint: explicit } }4.2 不同技术栈的配置补充前端项目JavaScript / TypeScript / Vue / React建议在此基础上加装 Prettier 和 ESLint。Prettier 的配置项最好放在项目根目录的.prettierrc里比如大括号空格、单双引号、分号是否强制这些规则不该散落在每个人的编辑器里而应该锁死在项目里。Python 项目建议增加{ [python]: { editor.defaultFormatter: ms-python.black-formatter, editor.formatOnSave: true, editor.codeActionsOnSave: { source.organizeImports: explicit } } }黑格式化Black的强大在于它“没有商量余地”不管什么风格进来输出都一样。这一点对团队协作很友好不用开会讨论“你那个括号换行风格我不喜欢”反正保存完都一样。source.organizeImports顺手排序 import避免每次手动整理。C/C 项目建议配合 clang-format在工作区设置里显式指定{ [c]: { editor.defaultFormatter: xaver.clang-format }, [cpp]: { editor.defaultFormatter: xaver.clang-format }, clang-format.style: file }clang-format.style设为file以后会读取项目根目录的.clang-format文件找不到再回退到默认风格。这个配置特别适合接手老项目——按照老项目自己的风格格式化而不是把全项目的代码都改造成新风格。4.3 配置文件优先级与快捷键习惯VSCode 的配置优先级从高到低是工作区设置项目/.vscode/settings.json 远程设置 用户设置 默认设置。这个优先级顺序经常被忽略遇到“配置了为什么不生效”的问题先查工作区设置是不是被谁覆盖了。快捷键方面常用的是这几组功能快捷键格式化文档Shift Alt F格式化选中区域Ctrl K, Ctrl F打开命令面板Ctrl Shift P打开用户设置 JSONCtrl Shift P 后输入 settings json撤销上次格式化Ctrl Z这里要重点说一句CtrlZ在格式化之后按一下会把整个文件的格式改动全部撤销如果你只是想取消“某一行”的格式变化它做不到。所以最好的方式是相信格式化器而不是回退它。5. 常见问题与排查实录配置这堆东西的时候一定会遇到一些奇奇怪怪的现象。我把实际碰过的、高频出现的问题整理成一张速查表每个问题后面补一句排查思路。现象最可能的原因解决办法按 ShiftAltF 没反应当前语言没有可用的格式化器安装对应扩展后重启确认defaultFormatter已指定保存后格式有变化但不对多个格式化器抢占同一个文件类型在[语言]字段里指定唯一的editor.defaultFormatterESLint 的修复动作没执行codeActionsOnSave 漏配或版本字段写法不对检查是否写了source.fixAll.eslint: explicit旧版本改成true自动保存不生效autoSave 模式写错或被工作区设置覆盖打开设置 JSON确认全局与工作区没有冲突中文打开是乱码文件本身非 UTF-8autoGuessEncoding 未开开files.autoGuessEncoding或者手动选择编码重新打开git diff 显示整文件被改行尾符 CRLF / LF 不一致统一files.eol为 LF仓库里加.gitattributes声明文本文件行尾保存文件后末尾多了一堆空行多个配置互相叠加 trim 逻辑冲突确认insertFinalNewline与trimFinalNewlines都开启一般不会冲突若冲突检查插件是否单独设置了末尾空白自动保存导致外部工具疯狂刷新外部监听器被反复触发开启files.autoSaveWhenNoExternalServer或改用onFocusChange5.1 格式化不生效先查“语言模式”格式化不生效的根本排查思路是“先确认文件在什么语言模式下”。VSCode 每个文件的语言模式是独立的比如.vue文件被识别成纯 HTML 时Prettier 和 Volar 的处理方式完全不一样。我在.vue文件里格式化不了的时候第一件事就是看右下角语言模式是不是Vue不是的话就通过命令面板切换。还有一种情况是扩展装了一大堆比如同时装了 Prettier 和 Beautify默认格式化器一直没设置。这时候建议把不用的格式化器禁用掉只在默认里留下一个从根上规避冲突。5.2 自动保存把文件“改脏”了有些时候你打开一个老项目没改任何代码只是随便逛了逛切走了切回来git 里就显示一堆文件被修改。这种“不碰也脏”的现象绝大多数是files.trimTrailingWhitespace和files.insertFinalNewline在处理“历史遗留文件”时干的。老文件里行尾是 CRLF提交历史里全是空格差异你一保存全被洗成 LF 去空格diff 自然就刷屏了。对策分两种。如果项目还在开发初期直接统一格式一次性提交一次“格式化大礼包”以后所有人都在统一格式上写代码如果是历史浪迹很深的项目担心格式化带来大量 diff 影响线上排查那就把files.trimTrailingWhitespace临时关掉只保留files.autoSave的时机功能等团队决定做整体规格化的时候再开。5.3 换行符和编码git 层面的坑很多人不知道在项目里加一个.gitattributes能治本。文件内容如下* textauto * text eollf这个文件比files.eol还底层因为 git 在提交代码时会根据这个文件统一换行符。按我的经验这是解决跨平台代码仓库各种乱七八糟 diff 的最后手段。配合 VSCode 的files.eol一起用团队里不管谁用什么系统提交git 里都是干净的 LF。编码问题则多出现在 Windows 老项目里。VSCode 提供“通过编码重新打开”和“通过编码保存”两个命令遇到 GBK 文件先“通过编码重新打开”选择 GBK再把文件内容复制到 UTF-8 项目里。尽量不要在 VSCode 里直接“通过编码保存”强制转格式容易把注释里正常的中文转换成乱码。5.4 细节体验不让自动保存打扰你最后补几个日常体验相关的小配置。files.watcherExclude可以把node_modules、.git、dist这类目录排除在文件监听之外减少 CPU 占用。search.exclude同理。这两项虽然在自动保存格式之外但搭配afterDelay自动保存时能明显降低大型项目的卡顿感。{ files.watcherExclude: { **/.git/objects/**: true, **/node_modules/**: true, **/dist/**: true }, search.exclude: { **/node_modules: true, **/dist: true } }我自己在实际使用中体会最深的一点是配置这件事不要贪多每一行配置都应该有“防止我遇到问题”的理由。真正把“保存即统一”这个习惯养成了以后你会发现开关和配置不再是一个需要天天琢磨的东西——新开一个项目复制一份配置组织好.editorconfig和格式化工具剩下的时间都花在写代码上而不是操心格式这份省心才是这类配置最值得花时间的原因。
返回列表