Conserver l'horodatage de création après modification


8

Je souhaite modifier des fichiers avec vimsans changer les horodatages de création.

Les documents ne semblent rien mentionner d'une telle possibilité.

Je voudrais y parvenir sans désactiver la fonction d'échange / récupération.

Une alternative serait de stocker l'heure quelque part, puis de l'écraser à la sortie, je suppose.


2
Sur quel OS êtes-vous? Certains systèmes d'exploitation ne stockent pas les heures de création, cela pourrait donc faire une différence.
blm

Je suis sur OS X 10.8.5.
1.61803 du

Réponses:


2

La réponse de Sato serait correcte sur un dérivé standard d'Unix, où il ctimeest souvent confondu avec le temps de création mais est en fait un temps de changement d'inode, et "le préserver" n'a pas vraiment de sens. Cependant, j'ai demandé quel système d'exploitation le poster utilise parce que Mac OS X maintient une heure de création distincte qui est une date et une heure de création réelles, et n'est pas mise à jour en modifiant le fichier en place ou en changeant le mode du fichier ou quelque chose comme ça, tous dont mise à jour ctime.

Vous pouvez voir l'heure de création en effectuant une extraction d'informations sur un fichier dans le Finder ou à GetFileInfo <file>partir d'une ligne de commande ( GetFileInfonécessite l'installation des outils de développement). L'heure peut être modifiée à l'aide SetFile -d <datetime> <file>(nécessitant également des outils de développement).

Il semble donc raisonnable (pour moi, je ne sais pas pour Bram :-)) de demander à vim de maintenir l'heure de création sur Mac OS X, en copiant l'heure de création du fichier d'origine vers le nouveau fichier, mais cela ne le fait clairement pas 't, et en regardant à travers les sources vim, je ne vois nulle part où il le fait. Donc, malheureusement, il semble que la réponse à la question de l'affiche soit "Ce n'est pas possible actuellement". Étant donné que Mac OS X (avec des outils de développement) permet d'obtenir et de définir l'heure de création à partir de la ligne de commande, il peut être possible de créer un script vim qui le fasse, bien que cela soit (actuellement) au-delà de mes capacités de scriptage vim.

Éditer

J'ai décidé de jouer avec quelque chose de script et je l'ai fait fonctionner!

Ajoutez ce qui suit à votre .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

Cela définit les commandes automatiques à exécuter avant la lecture d'un fichier (pour l'édition dans un tampon, pas pour des choses comme :read) et après son écriture. Le premier appel SaveFileCreateTimequi utilise GetFileInfo -dpour obtenir le temps de création du fichier et le stocker dans la variable locale du tampon b:created. Après l'écriture d'un fichier, RestoreFileCreateTimeest appelé. S'il b:createdexiste, il est utilisé dans une systemcommande à utiliser SetFile -dpour régler l'heure.

Voici un exemple:

$ 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

Vous pouvez voir que l'heure de modification de l'inode (comme affiché par stat) a changé, mais l'heure de création du fichier (comme affiché par GetFileInfo) n'a pas changé . Succès!

Comme indiqué ci-dessus, cela nécessite que les outils de développement soient installés pour obtenir GetFileInfo et SetFile. Aussi, c'est mon premier vrai script, alors n'hésitez pas à signaler toutes les hideuses erreurs que j'ai faites!


Un script vim serait-il un wrapper ou un vimruntime d' alter en utilisant ces outils, que j'ai installés btw, pour conserver la date de création?
1.61803

Ce serait certaines fonctions que vous mettriez dans votre .vimrc. J'ai décidé de jouer avec et j'ai obtenu quelque chose qui fonctionne! Je vais modifier ma réponse pour l'inclure.
blm

@ 1.61803 Ok, édité ma réponse pour inclure le vimscript pour sauver et restaurer l'heure. Dites-moi si cela marche pour vous.
blm

Je l'ai testé lors de l' vimdiffingénierie de fichiers appartenant à root et à l'utilisateur. Jusqu'ici tout va bien. Vous devriez poster ceci dans le wiki Vim Tips . C'était une excellente réponse, merci.
1.61803

Btw, votre statcommande est pour Linux, je suppose. Dans OS X 10.8.5, vous utiliseriez stat -f %Sc.
1.61803


1

Ce que vous voulez n'est pas possible d'implémenter sous UNIX à l'aide des fonctions standard de l'espace utilisateur. Le ctimefichier est mis à jour automatiquement par le noyau lorsque le fichier inodechange . Contrairement à atimeet mtime, il n'y a pas de fonction accessible à l'utilisateur pour définir ctimeune valeur arbitraire.


Pourrait vim, au lieu d'échanger des fichiers, juste cp test.swp test.txt?
1.61803

@ 1.61803, less test.swpdevrait répondre à votre question.
romainl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.