Como fazer o vim alterar a data em que uma seção de um arquivo foi editada?

Como fazer o vim alterar a data em que uma seção de um arquivo foi editada?

Estou usando o látex como um diário com seções para cada assunto. Adiciono manualmente a data de criação e modificação de cada elemento do texto (seção, subseção, subsubseção, ...). Existe uma maneira de tornar isso automático?

Estou disposto a aprender lua ou python e codificá-lo (uso C++ moderno), mas não tenho certeza de quais ferramentas estão disponíveis e como torná-lo rápido.

Meu plano é fazer com que pareça a partir da declaração anterior do elemento de texto até a próxima declaração do elemento. pode ser procurar na árvore de desfazer. veja se há alguma alteração. se houver, altere a data após a declaração da seção atual. também seria bom ocultar essas datas e mostrá-las.

Responder1

Isso é possível, mas exigirá que você tenha algum conhecimento da linguagem de script do Vim. Você precisará escrever uma função Vim que possa encontrar a localização da data na seção atual sem "escapar" dessa seção e, em seguida, alterar essa linha. Depois que a função for escrita, você precisará anexá-la a um autocmd.

Por exemplo, se sua função foi chamada, TexAutoDate()você poderia chamá-la automaticamente toda vez que escrever um arquivo que termine desta .texforma:

:autocmd BufWritePre *.tex :call TexAutoDate()

Infelizmente, o corpo real da função será bastante complexo e sem saber mais sobre o layout do seu arquivo não posso ajudá-lo muito. Eu tenho uma função que escrevi para um propósito semelhante, mas ela não se restringe a seções. A função a seguir atualiza a linha "Última alteração:" de um arquivo de ajuda do Vim automaticamente na gravação:

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

Ver:

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

O último é extenso e você não precisará ler o arquivo inteiro, mas conterá muito do que você precisa caso ainda não conheça o script Vim.

Responder2

Provavelmente a maneira mais fácil de fazer isso é instalar um plugin de snippet. eu prefiroultrasnipsporque é muito mais poderoso, mascompanheiro de recortetambém é muito popular.

Com o ultisnips, eu definiria um trecho como este no meu tex.snippetsarquivo;

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

$0
endsnippet

Se você digitar agora secno início de uma linha e pressionar a <tab>tecla, o trecho se expandirá, inserindo a data atual (usando ohorário de trabalhofunção) e solicitando que você preencha o rótulo da seção.

informação relacionada