别再问了!这就是我写代码超顺滑的 VSCode 神仙配置!

Cover image for 别再问了!这就是我写代码超顺滑的 VSCode 神仙配置!
Doc Map
  1. 前言
  2. 主题与语言:暗黑氛围感与英语坚持
  3. 插件:我的“生产力秘籍”
  4. C 语言依然不可或缺
  5. 结语

前言

要说程序员的日常,除了写代码,可能就是在折腾工具了。有人爱折腾键盘,有人爱折腾显示器,而我,从大一到现在,折腾最多的就是各种稀奇古怪,有意思的小玩意儿,其中就包括本期“主角” — 编辑器。

我的第一个编辑器是 Visual Studio。没办法,我是从 C# 入门的,而 VS 在写 C# 上就是“无敌存在”,谁用谁知道。那时候我觉得,VS 就像一艘航空母舰,啥都有,想要什么功能都能在里面找到,编译、调试、UI 设计器一条龙服务,简直就是为新手准备的全家桶。写第一个 Windows 窗体程序的时候,我甚至有点小激动,感觉自己马上就能做出“杀手级应用”了。

可问题也随之而来。VS 太庞大了,写 C# 时它是神器,但当我尝试去写点别的东西,比如一个小的 C 文件,或者玩玩 Python 脚本,再或者试试前端的 HTML、CSS、JS,我就会觉得它笨重了。每次打开都像启动了一架飞机,光是等它加载就够喝一杯咖啡的。

于是,我开始寻找更轻量的工具。那时候试过一段时间 Sublime Text,它确实足够轻快,打开就能写,尤其适合写点小脚本或者简单的配置文件,体验非常清爽。但随着项目复杂度增加,我发现 Sublime 的扩展性稍微差了一点,调试和生态都不算特别友好。

直到遇见了 Visual Studio Code(VSCode)。那一刻,我才发现原来有这么一款编辑器,可以既轻便又强大:写 C 可以,写 Python 可以,写 Java 也可以,写前端更是如鱼得水。它不像 VS 那么庞大,但靠着插件生态,却能“化身百变”。有人问过我:“那你写 Python 为什么不用 PyCharm 呢?不是号称最强 Python IDE 吗?”说实话,我试过,但感觉和 VS 一样,太大了。我平时写 Python 更多是写点小脚本,偶尔跑个实验,不需要那么全能的“航空母舰”。轻量、强大、生态丰富,简直是天下第一的编辑器(没错,我就是这么吹爆它!)。

所以现在,我的编辑器组合基本定型:写 C# 这种“重型活”时乖乖用 VS,写 C、Python 和前端时,就交给 VSCode。这样一来,效率和体验都能兼顾,不会被工具本身拖慢节奏。

主题与语言:暗黑氛围感与英语坚持

先说界面。对我来说,编辑器的主题绝对不是小事,而我又是妥妥的颜控。亮色主题?那是“高亮闪瞎眼”的魔法攻击,一会儿就让人眼睛酸(尽管现在也有很多设计优雅的亮色主题)。我一直坚持用 Atom One Dark Theme,深色背景配上舒适的语法高亮,让我能在深夜里沉浸式敲代码,仿佛自己就是黑客片里的主角。

还有个小坚持:我从来不用中文语言包。不是因为不爱国(大家也不必给我‘扣帽子’),而是因为我觉得计算机这东西,英语才是母语。报错信息、API 文档、GitHub Issue,全是英文。如果我平时习惯了中文界面,遇到问题时反而要绕远路。刚开始确实痛苦,菜单都得硬啃,许多报错信息也看不懂,但久而久之,你会发现这其实是对自己的“逼迫式成长”。

插件:我的“生产力秘籍”

VSCode 真正的魅力,其实在于插件。它不像 Visual Studio 那样自带一大堆功能,而更像是一个“空壳”。你想要什么功能,就自己去装插件。慢慢折腾下来,你会发现,这个“壳”最后完全长成了你自己的模样,就像一台专属定制的机器。

比如我写博客要用 Astro,那自然少不了 Astro 插件;写 Vue 项目的时候,Vue 插件就是刚需。偶尔写 Markdown,我就靠 Markdown All in One 提高效率,再加上 Marp,直接把 Markdown 写成 PPT,用起来真的很爽,有种“一稿多吃”的感觉。

