如何在Perl脚本仍在运行时使用vim编辑文本?

4
我有一个输出文本的Perl脚本。我想将此文本导入vim,进行编辑,保存,然后退出。退出时,我希望原始的Perl脚本处理编辑后的文件。
例如,当您添加新作业时,crontab -e如何工作。
谢谢 :)

你遇到了哪个部分的问题?你有什么问题? - Rob Kennedy
嗯,基本上我不知道该怎么做。我可以将输出导入到vim中,但是一旦我完成vim操作后,我必须手动在保存的文件上运行perl脚本。然后我还得删除临时文件。我希望能够像crontab、cvs和git一样无缝集成vim。 - aidan
你不想将内容导入到vim中,unwind已经为你提供了答案。 - skiphoppy
5个回答

14
听起来很简单,可以使用system来运行vim并打开文件名。这将等待vim完成,然后您就可以继续读取文件的新内容。

2
您可能希望使用$EDITOR环境变量,以允许用户选择他们喜欢的编辑器。 - rampion

9
use File::Temp;
my $fh = new File::Temp();
my $fname = $fh->filename;
print $fh "My Text";
$fh->close();
system($ENV{EDITOR}, $fname);
open $fh, '<', $fname or die "Can't open temp file: $!";
while(<$fh>) { print }
close $fh;

这是不必要的,因为File::Temp会为您完成。有关详细信息,请参阅File::Temp。 - Hynek -Pichi- Vychodil

3
建议:为什么不获取crontab的源代码并查看它的功能呢?
除此之外,unwind已经回答了你的问题。
我认为思考这个问题的方法是:
“好的,我需要一个程序来写出一个文件,调用vim,然后对文件进行进一步处理。所以,这是我的编写文件的例程,这是我的调用vim的例程(使用system),这是vim完成后进行后处理的例程。现在我将把它们全部组合在我的主程序中,然后就完成了!”

2

您似乎想将脚本的输出导入到vim中:

script | vim

然后,您希望脚本以某种方式知道Vim何时完成并继续执行。这不是I/O重定向的工作原理。脚本不知道其输出被导入到哪个程序中。

您提到了其他程序,如crontabcvs; 它们共同之处在于它们自己调用编辑器。它们创建临时文件,读取EDITOR或VISUAL环境变量(有关如何选择哪个变量的详细信息,请查阅手册),运行给定程序,并等待程序完成。然后,它们继续运行并使用先前指定的文件。

事实证明我在Perl中确实做到了这一点。我创建了一个临时文件(使用tempfile),将大量文本写入其中,然后使用system调用编辑器对文件进行操作。您甚至可以在运行编辑器时不关闭文件。


0
将输出导入到 vim - 中,不要忘记末尾的破折号。
script.pl | vim -

这将使用脚本输出的内容打开vim。只需保存它:w filename并退出:q。这不是crontab -e的工作方式,但以一种简单的方式接近。

编辑:
我错过了这部分(或者也许问题之后被编辑了):

退出时,我希望原始Perl脚本处理编辑后的文件。

这不是最好的方法,但按照我的原始答案,如果您将文件保存为file.txt,则可以使用此方法:

perl -le 'print "1234"' | vim - && perl -pe '' file.txt

只需用您的perl命令替换perl命令,它就应该可以工作。就像我说的那样,这不是最好的答案,但它应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接