
對於特定資料夾中的文件,我希望 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 版本的date
、stat
和touch
。
答案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