|
@@ -0,0 +1,75 @@
|
|
1
|
+#!/usr/bin/perl
|
|
2
|
+# make an executeble file
|
|
3
|
+
|
|
4
|
+use strict;
|
|
5
|
+use warnings;
|
|
6
|
+
|
|
7
|
+sub usage; sub mkexec; sub guesstype; sub getcmd; sub launch_editor;
|
|
8
|
+
|
|
9
|
+my $DEFAULT_TYPE = 'pl';
|
|
10
|
+my $DEFAULT_MODE = 0755;
|
|
11
|
+
|
|
12
|
+my $name = shift or usage;
|
|
13
|
+my $type = ($ARGV[0] ? shift : guesstype $name);
|
|
14
|
+
|
|
15
|
+my $bang = {
|
|
16
|
+ pl => `which perl`,
|
|
17
|
+ sh => `which sh`,
|
|
18
|
+ py => `which python`,
|
|
19
|
+ bash => `which bash`,
|
|
20
|
+ sed => `which sed`,
|
|
21
|
+ bc => `which bc`
|
|
22
|
+};
|
|
23
|
+
|
|
24
|
+my $editors = [ qw/ vim editor / ];
|
|
25
|
+my $cmds;
|
|
26
|
+$cmds->{vim}->{test} = "vim --version 2>/dev/null";
|
|
27
|
+$cmds->{vim}->{run} = "vim +\"normal G\$\" '%s'";
|
|
28
|
+$cmds->{editor}->{test} = "editor --version 2>/dev/null";
|
|
29
|
+$cmds->{editor}->{run} = "editor '%s'";
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+if (exists $bang->{$type}) {
|
|
33
|
+ mkexec $name, $bang->{$type};
|
|
34
|
+ launch_editor $name;
|
|
35
|
+} else {
|
|
36
|
+ die "unknown type: $type\n";
|
|
37
|
+}
|
|
38
|
+
|
|
39
|
+sub usage {
|
|
40
|
+ print STDERR "usage: $0 filename [type]\n";
|
|
41
|
+ exit 0;
|
|
42
|
+}
|
|
43
|
+
|
|
44
|
+sub guesstype {
|
|
45
|
+ my $name = shift;
|
|
46
|
+ my ($ext) = $name =~ m|\.(\w+)$|;
|
|
47
|
+ return ( $ext ? $ext : $DEFAULT_TYPE);
|
|
48
|
+}
|
|
49
|
+
|
|
50
|
+sub mkexec {
|
|
51
|
+ my ($name, $bang) = @_;
|
|
52
|
+ open EXE, ">", $name || die "cannot open $name for writing: $!\n";
|
|
53
|
+ -W EXE || die "file $name is not writable\n";
|
|
54
|
+ print EXE "#!$bang\n";
|
|
55
|
+ close EXE || die "cannot close $name: $!\n";
|
|
56
|
+ chmod $DEFAULT_MODE, $name;
|
|
57
|
+}
|
|
58
|
+
|
|
59
|
+sub get_cmd {
|
|
60
|
+ foreach (@$editors) {
|
|
61
|
+ return $cmds->{$_}->{run} if `$cmds->{$_}->{test}`
|
|
62
|
+ }
|
|
63
|
+ warn "no supported editor available\n";
|
|
64
|
+ return;
|
|
65
|
+}
|
|
66
|
+
|
|
67
|
+sub launch_editor {
|
|
68
|
+ my $name = shift;
|
|
69
|
+ my $form = get_cmd;
|
|
70
|
+ if ($form) {
|
|
71
|
+ my $command = sprintf get_cmd, $name;
|
|
72
|
+ exec "$command";
|
|
73
|
+ } else { return }
|
|
74
|
+ warn "failed to launch editor: $form\n";
|
|
75
|
+}
|