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