Como tornar o vim mudar uma data quando uma seção de um arquivo foi editada?

1

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

Estou disposto a aprender lua ou python e codificá-lo (uso o 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 começar da declaração de elemento de texto anterior e até a próxima declaração de elemento. pode ser olhar na árvore de desfazer. veja se há alguma alteração. se houver que alterar a data após a declaração da seção atual. Também seria bom esconder essas datas e mostrá-las de volta.

    
por kirill_igum 12.11.2012 / 20:56

2 respostas

1

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 dentro da seção atual sem "escapar" aquela seção, e então alterar essa linha. Uma vez que a função esteja escrita, você precisará anexá-la a um autocmd.

Por exemplo, se a sua função foi chamada TexAutoDate() , você poderia chamá-la automaticamente toda vez que gravar um arquivo que termina em .tex desta maneira:

:autocmd BufWritePre *.tex :call TexAutoDate()

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

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

Veja:

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

O último é extenso e você não precisará ler o arquivo inteiro, mas ele conterá muito do que você precisa se você ainda não conhece o script Vim.

    
por 19.08.2013 / 20:11
0

Provavelmente, a maneira mais fácil de fazer isso é instalar um plug-in de snippet. Eu prefiro ultisnips porque é muito mais poderoso, mas snipmate também é muito popular.

Com ultisnips, eu definiria um snippet como este no meu arquivo tex.snippets ;

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

$0
endsnippet

Se você digitar agora sec no início de uma linha e pressionar a tecla <tab> , o snippet se expandirá, inserindo a data atual (usando o strftime ) e pedir-lhe para preencher o rótulo da secção.

    
por 18.08.2013 / 21:21