如何确定退出vim时文件是否被修改?

问题描述:

我调用从Perl程序vim编辑器以这样的方式:如何确定退出vim时文件是否被修改?

my $cmd = "vi myfile"; 
system($cmd); 

然后我想根据执行不同的行动,文件的修改与否:

if(myfile was modified) { 
    doAction1; 
} 
else { 
    doAction2; 
} 

如何检查如果文件被修改或没有?我搜索了vim退出代码,但没有找到任何有用的东西。

+0

Hi @stanwar:if a ny答案已通过点击复选标记解决了您的问题,请考虑[接受它](http://meta.stackexchange.com/q/5234/179419)。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 – 2015-04-15 09:04:12

制作一个脚本,引入了tmp文件:

MYTMP=/tmp/perltimestamp.$$ 
file=myfile 
touch ${MYTMP} 
vi ${file} 
if [ $(find . -name ${file} -newer ${MYTMP} | wc -l) -gt 0 ]; then 
    rm ${MYTMP} 
    doAction1 
} else { 
    rm ${MYTMP} 
    doAction2; 
} 

当然你也可以在外面的if-then-else的移动rm命令,当你doActions是快速,安全。

最简单的办法是检查文件的mtime

my $old_mtime = (stat $file)[9]; 
system('vi', $file); 
if ((stat $file)[9] != $old_mtime) { 
    # file modified 
} 

File::Modified module封装MD5和修改时间检查(宁愿MD5如果安装File::MD5):

use File::Modified; 
my $detector = File::Modified->new(files=>[$filename]); 
# [run the editor] 
if($detector->changed) { # [...] 

下面是一个完整的例子:

#!/usr/bin/perl 

use File::Modified; 

my $filename = 'myfile'; 
my $detector = File::Modified->new(files=>[$filename]); 

my $cmd = "vi $filename"; 
system $cmd; 

if($detector->changed) { 
    print "modified\n"; 
} else { 
    print "the same\n"; 
}