Jak sprawić, by vim zmienił datę, kiedy edytowano sekcję pliku?

1

Używam lateksu jako pamiętnika z sekcjami dla każdego przedmiotu. Ręcznie dodam datę utworzenia i modyfikacji do każdego elementu tekstu (sekcja, podsekcja, podsekcja, ...). Czy istnieje sposób, aby uczynić to automatycznym?

Jestem gotów nauczyć się Lua lub Pythona i napisać do niego kod (używam nowoczesnego C ++), ale nie jestem pewien, jakie narzędzia są dostępne i jak to zrobić szybko.

Moim planem jest, aby wyglądał, zaczynając od poprzedniej deklaracji elementu tekstowego aż do następnej deklaracji elementu. może wyglądać w drzewie cofania. sprawdź, czy są jakieś zmiany. jeśli są, to zmień datę po zadeklarowaniu aktualnej sekcji. miło byłoby też ukryć te daty i pokazać je z powrotem.

kirill_igum
źródło

Odpowiedzi:

1

Jest to możliwe, ale wymaga znajomości języka skryptowego Vima. Musisz napisać funkcję Vima, która może znaleźć lokalizację daty w bieżącej sekcji bez „ucieczki” z tej sekcji, a następnie zmienić tę linię. Po napisaniu funkcji musisz dołączyć ją do autocmd.

Na przykład, jeśli twoja funkcja została wywołana, TexAutoDate()możesz wywoływać ją automatycznie za każdym razem, gdy napiszesz plik kończący się w .texten sposób:

:autocmd BufWritePre *.tex :call TexAutoDate()

Niestety rzeczywista treść tej funkcji będzie dość złożona i nie wiedząc więcej o układzie plików, nie mogę ci bardzo pomóc. Mam funkcję, którą napisałem w podobnym celu, ale nie ogranicza się ona do sekcji. Następująca funkcja automatycznie aktualizuje wiersz „Ostatnia zmiana:” pliku pomocy Vima podczas zapisu:

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

Widzieć:

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

Ostatni jest obszerny i nie będziesz musiał czytać całego pliku, ale będzie on zawierał wiele tego, czego potrzebujesz, jeśli nie znasz jeszcze skryptu Vima.

Heptyt
źródło
0

Prawdopodobnie najłatwiejszym sposobem na to jest zainstalowanie wtyczki snippet. Wolę ultisnips, ponieważ jest znacznie potężniejszy, ale snipmate jest również bardzo popularny.

W przypadku ultisnips zdefiniowałbym taki fragment w moim tex.snippetspliku;

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

$0
endsnippet

Jeśli teraz wpiszesz secna początku wiersza i naciśniesz <tab>klawisz, fragment rozszerzy się, wstawiając bieżącą datę (za pomocą funkcji strftime ) i prosząc o wypełnienie etykiety sekcji.

Roland Smith
źródło
Miałem na myśli to, że jeśli edytujesz sekcję, data zostanie zaktualizowana. nie podczas tworzenia sekcji. Zasadniczo wtyczka musiałaby sprawdzać tekst w sekcji w poszukiwaniu aktualizacji. Skończyło się na tym, że korzystam z git
kirill_igum