Eu escrevi um script em Perl para isso.
É um wrapper em torno do vim, salvo em ~/bin/vim-nomtime.pl
e colocado em uso via alias vim='~/bin/vim-nomtime.pl'
em meu .bashrc.
#!/usr/bin/perl
use strict;
use warnings;
use Cwd qw/ abs_path /;
my @dirs = qw( ~/blosxom /srv/relief/blosxom );
s/^~/$ENV{HOME}/ foreach @dirs;
# do we want to preserve stamp on this file?
sub fits {
my $dir = abs_path($_[0]);
my $fits = 0;
foreach (@dirs) {
my $preserved_dir = abs_path($_);
$fits++ if $dir =~ m|^$preserved_dir|;
}
return $fits != 0;
}
# store original stamps
my $original_stamp;
foreach (@ARGV) {
if ( -f $_ and fits($_) ) {
$original_stamp->{$_} = (stat($_))[9];
}
}
# run vim as you would
my $cmd = join ' ', 'vim', @ARGV;
system($cmd) == 0
or die "vim failed: $!";
# restore stamps if they have changed
foreach (keys %$original_stamp) {
next unless -f $_;
my $current_stamp = (stat($_))[9];
unless ($current_stamp == $original_stamp->{$_}) {
utime $original_stamp->{$_}, $original_stamp->{$_}, $_;
}
}
Algumas boas características:
-
suporta vários nomes de arquivos
-
suporta vários diretórios "assistidos"
-
suporta o link com link simbólico
-
pode ser aprimorado com outros critérios
a maioria dos quais provavelmente também pode ser obtida com a versão pura do vim. As desvantagens desta solução em comparação com a minha solução pura de vim são:
-
restaura o selo somente após o vim ser encerrado, por isso, se eu fizer uma edição longa e salvar
regularmente, o arquivo vill "pop-up" como novo até eu sair do vim
-
suporta múltiplos arquivos na linha de comando, mas de uma maneira bastante ingênua -
só verifica se a coisa em @ARGV
é um arquivo. Isso provavelmente não funcionaria
com curingas (por exemplo, vim note-*.txt
) ou outras coisas engraçadas
-
não é à prova de falhas, provavelmente nem à prova de HUP (isso pode ser feito)
-
... bem, é um invólucro. (Quero dizer, se resolvêssemos tudo via wrapper,
quantos wrappers teríamos antes de algo ruim acontecer?)