如何判断退出Vim时文件是否被修改?

6xfqseft  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(131)

我从Perl程序中调用Vim编辑器的方式如下:

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

字符串
然后,我想根据文件被修改或不执行不同的操作:

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


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

bq3bfh9z

bq3bfh9z1#

File::Modified module封装了MD5和mtime检查(如果安装了File::MD5,则首选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";
}

lyfkaqu1

lyfkaqu12#

在在线帮助中不太容易找到,但有一种方法可以退出非零。它隐藏在quickfix帮助中,这可能对寻找此答案的人也很有趣。
参见:help cquit:help quickfix以了解迭代的好处。
最基本的方法是使用两种不同的方式退出. :wq(如果要写入文件)和:cq(如果不写入文件(不幸的是,:cq不提供保存文件的选项).使用不同的退出策略确实有它的好处.如果我进入文件并意识到我不希望自动化任务运行毕竟,我可以做:w:cq
决定如何退出,是一个没有人需要的决定。下面的键图使生活变得简单。只需Ctrl + x退出。

:map <C-X> <ESC>:if &modified \| wq \| else \| cq \| endif <CR>
:imap <C-X> <ESC>:if &modified \| wq \| else \| cq \| endif <CR>

字符串
这里需要注意的是,即使设置了modified标志,文件也可能没有什么不同,请参见:help modified
注意,如果你还没有vimrc文件,你需要移植一个不会破坏Vim进入兼容模式的文件,比如cp /etc/vim/vimrc ~/.vimrc

zdwk9cvp

zdwk9cvp3#

简单的方法是检查文件的mtime

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

字符串

r9f1avp5

r9f1avp54#

创建一个引入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;
}

字符串
当然,当doAction快速且安全时,您可以将rm命令移到if-then-else之外。

相关问题