mkexec.pl 1.7KB

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