Sublime Text 最轻量批量模板生成应优先使用原生 snippet,适用于光标处插入预定义结构;需批量建文件则用 Python 插件;复杂逻辑应交由外部脚本配合 subl 命令打开。
用 snippet 实现最轻量的批量模板生成
Sublime Text 原生支持 snippet(代码片段),这是批量生成结构化代码最稳定、无需插件、不依赖外部工具的方式。它不是“一键生成 N 个文件”,而是“在光标处快速插入预定义结构”,适合函数头、组件骨架、循环体等高频重复模式。
常见错误是把 snippet 当作脚本运行:比如想用
自动创建 10 个同名文件——这做不到,得换方案。
snippets 存放在
目录下,后缀为
触发方式是输入
后按
键,不是 Ctrl+Shift+P
变量用
、
表示跳转位点,
支持默认值
作用域(
)必须写对,比如
或
,否则不生效
用 Python 插件实现真正意义上的“批量生成文件”
如果目标是“根据列表自动生成 20 个 Vue 组件文件”,就得靠 Sublime 的插件机制。核心是写一个继承
或
的 Python 脚本,调用
+
。
容易踩的坑:路径拼接用
,别用字符串拼接;写入内容前要先
设置语法高亮;保存文件必须显式调用
,且传入绝对路径。
插件入口文件放
,命名如
绑定快捷键时,
名是文件名去掉
,即
若需用户输入参数(如组件名前缀),用
,不是
批量操作建议加
反馈进度
别用 Build System 做模板生成,除非你真需要 shell 级控制
Build System(
)本质是调外部命令,比如
。它能“生成文件”,但和编辑器上下文脱节:无法获取当前光标位置、无法读取选中文本、不能自动打开新标签页。只适合极简场景,例如一键执行
。
典型误用:试图用
把 Jinja 模板渲染成代码——这时你已经该换 VS Code 或 JetBrains 了,Sublime 不是模板引擎运行时。
和
对模板生成毫无意义,别配
若真要用,
必须设为
,否则文件可能建在 Sublime 安装目录下
错误输出会进 Build Results 面板,但不会高亮到对应行号,调试困难
模板内容含动态逻辑?老实用外部脚本 + Sublime 打开
当模板需要条件判断(如“如果接口返回 JSON,则生成解码函数,否则跳过”)、读配置文件、或调 API 获取元数据时,snippet 和插件都很快变复杂。此时更可靠的做法是:用 Python/Node.js 写个独立生成脚本,输出文件到项目目录,再用 Sublime 的
命令行打开。
这个组合看似绕,实则清晰:逻辑归逻辑,编辑归编辑。Sublime 的
命令支持多文件参数,
会全部打开,比插件里一个个
更稳。
确保系统 PATH 包含 Sublime 的
命令(macOS/Linux 默认有,Windows 需手动加)
脚本输出路径建议用相对路径(相对于项目根),避免硬编码绝对路径
如果脚本生成大量小文件,注意 Sublime 的文件监听上限(默认 8192),可改
设置
真正难的不是“怎么生成”,而是“生成什么”和“何时重生成”。模板一旦带业务逻辑,就该考虑是否该进 CI 流程或用专门的代码生成器(如 Hygen、Plop),而不是塞进编辑器里。Sublime 的优势在于快、轻、确定性强——用它做确定性高的模板插入,其余交给更合适的工具。
snippetPackages/User/.sublime-snippettabTriggerTab$1$2${1:default}scopesource.pythontext.html.basicsublime_plugin.TextCommandsublime_plugin.WindowCommandwindow.run_command('new_file')view.run_command('insert', {'characters': ...})os.path.join()view.set_syntax_file('Packages/HTML/HTML.tmLanguage')view.run_command('save')Packages/User/bulk_create_components.pycommand.pybulk_create_componentswindow.show_input_panel()input()sublime.status_message('Created 5 files').sublime-buildecho "class $1:" > $2.pytouch api_v1.py api_v2.pyshell_cmdfile_regexvariantsworking_dir$file_pathsubl /path/to/file.pysublsubl src/components/*.vuenew_file()sublindex_files