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

时间:2009-04-24 14:01:41

标签: perl vim temporary-files

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

E.G。添加新作业时crontab -e的工作原理。

谢谢:)

5 个答案:

答案 0 :(得分:13)

使用system在文件名上运行vim听起来很简单。这将等到vim完成,此时你可以继续阅读文件的新内容。

答案 1 :(得分:6)

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;

答案 2 :(得分:3)

建议:为什么不抓住crontab的源代码并查看它的用途?

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

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

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

答案 3 :(得分:2)

您似乎想将脚本的输出传递给vim:

script | vim

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

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

原来我在Perl中完成了这一切。我创建了一个临时文件(带有tempfile),在其中写了一堆文本,然后使用system来调用文件上的编辑器。在运行编辑器时甚至不必关闭文件。

答案 4 :(得分: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命令即可。就像我说的,这不是最好的答案,但应该有效。