編輯後保留修改後的時間戳

編輯後保留修改後的時間戳

對於特定資料夾中的文件,我希望 vim 根本不觸及「修改」時間戳。

背景是我用的布洛克瑟姆用於博客,它使用純文字文件~/bloxsom作為所有文章的來源。文章日期(以及出現的順序)是基於文字檔案的修改日期。我不希望文章像這樣彈出新的每當我修正一個拼字錯誤時。 (我願意地段 其中...:D)

到目前為止,vim 改變了時間戳,原始時間戳就永遠丟失了。這沒問題,我想對系統上的大多數檔案保持這種方式。但我不希望博客文件如此 -touch如果需要,我隨時可以獲得該文件。

關於如何將 vim 調整為這種行為有什麼想法嗎?

答案1

我認為vim沒有這個功能。一種替代方法是修改副本並適當設定時間戳,例如:

cp -p post temp
vim temp
touch -r post temp
cp -p temp post

或甚至更好:

touch -r post timestamp
vim post
touch -r timestamp post

答案2

如果您需要找點樂子:

file=path; mtime=$(stat -c %y "$file"); vi "$file"; touch -d "$mtime" "$file"

將路徑替換為您的實際檔案路徑

答案3

我找到了一個很好的解決方案 這個網頁,它會建立一個 vim 函數來保存目前文件,同時保留現有的修改時間,並將該函數綁定到功能F4鍵:

F4但是,我發現原始函數包含一個小錯誤,如果在同一個文件上使用兩次,則會觸發以下警告,因為當修改時間發生變化時,vim 會感到困惑:

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

幸運的是,這很容易解決:我在原始函數中添加了一個“編輯”命令,以便在恢復時間戳後重新加載文件,這樣 vim 就知道文件預期的修改時間。

這是修改後的 vim 函數,修復了此錯誤,可以將其新增至~/.vimrc

function! WriteSmall()
    let mtime = system("stat -c %.Y ".shellescape(expand('%:p')))
    write
    call system("touch --date='@".mtime."' ".shellescape(expand('%:p')))
    edit
endfunction
map <F4> :call WriteSmall()<CR>

筆記:此函數依賴 GNU 版本的datestattouch

答案4

嘗試這個bash功能(基於紹石的回答

vi-preserve-time () {
    for file in "$@"; do
        local mtime=$(stat -c %y "$file")
        vi "$file"
        touch -d "$mtime" "$file"
    done
}

現在我們可以使用它來編輯文件並保留修改時間

vi-preserve-time file1.txt file2.txt

相關內容