Conserva il timestamp di creazione dopo la modifica


8

Voglio modificare i file vimsenza cambiare i timestamp di creazione.

I documenti non sembrano menzionare nulla di tale possibilità.

Mi piacerebbe raggiungere questo obiettivo senza disattivare la funzione di scambio / ripristino.

Un'alternativa sarebbe quella di memorizzare il tempo da qualche parte e quindi sovrascriverlo all'uscita, immagino.


2
Su quale sistema operativo sei? Alcuni sistemi operativi non memorizzano i tempi di creazione, quindi potrebbe fare la differenza.
blm

Sono su OS X 10.8.5.
1.61803,

Risposte:


2

La risposta di Sato sarebbe corretta su un derivato Unix standard, dove ctimespesso viene scambiato per tempo di creazione ma in realtà è tempo di cambio dell'inode e "preservare" non ha davvero senso. Tuttavia, ho chiesto quale sistema operativo utilizza il poster perché Mac OS X mantiene un orario di creazione separato che è una data e ora di creazione effettive e non viene aggiornato modificando il file in atto o cambiando la modalità del file o qualcosa del genere, tutto di cui si aggiorna ctime.

Puoi vedere il tempo di creazione facendo un Get Info su un file nel Finder o GetFileInfo <file>da una riga di comando ( GetFileInforichiede l'installazione degli strumenti di sviluppo). Il tempo può essere modificato utilizzando SetFile -d <datetime> <file>(che richiede anche strumenti di sviluppo).

Quindi sembra ragionevole (per me, non so di Bram :-)) chiedere a Vim di mantenere il tempo di creazione su Mac OS X, copiando il tempo di creazione dal file originale al nuovo file, ma chiaramente non lo fa e, guardando attraverso le fonti di VIM, non vedo da nessuna parte dove lo fa. Quindi, sfortunatamente, sembra che la risposta alla domanda del poster sia "Attualmente non è possibile". Poiché Mac OS X (con strumenti di sviluppo) consente di ottenere e impostare il tempo di creazione dalla riga di comando, potrebbe essere possibile mettere insieme uno script VIM che lo fa, sebbene (attualmente) al di là delle mie capacità di scripting Vim.

modificare

Ho deciso di scherzare con lo scripting e in realtà l'ho fatto funzionare!

Aggiungi quanto segue al tuo .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

Ciò imposta l'esecuzione automatica dei comandi prima della lettura di un file (per la modifica in un buffer, non per cose simili :read) e dopo la sua scrittura. Le prime chiamate SaveFileCreateTimeche utilizza GetFileInfo -dper ottenere il tempo di creazione del file e memorizzarlo nella variabile locale del buffer b:created. Dopo aver scritto un file, RestoreFileCreateTimeviene chiamato. Se b:createdesiste, viene utilizzato in un systemcomando SetFile -dper impostare l'ora.

Ecco un esempio:

$ 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

Puoi vedere che il tempo di cambio dell'inode (come visualizzato da stat) è cambiato, ma il tempo di creazione del file (come visualizzato da GetFileInfo) non è cambiato . Successo!

Come notato sopra, ciò richiede l'installazione degli strumenti di sviluppo per ottenere GetFileInfo e SetFile. Inoltre, questa è la mia prima vera sceneggiatura, quindi sentiti libero di sottolineare tutti gli orribili errori che ho fatto!


Uno script di VIM sarebbe un wrapper o un vimruntime di alterazione usando quegli strumenti, che ho installato tra l'altro, per preservare la data di creazione?
1.61803,

Sarebbe alcune funzioni che metti nel tuo .vimrc. Ho deciso di giocarci e in realtà ho ottenuto qualcosa che funziona! Modificherò la mia risposta per includerla.
blm

@ 1.61803 Ok, ho modificato la mia risposta per includere il vimscript per salvare e ripristinare il tempo. Fammi sapere se funziona per te.
blm

L'ho provato mentre vimdiffing file di proprietà di root e utente. Fin qui tutto bene. Dovresti pubblicarlo nel wiki di Vim Tips . È stata un'ottima risposta, grazie.
1.61803,

A proposito, il tuo statcomando è per Linux, immagino. In OS X 10.8.5 useresti stat -f %Sc.
1.61803,


1

Ciò che si desidera non è possibile implementare in UNIX utilizzando le funzioni standard di spazio utente. Il ctimefile di un file viene aggiornato automaticamente dal kernel quando il file inodecambia . A differenza di atimee mtime, non esiste una funzione accessibile all'utente per impostare ctimeun valore arbitrario.


Potrebbe vim, invece di scambiare file, giusto cp test.swp test.txt?
1.61803,

@ 1.61803, less test.swpdovrebbe rispondere alla tua domanda.
Romainl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.