Browse Source

Added mkexec.pl

Alois Mahdal 11 years ago
parent
commit
76387f27f2
1 changed files with 75 additions and 0 deletions
  1. 75
    0
      bin/mkexec.pl

+ 75
- 0
bin/mkexec.pl View File

@@ -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
+}