4

我有一个输出文本的 Perl 脚本。我想将此文本导入 vim,编辑它,保存然后退出。退出时,我希望原始 Perl 脚本处理编辑后的文件。

例如,当您添加新工作时如何crontab -e工作。

谢谢 :)

4

5 回答 5

13

听起来像是使用system在文件名上运行 vim 的一个非常简单的案例。这将等到 vim 完成,此时您可以继续阅读文件的新内容。

于 2009-04-24T14:33:33.770 回答
7
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;
于 2009-04-24T17:22:57.293 回答
3

一个建议:为什么不将源代码抓取到 crontab 并查看它的作用?

除此之外,放松有你的答案。

我认为思考这个问题的方法是:

“好的,我需要一个程序来写出一个文件,调用 vim,然后对文件进行进一步处理。所以,这是我编写文件的例程,这是我调用 vim 的例程(使用系统),这是我的例程在 vim 完成后进行后处理。现在我将它们全部连接到我的主程序中,我就完成了!

于 2009-04-24T15:14:01.630 回答
2

您似乎想将脚本的输出通过管道传输到 vim:

脚本 | vim

然后你希望脚本以某种方式知道 Vim 已经完成并继续。这不是 I/O 重定向的工作方式。该脚本不知道其输出被输入到哪个程序中。

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

事实证明我在 Perl 中完全做到了这一点。我创建了一个临时文件(带有tempfile),在其中写入了一堆文本,然后用于system调用该文件的编辑器。您甚至不必在运行编辑器时关闭文件。

于 2009-04-24T14:30:49.923 回答
0

管道输出到vim -不要忘记最后的破折号。

script.pl | vim -

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

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

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

这不是最好的方法,但是按照我的原始答案,这可行(如果您将文件保存为 file.txt):

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

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

于 2009-04-24T14:38:17.470 回答