
特定のフォルダー内のファイルについては、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同じファイルで 2 回使用すると、変更時刻が変わると 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>
注記:この関数はdate
、、stat
およびの GNU バージョンに依存しますtouch
。
答え4
このbash
機能を試してください(Shâu Shắc の回答)
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