最让我离不开的,其实是 GitHub Copilot。它对我来说就像代码界的“外挂”。有时候我只是写了一句注释,它就能自动帮我把函数补完整;有时候我写到一半,它会“心有灵犀”地把后半段逻辑补上。虽然偶尔它也会一本正经地胡说八道,但大多数时候,它能让我省下不少时间,手速和脑力都轻松不少。

当然,写代码光能跑还不够,我还得写得“顺眼”。程序员最怕的是什么?是代码风格不统一!有人用 Tab,有人用 Space;有人末尾加分号,有人不加……这太让人崩溃了。这就轮到 Prettier 出场了。这个插件就是程序员的“洁癖神器” —— 保存时自动帮我把代码格式化。缩进、分号、空格,全都给我整整齐齐。这样大家的代码风格就统一了,再也不用因为“缩进到底是两个空格还是四个空格”吵架。

前端这边的工具也挺贴心的。写静态网页的时候,我会开 Live Server 即时预览,保存一下刷新页面立刻能看到效果。而如果我懒到不想切浏览器,Live Preview 就能直接在 VSCode 里展示,省得来回切来切去。

写论文的时候,LaTeX 是避不开的。以前我在 TeXworks 里写,界面笨重不说(这个界面很学术风),还经常崩溃。后来我发现 VSCode 也能用 LaTeX Workshop,整个人像发现新大陆。从那之后,我的论文写作体验直接飞升。写 LaTeX 的时候我用 Latex Workshop,一边写一边实时预览,完全不担心排版出问题。

还有一个小众但特别有趣的插件,叫 codesnap。它能把一段代码生成高颜值的截图,背景和配色都很精美。我写博客或者做实验报告的时候经常用它,展示的代码块不再是“灰扑扑的一坨”,而是一张排版漂亮的图片,看着顺眼,读者也舒服。

codesnap screenshoot

C 语言依然不可或缺

虽然现在我的主力还是 C# 和前端,但看过我之前文章的朋友应该知道,最近我在啃计算机组成原理等课程,C 语言依然是不可或缺的老朋友。

学习路上,我曾无数次在古老的 Dev-C++ 里和各种奇葩报错搏斗。记得有次为了一个缺失的分号,在实验室熬到凌晨两点,整个人都快崩溃了。现在回想起来,那时候刚接触编程,对编辑器配置没什么概念,很多模糊的报错信息确实让调试过程雪上加霜。

在 VSCode 写 C 就舒服多了。我主要用 C/C++ 插件配合 clangd。前者是微软官方出品,基础功能齐全;后者更快、更精准,尤其是在大项目里,代码提示非常顺滑。需要编译项目时,我用 CMake Tools;调试时,在 Linux 下会配合 CodeLLDB。这一整套下来,体验完全不输 CLion 这样的专业 IDE,但 VSCode 的轻量化优势又让我用得更顺手。

有时候我会感叹:要是大一开始就用 VSCode 写 C,估计能少掉不少“玄学报错”的痛苦,也不会被环境配置折腾得焦头烂额。

结语

写到这里,我想说,编辑器其实只是我们和代码之间的一扇窗。有人喜欢 Vim,把命令行玩得像艺术;有人喜欢 JetBrains 的全家桶,开箱即用,顺手到飞起;还有人像我一样,把 VSCode 配成自己最舒服的样子,既轻巧又强大。

看似不同,其实本质都是一样的 —— 都是我们的学习工具,都是我们在编程路上摸索、成长、折腾出来的习惯和秩序。它们不会替你写代码,但能让你写得更舒服、更顺手。只要你花点心思去配置、去熟悉,用心去适应,它们就会成为你最值得信赖的伙伴,在关键时刻带给你意想不到的效率和愉悦感。

更重要的是,这些工具和插件最终服务的不是它们自己,而是你。深夜对着屏幕敲代码时,看到自己思路清晰、逻辑流畅、界面干净整齐,那种踏实感和成就感,是任何插件和配置都替代不了的。

所以别纠结工具本身,也别羡慕别人用什么。找到适合自己的工具,好好配置,好好使用,你会发现,即便是再普通的编辑器,也能成为你的秘密武器,让每一次敲键都变成一次愉快的探索和成长。


