You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Lua编写Neovim自动命令更新Markdown文件日期?

用Lua实现Neovim中Markdown文件保存时自动更新Date行

完全可行,以下是两种实现方式,你可以根据习惯选择:

方式一:调用Vim替换命令(简单直观)

这种方式借助Vim内置的substitute命令实现,适合刚接触Neovim Lua配置的新手:

vim.api.nvim_create_autocmd('BufWritePre', {
  pattern = '*.md',
  callback = function()
    -- 生成YYYY/MM/DD格式的当前日期(注意是小写m,大写M代表分钟)
    local current_date = vim.fn.strftime('%Y/%m/%d')
    -- 全局替换以"Date: "开头的行
    vim.fn.execute('%s/^Date: .*/Date: ' .. current_date .. '/')
    -- 静默写入并避免触发重复 autocmd
    vim.cmd('silent! noautocmd write')
  end,
})

关键说明:

  • BufWritePre:指定在文件保存前触发事件,确保修改内容能被写入文件
  • pattern = '*.md':限制仅对Markdown文件生效
  • %s/^Date: .*/Date: .../:正则匹配行首为Date: 的行,替换为带当前日期的新行
  • 最后一行的silent! noautocmd write:防止因我们修改文件导致autocmd循环触发,同时静默执行避免多余提示

方式二:纯Lua实现(不依赖Vim命令)

如果想完全用Lua逻辑实现,可以直接操作缓冲区内容:

vim.api.nvim_create_autocmd('BufWritePre', {
  pattern = '*.md',
  callback = function()
    local current_date = vim.fn.strftime('%Y/%m/%d')
    -- 获取当前缓冲区所有行
    local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
    
    -- 遍历查找目标行并替换
    for idx, line in ipairs(lines) do
      if line:match('^Date: ') then
        lines[idx] = 'Date: ' .. current_date
        break -- 假设文件中只有一个Date行,找到即停止
      end
    end
    
    -- 将修改后的行写回缓冲区
    vim.api.nvim_buf_set_lines(0, 0, -1, false, lines)
  end,
})

关键说明:

  • vim.api.nvim_buf_get_lines:获取当前缓冲区的所有内容(0代表当前缓冲区)
  • line:match('^Date: '):用Lua的字符串匹配找到目标行
  • vim.api.nvim_buf_set_lines:将修改后的行覆盖回缓冲区

把上述代码放到你的config.lua中即可生效,注意如果你的配置是分模块的,确保这段代码被正确加载。

内容的提问来源于stack exchange,提问作者ardms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:20:05