Как заставить vim изменить дату, когда раздел файла был отредактирован?
Я использую латекс как дневник с разделами для каждого предмета. Я вручную добавляю дату создания и модификации к каждому элементу текста (раздел, подраздел, подраздел, ...). Есть ли способ сделать это автоматически?
Я готов изучать lua или python и кодировать их (я использую современный C++), но я не уверен, какие инструменты доступны и как сделать это быстро.
Мой план состоит в том, чтобы он выглядел начиная с предыдущего объявления текстового элемента и до следующего объявления элемента. может быть смотреть в отменить дерево. посмотреть, есть ли какие-либо изменения. если есть, измените дату после объявления текущего раздела. также было бы неплохо скрыть эти даты и показать их обратно.
2 ответа
Это возможно, но для этого потребуется знание языка сценариев Vim. Вам нужно будет написать функцию Vim, которая может найти местоположение даты в текущем разделе без "экранирования" этого раздела, а затем изменить эту строку. Как только функция написана, вам нужно присоединить ее к autocmd.
Например, если ваша функция была вызвана 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.
Вероятно, самый простой способ сделать это - установить плагин сниппета. Я предпочитаю ultisnips, потому что он намного мощнее, но snipmate также очень популярен.
С ultisnips я бы определил такой фрагмент в моем tex.snippets
файл;
snippet sec "section" b
\section{`!v strftime("%Y-%m-%d")`: ${1:section label}}
$0
endsnippet
Если вы сейчас печатаете sec
в начале строки и нажмите <tab>
ключ, фрагмент будет развернут, вставив текущую дату (используя функцию strftime) и попросив вас заполнить метку раздела.