変更後の作成タイムスタンプを保持


8

vim作成タイムスタンプを変更せずにファイルを変更したい。

ドキュメントはそのような可能性について何も言及していないようです。

スワップ/リカバリ機能をオフにせずにこれを実現したいのですが。

1つの代替方法は、時間をどこかに保存し、終了時に上書きすることだと思います。


2
どのOSを使用していますか?一部のOSは作成時間を保存しないため、違いが生じる可能性があります。
blm 2015年

OS X 10.8.5を使用しています。
1.61803

回答:


2

佐藤の答えは標準のUnix派生物でctimeは正しいでしょう。この場合、作成時間と間違えられることが多いですが、実際にはiノードの変更時間であり、「保存」することは実際には意味がありません。ただし、Mac OS Xは実際の作成日時である個別の作成時間を維持し、ファイルを所定の場所で変更したり、ファイルのモードを変更したりして更新されないため、ポスターが使用しているOSを尋ねました。すべてそのうち更新しctimeます。

作成時間は、Finderのファイルで情報を取得するかGetFileInfo <file>、コマンドラインから確認できます(GetFileInfo開発者ツールをインストールする必要があります)。時刻はSetFile -d <datetime> <file>(開発ツールも必要)を使用して変更できます。

したがって、元のファイルから新しいファイルに作成時間をコピーすることにより、Mac OS Xで作成時間を維持するようにvimに要求することは合理的に思えます(私には、Bramについてはわかりません:-))。そうではなく、vimソースをちらっと見ただけで、どこにあるのかわかりません。そのため、残念ながら、投稿者の質問に対する回答は「現時点では不可能です」と思われます。Mac OS X(開発ツールを使用)では、コマンドラインから作成時間を取得および設定できるため、それを実行するvimスクリプトをまとめることができますが、それは(現在のところ)私のvimスクリプト機能を超えています。

編集する

私は何かをスクリプトで遊ぶことを決め、実際にそれを動作させました!

以下を.vimrcに追加してください:

autocmd BufReadPre * call SaveFileCreateTime()
autocmd BufWritePost * call RestoreFileCreateTime()

function! SaveFileCreateTime()
    let l:path = expand('%:p')

    if l:path != ''
        let b:created = system("GetFileInfo -d " . shellescape(bufname("%")))
    endif
endfunction

function! RestoreFileCreateTime()
    if exists('b:created')
        execute system(
          \ 'SetFile -d ' .
          \ shellescape(b:created) .
          \ ' ' .
          \ shellescape(bufname("%")))
    endif
endfunction

これは、ファイルが読み取られる前(のようなものではなく、バッファー内で編集するため:read)とファイルが書き込まれた後に実行するように自動コマンドを設定します。がファイルの作成時間を取得し、それをバッファのローカル変数に格納するためにSaveFileCreateTime使用GetFileInfo -dする最初の呼び出しb:created。ファイルが書き込まれた後、RestoreFileCreateTimeが呼び出されます。b:created存在する場合は、時刻の設定systemに使用するコマンドで使用SetFile -dされます。

次に例を示します。

$ echo hello >file.txt
$ stat -c%z file.txt;GetFileInfo -d file.txt
2015-11-07 11:44:04.000000000 -0800
11/07/2015 11:44:04
$ vim file.txt
a earth<esc>:wq
$ cat file.txt
hello earth
$ stat -c%z file.txt;GetFileInfo -d file.txt
2015-11-07 11:44:24.000000000 -0800
11/07/2015 11:44:04

iノードの変更時刻(で表示stat)が変更されたのがわかりますが、ファイルの作成時刻(で表示)は変更されGetFileInfoていません。成功!

上記のように、GetFileInfoとSetFileを取得するには、開発ツールをインストールする必要があります。また、これは私の最初の実際のスクリプトなので、私が行ったすべての恐ろしいエラーを自由に指摘してください!


vimスクリプトvimは、作成日を保存するために、私がインストールしたツールを使用して、ラッパーまたはalter のランタイムになりますか?
1.61803 2015年

これは、.vimrcに配置するいくつかの関数です。私はそれで遊んでみることにしました、そして実際にうまくいくものを得ました!回答を編集してそれを含めます。
blm 2015年

@ 1.61803 OK、時間を節約して復元するためにvimscriptを含めるように私の回答を編集しました。それがあなたのために働くかどうか私に知らせてください。
blm 2015年

vimdiffrootとユーザーが所有するファイルをing しながらテストしました。ここまでは順調ですね。これはVim Tips wikiに投稿してください。それは素晴らしい答えでした、ありがとう。
1.61803 2015年

ところで、あなたのstatコマンドはLinux用です。OS X 10.8.5ではを使用しますstat -f %Sc
1.61803


1

標準のユーザー空間関数を使用してUNIXに実装することはできません。ctimeファイルのは、カーネルが自動的に更新されたファイルのinode変更atimeおよびとは異なり、mtimeユーザーがアクセスできるctime任意の値に設定する関数はありません。


でしたvim、だけではなく、ファイルを交換しますかcp test.swp test.txt
1.61803 2015年

@ 1.61803、less test.swpあなたの質問に答えるべきです。
romainl 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.