編集後に変更されたタイムスタンプを維持する

編集後に変更されたタイムスタンプを維持する

特定のフォルダにあるファイルの場合、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が混乱するので、同じファイルで2回使用すると、次の警告をトリガーする小さなバグが含まれていました。

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

幸いなことに、この問題は簡単に修正できました。タイムスタンプを復元した後、ファイルを再ロードするために元の関数に "edit"コマンドを追加したので、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機能を試してください(基準:Xiaoshiの答え)

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

関連情報