如何讓 vim 更改編輯文件部分的日期?

如何讓 vim 更改編輯文件部分的日期?

我使用乳膠作為日記,其中包含每個主題的部分。我手動將建立和修改日期新增至文字的每個元素(節、小節、子小節…)。有沒有辦法讓它自動化?

我願意學習 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

也許最簡單的方法是安裝一個片段插件。我更喜歡烏爾蒂斯尼普斯因為它更強大,但是剪輯夥伴也很受歡迎。

tex.snippets使用 ultisnips,我會在我的文件中定義這樣的片段;

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

$0
endsnippet

如果您現在sec在行的開頭鍵入並按該<tab>鍵,則該程式碼段將展開,插入目前日期(使用時間函數)並要求您填寫部分標籤。

相關內容