附录:个人 setting.json 配置

{
    // ------------------------------ 主题与字体 ------------------------------
    "workbench.colorTheme": "Atom One Dark",
    "editor.fontFamily": "Consolas, Courier New, monospace, Maple Mono NF CN, 'Google Sans Code'",
    "editor.fontLigatures": "'calt', 'cv01', 'ss01', 'zero'",
    "editor.fontSize": 14,
    "editor.lineHeight": 1.5,
    "editor.fontWeight": "700",
    "terminal.integrated.fontFamily": "Google Sans Mono",
    "terminal.integrated.fontSize": 14,
    "terminal.integrated.fontWeight": "bold",

    // ------------------------------ 自动保存与格式化 ------------------------------
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 1000,
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.codeActionsOnSave": {
        "source.fixAll": "explicit"
    },
    
    // 语言特定格式化配置
    "[astro]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[html]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[css]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[javascript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[typescript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[json]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "[c]": {
        "editor.defaultFormatter": "ms-vscode.cpptools"
    },
    "[cpp]": {
        "editor.defaultFormatter": "ms-vscode.cpptools"
    },

    // ------------------------------ C/C++ 配置 ------------------------------
    "C_Cpp.default.cppStandard": "c++17",
    "C_Cpp.default.cStandard": "c17",
    "C_Cpp.default.intelliSenseMode": "gcc-x64",
    "C_Cpp.default.compilerPath": "/usr/bin/gcc",
    "C_Cpp.autocomplete": "default",

    // ------------------------------ Git 配置 ------------------------------
    "git.autofetch": true,
    "git.enableSmartCommit": true,
    "git.confirmSync": false,

    // ------------------------------ Live Server 配置 ------------------------------
    "liveServer.settings.donotShowInfoMsg": true,

    // ------------------------------ LaTeX Workshop 配置 ------------------------------
    "latex-workshop.latex.autoBuild.run": "never",
    "latex-workshop.showContextMenu": true,
    "latex-workshop.intellisense.package.enabled": true,
    "latex-workshop.message.error.show": false,
    "latex-workshop.message.warning.show": false,
    "latex-workshop.latex.tools": [
        {
            "name": "xelatex",
            "command": "xelatex",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "%DOC%"
            ]
        },
        {
            "name": "pdflatex",
            "command": "pdflatex",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "%DOC%"
            ]
        },
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-pdf",
                "-outdir=%OUTDIR%",
                "%DOC%"
            ]
        },
        {
            "name": "bibtex",
            "command": "bibtex",
            "args": ["%DOCFILE%"]
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "XeLaTeX",
            "tools": ["xelatex"]
        },
        {
            "name": "PDFLaTeX",
            "tools": ["pdflatex"]
        },
        {
            "name": "BibTeX",
            "tools": ["bibtex"]
        },
        {
            "name": "LaTeXmk",
            "tools": ["latexmk"]
        },
        {
            "name": "xelatex -> bibtex -> xelatex*2",
            "tools": ["xelatex", "bibtex", "xelatex", "xelatex"]
        },
        {
            "name": "pdflatex -> bibtex -> pdflatex*2",
            "tools": ["pdflatex", "bibtex", "pdflatex", "pdflatex"]
        }
    ],
    "latex-workshop.latex.clean.fileTypes": [
        "*.aux",
        "*.bbl",
        "*.blg",
        "*.idx",
        "*.ind",
        "*.lof",
        "*.lot",
        "*.out",
        "*.toc",
        "*.acn",
        "*.acr",
        "*.alg",
        "*.glg",
        "*.glo",
        "*.gls",
        "*.ist",
        "*.fls",
        "*.log",
        "*.fdb_latexmk",
        "*.snm",
        "*.nav"
    ],
    "latex-workshop.latex.autoClean.run": "onFailed",
    "latex-workshop.latex.recipe.default": "lastUsed",
    "latex-workshop.view.pdf.internal.synctex.keybinding": "double-click",

    // ------------------------------ 其他实用配置 ------------------------------
    "editor.minimap.enabled": true,
    "editor.tabSize": 2,
    "editor.insertSpaces": true,
    "files.trimTrailingWhitespace": true,
    "files.insertFinalNewline": true
}