fileheader 是最稳选择,维护勤、支持50+语言、配置精细且兼容多工作区;需手动设 author 和 supportfiletypes(用 language id),保存时间更新依赖正则匹配与格式化设置协调,团队统一用 .vscode/fileheader.config.json。

新建文件时自动插入版权头用什么插件最稳
VSCode 自身不提供“新建文件即插头”的原生能力,必须依赖插件;fileheader 是目前维护最勤、配置最细、兼容性最好的选择。它支持 TypeScript/Python/Go/Shell 等 50+ 语言,且能识别项目根目录下的 .vscode/settings.json 或 fileheader.config.json 配置,不会在多工作区里乱套模板。
别用 auto-insert-header 或 copyright-header:前者已两年未更新,对 VSCode 1.80+ 的 onDidCreateTextDocument 事件监听失效;后者只支持手动触发,无法绑定“新建文件”动作。
- 安装后重启 VSCode,否则
fileheader的快捷键和命令不会注册 - 它默认只对「通过命令面板新建」或「右键菜单新建」的文件生效,直接双击空白处新建的 untitled 文件不触发——这是 VSCode 底层限制,不是插件 bug
- 模板里写
Author: ${author},但${author}不会自动读取 Git 用户名;得手动在设置里填fileheader.config.author,否则留空
怎么让版权头只出现在特定类型文件(比如只 .ts 不 .md)
靠 fileheader.config.supportFiletypes 白名单控制,不是靠文件关联或语言模式。设成 ["typescript", "javascript", "python"],它就只在对应语言标识的文件里插头;设成 ["*"] 才全开——但不建议,比如 .gitignore 或 .env 插了头反而破坏格式。
注意:这个配置项认的是 VSCode 内部的语言 ID(language id),不是文件后缀。比如 .tsx 的 language id 是 typescriptreact,不是 tsx;查法很简单:打开一个文件 → 按 Ctrl+Shift+P → 输入 Change Language Mode → 看右下角显示的名称就是 ID。
- 常见 ID 示例:
typescript(.ts)、typescriptreact(.tsx)、python(.py)、markdown(.md) - 如果某文件明明是 .py 却没插头,先按
Ctrl+Shift+P运行Change Language Mode,确认当前语言 ID 真是python,而不是plaintext - 不支持通配符匹配,
"*.test"这种写法无效
保存时自动更新 Last Modified 时间戳为什么经常失灵
fileheader 的时间更新依赖正则匹配已有头里的 Last Modified 字段,不是靠文件系统 mtime。如果模板里写的是 LastModified:(冒号后没空格),而你配置的正则是默认的 /Last Modified.*$/i,那就永远匹配不上——字段名和正则对不上。
更隐蔽的问题是:VSCode 在保存时可能先触发格式化(如 Prettier),再触发 fileheader 更新时间,导致刚写好的时间又被格式化删掉换行或缩进,最终看起来“没更新”。
- 检查
fileheader.config.beforeAnnotation和afterAnnotation是否和实际模板结构一致(比如是否多写了空行或注释符号) - 把
editor.formatOnSave关掉,或改用editor.formatOnSaveMode设为modifications,避免全文件重排影响头部 - 时间变量用
${date}而不是${datetime}:前者输出2024-06-12,后者带时分秒,在纯日期场景下容易因秒级变化被误判为“已修改”而反复重写
团队协作时怎么统一版权头格式不打架
靠项目级配置文件 .vscode/fileheader.config.json,而不是用户全局设置。这样每个成员打开项目时自动加载同一套规则,避免 A 写 Copyright (c) 2024、B 写 © 2024 导致 Git diff 满屏。
关键点在于:这个文件必须放在工作区根目录(即打开的文件夹第一层),且文件名必须是 fileheader.config.json(不能叫 header.json 或加前缀)。VSCode 启动时会从这里优先加载,覆盖用户设置里的同名字段。
- 示例最小配置:
{ "author": "Frontend Team", "license": "MIT", "supportFiletypes": ["typescript", "typescriptreact"], "template": "/**\n * @author ${author}\n * @license ${license}\n * @lastmodified ${date}\n */" } - 如果团队用 monorepo,每个 package 都要单独放一份配置,
fileheader不会向上递归查找 - 配置里别写绝对路径或本地用户名,所有变量都走
${xxx}占位符,由插件运行时注入
最麻烦的其实是“已有文件补头”——fileheader 提供命令 File Header: Add File Header,但它不会跳过已有头部的文件。真要批量处理,得先用 Find in Files 搜 /^\s*\/\*\*?/,人工筛一遍再操作,不然容易叠两层头。











