Как заставить vim изменить дату редактирования раздела файла?

Как заставить vim изменить дату редактирования раздела файла?

Я использую latex как дневник с разделами для каждого предмета. Я вручную добавляю дату создания и изменения к каждому элементу текста (раздел, подраздел, подподраздел, ...). Есть ли способ сделать это автоматически?

Я готов изучить Lua или Python и писать на них код (я использую современный C++), но не уверен, какие инструменты для этого доступны и как это сделать быстро.

Мой план состоит в том, чтобы сделать так, чтобы он начинался с предыдущего объявления текстового элемента и заканчивался объявлением следующего элемента. Можно посмотреть в дереве отмены. Посмотреть, есть ли какие-либо изменения. Если есть, то изменить дату после объявления текущего раздела. Также было бы неплохо скрыть эти даты и показать их снова.

решение1

Это возможно, но для этого вам потребуются некоторые знания языка скриптов Vim. Вам нужно будет написать функцию Vim, которая может найти местоположение даты в текущем разделе без "экранирования" этого раздела, а затем изменить эту строку. После того, как функция будет написана, вам нужно будет прикрепить ее к autocmd.

Например, если бы ваша функция была вызвана, TexAutoDate()вы могли бы вызывать ее автоматически каждый раз, когда вы записываете файл, заканчивающийся следующим .texобразом:

:autocmd BufWritePre *.tex :call TexAutoDate()

К сожалению, фактическое тело функции будет довольно сложным, и без дополнительных знаний о структуре вашего файла я не смогу вам помочь. У меня есть функция, написанная для схожей цели, но она не ограничивает себя разделами. Следующая функция автоматически обновляет строку "Last change:" файла справки 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>, фрагмент расширится, вставив текущую дату (используяstrftimeфункция) и попросит вас заполнить метку раздела.

Связанный контент