如何让 vim 更改文件某部分被编辑的日期?

如何让 vim 更改文件某部分被编辑的日期?

我使用 latex 作为日记,每个主题都有部分。我手动将创建和修改日期添加到每个文本元素(部分、小节、小小节,...)。有没有办法让它自动化?

我愿意学习 lua 或 python 并编写代码(我使用现代 C++),但我不确定有哪些可用的工具以及如何使其快速运行。

我的计划是让它从前一个文本元素声明开始一直到下一个元素声明。可以在撤消树中查看。看看是否有任何变化。如果有,则在当前部分声明后更改日期。隐藏这些日期并显示回来也很好。

答案1

这是可行的,但需要您对 Vim 的脚本语言有一定的了解。您需要编写一个 Vim 函数,该函数可以在当前部分内找到日期的位置,而无需“转义”该部分,然后更改该行。编写完函数后,您需要将其附加到自动命令。

例如,如果您的函数被调用,TexAutoDate()您可以在每次写入.tex以此方式结尾的文件时自动调用它:

:autocmd BufWritePre *.tex :call TexAutoDate()

不幸的是,函数的实际主体将相当复杂,如果不了解您的文件布局,我无法为您提供太多帮助。我确实有一个为类似目的编写的函数,但它并不局限于部分。以下函数在写入时自动更新 Vim 帮助文件的“上次更改:”行:

function HelpModifiedUpdate()
    if &filetype != "help"
        return
    endif

    let today=strftime('%Y %b %d')

    " Save current cursor position:
    let lnum = line('.')
    let col  = col('.')

    if search('Last change: ', 'w')
        let line1 = getline('.')
        if line1 =~ today
            " Restore cursor position:
            call cursor(lnum, col)
            return
        endif
        let line2 = substitute(
            \line1,
            \'Last change: .*',
            \'Last change: ' . today,
            \''
        \)
        call setline('.', line2)
    endif

    " Restore cursor position:
    call cursor(lnum, col)
endfunction

看:

:help :autocmd
:help :function
:help eval.txt

最后一部分内容很广泛,您不需要读完整个文件,但如果您还不了解 Vim 脚本,它将包含您需要的大部分内容。

答案2

最简单的方法可能是安装一个代码片段插件。我更喜欢超级剪接因为它的威力更大,但是截图也很受欢迎。

tex.snippets使用 ultisnips,我会在我的文件中定义这样的代码片段;

snippet sec "section" b
\section{`!v strftime("%Y-%m-%d")`: ${1:section label}}

$0
endsnippet

如果你现在sec在行首输入内容并按下<tab>键,代码片段将会展开,插入当前日期(使用时间字符串函数)并要求您填写部分标签。

相关内容