Wie kann man Vim dazu bringen, das Datum zu ändern, wenn ein Abschnitt einer Datei bearbeitet wurde?

Wie kann man Vim dazu bringen, das Datum zu ändern, wenn ein Abschnitt einer Datei bearbeitet wurde?

Ich verwende Latex als Tagebuch mit Abschnitten für jedes Thema. Ich füge jedem Textelement (Abschnitt, Unterabschnitt, Unterunterabschnitt usw.) manuell das Erstellungs- und Änderungsdatum hinzu. Gibt es eine Möglichkeit, dies automatisch zu machen?

Ich bin bereit, Lua oder Python zu lernen und es zu programmieren (ich verwende modernes C++), aber ich bin nicht sicher, welche Tools verfügbar sind und wie ich es schnell machen kann.

Mein Plan ist, es so aussehen zu lassen, dass es von der vorherigen Textelementdeklaration bis zur nächsten Elementdeklaration reicht. Vielleicht schauen Sie im Undo-Baum nach, um zu sehen, ob es Änderungen gibt. Wenn ja, ändern Sie das Datum nach der Deklaration des aktuellen Abschnitts. Es wäre auch schön, diese Daten auszublenden und wieder anzuzeigen.

Antwort1

Dies ist möglich, erfordert jedoch Kenntnisse der Skriptsprache von Vim. Sie müssen eine Vim-Funktion schreiben, die die Position des Datums im aktuellen Abschnitt finden kann, ohne diesen Abschnitt zu „verlassen“, und dann diese Zeile ändern. Sobald die Funktion geschrieben ist, müssen Sie sie an ein Autocmd anhängen.

Wenn Ihre Funktion beispielsweise aufgerufen wurde, TexAutoDate()könnten Sie sie jedes Mal automatisch aufrufen, wenn Sie eine Datei mit .texder folgenden Endung schreiben:

:autocmd BufWritePre *.tex :call TexAutoDate()

Leider ist der eigentliche Funktionskörper ziemlich komplex und ohne mehr über Ihr Dateilayout zu wissen, kann ich Ihnen nicht viel helfen. Ich habe eine Funktion, die ich für einen ähnlichen Zweck geschrieben habe, aber sie beschränkt sich nicht auf Abschnitte. Die folgende Funktion aktualisiert die Zeile „Letzte Änderung:“ einer Vim-Hilfedatei automatisch beim Schreiben:

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

Sehen:

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

Letzteres ist umfangreich und Sie müssen nicht die gesamte Datei durchlesen, aber es enthält vieles von dem, was Sie brauchen, wenn Sie Vim-Skripte noch nicht kennen.

Antwort2

Der wahrscheinlich einfachste Weg, dies zu tun, ist die Installation eines Snippet-Plugins. Ich bevorzugeAbonnierenweil es viel leistungsfähiger ist, aberschnipsenerfreut sich auch großer Beliebtheit.

Mit Ultisnips würde ich einen Snippet wie diesen in meiner tex.snippetsDatei definieren;

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

$0
endsnippet

Wenn Sie nun secam Anfang einer Zeile tippen und die <tab>Taste drücken, wird das Snippet erweitert und das aktuelle Datum eingefügt (mit demstrfzeit-Funktion) und fordert Sie auf, die Abschnittsbezeichnung auszufüllen.

verwandte Informationen