编辑后保留修改后的时间戳

编辑后保留修改后的时间戳

对于特定文件夹中的文件,我希望 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

相关内容