Pertahankan cap waktu kreasi setelah modifikasi

8

Saya ingin memodifikasi file dengan vimtanpa mengubah prangko waktu pembuatan.

Dokumen itu sepertinya tidak menyebutkan apa pun tentang kemungkinan seperti itu.

Saya ingin mencapai ini tanpa mematikan fitur swap / recover.

Salah satu alternatif adalah menyimpan waktu di suatu tempat dan kemudian menimpanya saat keluar, saya kira.

1.61803
sumber
2
OS apa yang Anda pakai? Beberapa OS tidak menyimpan waktu pembuatan, sehingga bisa membuat perbedaan.
Blm
Saya menggunakan OS X 10.8.5.
1.61803

Jawaban:

2

Jawaban Sato akan benar pada turunan standar Unix, di mana ctimesering keliru untuk waktu pembuatan tetapi sebenarnya waktu perubahan inode, dan "melestarikan" itu tidak benar-benar masuk akal. Namun, saya bertanya apa OS poster digunakan karena Mac OS X mempertahankan waktu buat yang terpisah yang merupakan tanggal dan waktu pembuatan aktual, dan tidak diperbarui dengan memodifikasi file di tempat atau mengubah mode file atau hal-hal seperti itu, semua dari yang melakukan pembaruan ctime.

Anda dapat melihat waktu pembuatan dengan melakukan Dapatkan Info pada file di Finder atau GetFileInfo <file>dari baris perintah ( GetFileInfomembutuhkan alat pengembang untuk diinstal). Waktu dapat dimodifikasi menggunakan SetFile -d <datetime> <file>(juga membutuhkan alat pengembang).

Jadi sepertinya masuk akal (bagi saya, tidak tahu tentang Bram :-)) untuk meminta vim mempertahankan waktu pembuatan di Mac OS X, dengan menyalin waktu pembuatan dari file asli ke file baru, tetapi jelas tidak dan melirik melalui sumber vim, saya tidak melihat di mana pun ia melakukannya. Jadi, sayangnya, tampaknya jawaban untuk pertanyaan poster adalah "Saat ini tidak mungkin." Karena Mac OS X (dengan alat pengembang) memang memungkinkan untuk mendapatkan dan mengatur waktu pembuatan dari baris perintah, dimungkinkan untuk menyatukan skrip vim yang melakukan itu, meskipun itu (saat ini) berada di luar kemampuan skrip vim saya.

Edit

Saya memutuskan untuk bermain-main dengan menulis sesuatu dan benar-benar membuatnya bekerja!

Tambahkan berikut ini ke .vimrc Anda:

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

Itu menetapkan perintah otomatis untuk dijalankan sebelum file dibaca (untuk mengedit dalam buffer, bukan untuk hal-hal seperti :read) dan setelah itu ditulis. Panggilan pertama SaveFileCreateTimeyang digunakan GetFileInfo -duntuk mendapatkan waktu pembuatan file dan menyimpannya dalam variabel lokal buffer b:created. Setelah file ditulis, RestoreFileCreateTimedipanggil. Jika b:createdada, itu digunakan dalam systemperintah yang digunakan SetFile -duntuk mengatur waktu.

Ini sebuah contoh:

$ 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

Anda dapat melihat waktu perubahan inode (seperti yang ditampilkan oleh stat) telah berubah, tetapi file tersebut membuat waktu (seperti yang ditampilkan oleh GetFileInfo) belum. Keberhasilan!

Seperti disebutkan di atas, ini membutuhkan alat pengembang untuk diinstal untuk mendapatkan GetFileInfo dan SetFile. Juga, ini adalah naskah asli saya yang pertama, jadi silakan tunjukkan semua kesalahan mengerikan yang saya buat!

blm
sumber
Apakah skrip vim menjadi pembungkus atau vimruntime alter menggunakan alat-alat itu, yang telah saya instal btw, untuk mempertahankan tanggal pembuatan?
1.61803
Ini akan menjadi beberapa fungsi yang Anda letakkan di .vimrc Anda. Saya memutuskan untuk bermain-main dengannya dan benar-benar mendapatkan sesuatu yang berfungsi! Saya akan mengedit jawaban saya untuk memasukkan itu.
Blm
@ 1.61803 Oke, edit jawaban saya untuk menyertakan vimscript untuk menghemat dan memulihkan waktu. Beri tahu saya jika itu berhasil untuk Anda.
Blm
Saya mengujinya sambil memasukkan vimdifffile yang dimiliki oleh root dan pengguna. Sejauh ini bagus. Anda harus memposting ini di wiki Tips Vim . Itu jawaban yang bagus, terima kasih.
1.61803
Btw, statperintahmu untuk Linux, kurasa. Di OS X 10.8.5 Anda akan menggunakan stat -f %Sc.
1.61803
1

Apa yang Anda inginkan tidak mungkin diterapkan di UNIX menggunakan fungsi userspace standar. The ctimefile diperbarui secara otomatis oleh kernel ketika file inodeperubahan . Tidak seperti atimedan mtime, tidak ada fungsi yang dapat diakses pengguna untuk menetapkan ctimenilai sewenang-wenang.

Sato Katsura
sumber
Bisakah vim, alih-alih bertukar file, kan cp test.swp test.txt?
1.61803
@ 1.61803, less test.swpharus menjawab pertanyaan Anda.
romainl