如何优化Neovim中VimWiki自动代码片段以插入实时当前时间?
问题解决:Luasnip自动片段实现实时当前时间插入
你的问题出在静态文本节点t()的执行时机:当Lua脚本加载(也就是你打开第一个VimWiki缓冲区时),vim.fn.system([[date +"%H:%M" | tr -d '\n']])就已经执行并返回了固定时间,后续展开片段只会复用这个值,不会重新计算。
要实现实时获取当前时间,需要使用Luasnip的动态函数节点f(),它会在每次片段展开时执行指定函数,返回实时计算的内容。
优化后的代码如下(推荐用Vim内置函数替代外部命令,更轻量兼容):
local line_begin = require("luasnip.extras.expand_conditions").line_begin local f = require("luasnip").function_node return { s( {trig='__', desc="Insert current time", snippetType = "autosnippet"}, { t("_"), -- 动态生成实时时间 f(function() return vim.fn.strftime("%H:%M") end, {}), t({'_', ''}) }, {condition = line_begin} ), }
如果坚持使用系统date命令,也可以把调用逻辑放到f()的函数体内:
local line_begin = require("luasnip.extras.expand_conditions").line_begin local f = require("luasnip").function_node return { s( {trig='__', desc="Insert current time", snippetType = "autosnippet"}, { t("_"), f(function() return vim.fn.system([[date +"%H:%M" | tr -d '\n']]) end, {}), t({'_', ''}) }, {condition = line_begin} ), }
关键说明
f()节点的第一个参数是匿名函数,每次片段展开时都会执行该函数,返回的字符串会被插入到文档中- 第二个参数是依赖的节点列表(这里无依赖,传空表
{}即可) vim.fn.strftime是Vim内置函数,比调用外部date命令更高效,且跨平台兼容性更好
内容的提问来源于stack exchange,提问作者Kit Lessenger
相关产品推荐
相关产品推荐

