唯一可靠方式是手写python插件遍历所有选区,用datetime.now()为每光标独立生成此刻时间;若需完全一致时间戳,则需在run()开头统一获取并复用。

多行文本中批量插入「此刻」的日期时间,不能靠 insert_snippet + ${year} 这类变量——它们只在 Sublime 启动时取一次快照,反复触发输出的永远是同一个时间。
用 insert_date 命令只能插到第一个光标位置
很多人配了 {"keys": ["ctrl+alt+t"], "command": "insert_date", "args": {"format": "%Y-%m-%d %H:%M:%S"}} 后发现:选中 5 行、按快捷键,只有第一行有时间。这不是 bug,是 insert_date 的设计限制——它不遍历 self.view.sel(),只处理首个选区。
- 它适合单光标场景,比如写注释头或临时标记
- 格式必须用英文半角引号和冒号,
"%Y-%m-%d"✅,“%Y-%m-%d”❌ - 不支持
%f(毫秒)、%z(时区),跨平台时慎用%c或%x
真正批量插入要写 Python 插件,且必须遍历 self.view.sel()
想让每行、每个光标都独立插入「此刻」的时间,唯一可靠方式是手写 sublime_plugin.TextCommand,并显式循环所有选区。否则哪怕只漏掉一行 for region in self.view.sel():,就只剩第一个光标生效。
- 文件路径必须是
Packages/User/insert_datetime.py(不是.sublime-snippet) - 类名必须以
Command结尾,继承sublime_plugin.TextCommand - 时间必须用
datetime.datetime.now(),别用time.time()——后者转字符串易丢精度,且不带本地时区上下文 - 若需毫秒,
strftime('%Y-%m-%dT%H:%M:%S.%f')[:23]是安全切法(%f是六位微秒,取前 23 位得三位毫秒)
多光标插入时,时间不是“同一时刻”,而是“各自触发时刻”
这是容易被忽略的关键点:当 5 个光标同时存在,插件执行 datetime.now() 5 次,每次调用间隔几毫秒,结果可能不同。例如:
2026-06-18T23:14:22.123<br>2026-06-18T23:14:22.125<br>2026-06-18T23:14:22.126<br>2026-06-18T23:14:22.128<br>2026-06-18T23:14:22.129
- 这对日志调试反而是优势——能看出操作粒度
- 若真需要“完全一致”的时间戳,得在
run()开头只调一次now = datetime.now(),再在循环里复用这个变量 - 缩进必须严格为 4 空格,错一格插件静默失效,且不会报错提示
最麻烦的从来不是写那十几行代码,而是分清哪些能力是 Sublime 原生命令天生不具备的——比如多光标、毫秒、时区、动态格式解析。试图用 insert_snippet 强撑,只会让时间停在编辑器启动那一刻。











