blob: 8cee2b1775c19a3e7e046984a325eebfc8b94ecf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#!/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 <joey@kitenet.net>
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 <STDIN> || die "write temp: $!";
close $fh;
close STDIN;
open(STDIN, "</dev/tty") || die "reopen stdin: $!";
open(OUT, ">&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 <IN> || die "write failure: $!";
close IN;
unlink($tmp);
|