#!/usr/bin/perl =head1 NAME vipe - edit pipe =head1 SYNOPSIS command | vipe | command =head1 DESCRIPTION vipe allows you to run your editor in the middle of a unix pipeline and edit the data that is being piped between programs. =head1 ENVIRONMENT VARIABLES =over 4 =item EDITOR Editor to use. =item VISUAL Also supported to determine what editor to use. =back =head1 AUTHOR Copyright 2006 by Joey Hess Licensed under the GNU GPL. =cut use warnings; use strict; use File::Temp q{tempfile}; $/=undef; my ($fh, $tmp)=tempfile(); die "cannot create tempfile" unless $fh; print $fh || die "write temp: $!"; close $fh; close STDIN; open(STDIN, "&STDOUT") || die "save stdout: $!"; close STDOUT; open(STDOUT, ">/dev/tty") || die "reopen stdout: $!"; my @editor="vi"; if (-x "/usr/bin/editor") { @editor="/usr/bin/editor"; } if (exists $ENV{EDITOR}) { @editor=split(' ', $ENV{EDITOR}); } if (exists $ENV{VISUAL}) { @editor=split(' ', $ENV{VISUAL}); } my $ret=system(@editor, $tmp); if ($ret != 0) { die "@editor exited nonzero, aborting\n"; } open (IN, $tmp) || die "$0: cannot read $tmp: $!\n"; print OUT || die "write failure: $!"; close IN; unlink($tmp);