ファイルのセクションが編集された日付を vim で変更するにはどうすればよいですか?

ファイルのセクションが編集された日付を vim で変更するにはどうすればよいですか?

私は各テーマのセクションがある日記として LaTeX を使用しています。テキストの各要素 (セクション、サブセクション、サブサブセクションなど) に作成日と変更日を手動で追加しています。これを自動化する方法はありますか?

私は Lua または Python を学習してコーディングするつもりですが (最新の C++ を使用しています)、どのようなツールが利用できるのか、またそれをどのように高速化できるのかがよくわかりません。

私の計画は、前のテキスト要素宣言から始まって次の要素宣言まで表示されるようにすることです。元に戻すツリーを調べて、変更があるかどうかを確認します。変更がある場合は、現在のセクションの宣言後の日付を変更します。これらの日付を非表示にして、再度表示することもよいでしょう。

答え1

これは可能ですが、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 スクリプトをまだ知らない場合に必要なものの多くが含まれています。

答え2

おそらく最も簡単な方法は、スニペットプラグインをインストールすることです。私はウルティスニップはるかに強力だからだがスニップメイトも大変人気があります。

ultisnips を使用すると、ファイル内に次のようなスニペットを定義しますtex.snippets

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

$0
endsnippet

sec行の先頭に入力して<tab>キーを押すと、スニペットが展開され、現在の日付が挿入されます(strftime関数) を実行し、セクション ラベルを入力するように要求します。

関連情報