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

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

特定のフォルダー内のファイルについては、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

関連情報