aboutsummaryrefslogtreecommitdiff
path: root/dwim
diff options
context:
space:
mode:
Diffstat (limited to 'dwim')
-rwxr-xr-xdwim146
1 files changed, 61 insertions, 85 deletions
diff --git a/dwim b/dwim
index d5c8646..a9b56df 100755
--- a/dwim
+++ b/dwim
@@ -5,71 +5,79 @@
use v5.24;
use warnings;
use strict;
-use Path::ExpandTilde;
use subs qw/path env handle fail run arguments/;
-my ($phrase, %o) = arguments "usage: $0 parse\n", 1, d => 0;
-$phrase = `xsel -o` if not defined $phrase;
+my ($DEBUG, $handler, $phrase);
-my @OPENER = ("xtopen");
-my @EDITOR = (@OPENER, "vi");
-my @PDF_VIEWER = ("xpdf");
-my @MAN_VIEWER = (@OPENER, "man");
-my @MAILER = (@OPENER, "mutt");
-my @BROWSER = (@OPENER, "w3m -title");
-my @FILE_BROWSER = (@OPENER, "noice");
-my @MAILDIR_VIEWER = (@OPENER, "mutt -f");
-my $MAILROOT = env MAILROOT => "/home/john/mail/";
+while ($_ = shift @ARGV) {
+ if (/^-d$/) {
+ $DEBUG = 1;
+ } elsif (/^-/) {
+ die "usage: $0 [-d] [phrase]\n";
+ } else {
+ $phrase = $_;
+ }
+}
+
+$phrase = `xsel -o` if not defined $phrase;
-our $handler;
+my @OPENER = ('xtopen');
+my @EDITOR = (@OPENER, 'vi');
+my @PDF_VIEWER = ('xpdf');
+my @MAN_VIEWER = (@OPENER, 'man');
+my @MAILER = (@OPENER, 'mutt');
+my @BROWSER = (@OPENER, 'w3m -title');
+my @FILE_BROWSER = (@OPENER, 'noice');
+my @MAILDIR_VIEWER = (@OPENER, 'mutt -f');
+my $MAILROOT = env MAILROOT => '/home/john/mail/';
for ($phrase) {
if (/^(https?:\/?\/?\S+)$/) {
- handle "web address";
- run @BROWSER, "$1"
+ handle 'web address';
+ run @BROWSER, $1
}
if (/^(mailto:\S+)$/ or /^(\S+@.+\.\w+)$/) {
- handle "e-mail address";
- run @MAILER, "$1"
+ handle 'e-mail address';
+ run @MAILER, $1
}
if (/^(.+?):(\d+).*?$/) {
- handle "file:line (like grep -n)";
+ handle 'file:line (like grep -n)';
my $p = path $1;
- run @EDITOR, "+$2", "$p"
+ run @EDITOR, "+$2", $p
}
if (/^(.+) line (\d+)\.?$/) {
- handle "FILE line LINE (like perl)";
+ handle 'FILE line LINE (like perl)';
my $p = path $1;
- run @EDITOR, "+$2", "$p"
+ run @EDITOR, "+$2", $p
}
if (/^(.+):(.+)$/) {
- handle "file:query (like grep)";
+ handle 'file:query (like grep)';
my $p = path $1;
- run @EDITOR, "+/$2", "$p" if -e $p;
- fail "file not found" if $o{d};
+ run @EDITOR, "+/$2", $p if -e $p;
+ fail 'file not found' if $DEBUG;
# otherwise fall through
}
- if (/^(\S+)\((\S+)\)[,.]?/) {
- handle "manpage(section)";
+ if (/^(\S+)\((\d+)\)[):,.]*$/) {
+ handle 'manual(section)';
run @MAN_VIEWER, $2, $1;
}
- if (/^(\S+)\.([1-9])/) {
- handle "manpage.section";
+ if (/^([A-Za-z]+)\.([1-9])$/) {
+ handle 'manual.section';
my $p = path "$1.$2";
run @MAN_VIEWER, $p if -e $p;
run @MAN_VIEWER, $2, $1;
}
if (/^<(\S+)>$/) {
- handle "<header.h>";
+ handle '<header.h>';
open my $h, 'find / -maxdepth 3 -type d -name include 2>&-|'
- or fail "could not search include directories";
+ or fail 'could not search include directories';
while (<$h>) {
chomp;
if (-e "$_/$1") {
@@ -78,22 +86,17 @@ for ($phrase) {
}
}
close $h;
- fail "header file not found";
- }
-
- if (/^(\S+-[\d.]+_\d+)$/) {
- handle "xbps package";
- run @OPENER, "in-shell", "sudo", "xbps-install", "-S", $1;
+ fail 'header file not found';
}
if (/^(\S+)$/) {
- handle "maildir / directory / file";
+ handle 'maildir / directory / file';
my $p = path $1;
- run @MAILDIR_VIEWER, "$p" if $p =~ /^$MAILROOT/; # maildir
- run @FILE_BROWSER, "$p" if -d $p; # directory
- run @PDF_VIEWER, "$p" if -e $p and $p =~ /\.pdf$/; # pdf
- run @EDITOR, "$p" if -e $p; # file
- fail "file not found" if $o{d};
+ run @MAILDIR_VIEWER, $p if $p =~ /^$MAILROOT/; # maildir
+ run @FILE_BROWSER, $p if -d $p; # directory
+ run @PDF_VIEWER, $p if -e $p and $p =~ /\.pdf$/; # pdf
+ run @EDITOR, $p if -e $p; # file
+ fail 'file not found' if $DEBUG;
# otherwise fall through
}
@@ -103,16 +106,19 @@ for ($phrase) {
sub path {
my $n = shift;
- $n = expand_tilde($n);
+ $n =~ s,^~([^/]+),/home/$1,;
+ $n =~ s,^~,/home/$ENV{USER},;
return $n if $n =~ /^\// or $n =~ /^~/;
- my $d = `xtitle`;
- chomp $d;
- $d =~ s/.*\(([^(]+)\)$/$1/;
- $d =~ s,^~([^/]+),/home/$1,;
- $d =~ s,^~,/home/$ENV{USER},;
- die "couldn't retrieve current directory\n"
- if ! -d $d and ! -d ($d = dirname($d));
- return "$d/$n";
+ for (`xtitle`) {
+ chomp;
+ s/.*\(([^(]+)\)$/$1/;
+ s,^~([^/]+),/home/$1,;
+ s,^~,/home/$ENV{USER},;
+ die "couldn't retrieve current directory\n"
+ if ! -d $_ and ! -d ($_ = dirname($_));
+ return "$_/$n";
+ }
+ die "couldn't retrieve current directory: xtitle not installed\n";
}
# take K => V and return environment variable K if defined, otherwise V
@@ -125,7 +131,7 @@ sub env {
sub handle {
$handler = shift;
- print STDERR "$handler MATCHED\n" if $o{d};
+ print STDERR "$handler MATCHED\n" if $DEBUG;
}
sub fail {
@@ -134,12 +140,13 @@ sub fail {
}
sub run {
- if ($o{d}) {
+ if ($DEBUG) {
my @argv = @_;
s/(\s)/\\$1/g for @argv; # escape whitespace
print STDERR "@argv\n";
}
- exec @_;
+ system "@_ &";
+ exit;
}
sub dirname {
@@ -147,34 +154,3 @@ sub dirname {
$path =~ s,/[^/]+,,;
return $path;
}
-
-# parse ARGV and return list of positionals and hash of option values
-sub arguments {
- my $usage = shift; # usage string
- my $n = shift; # number of positional arguments
- my %options = @_; # option specification
-
- # parse options (end upon --)
-
- while ($_ = shift @ARGV) {
- last if /^--$/;
- unshift @ARGV, $_ and last if not /^-/;
-
- s/^-//;
- if (defined $options{$_}) { $options{$_} = 1 }
- else { die $usage; }
- }
-
- # fill @positionals with $n strings (with undef upon empty ARGV)
-
- my @positionals;
- my $i = 0;
- while (++$i <= $n) {
- if ($_ = shift @ARGV) { push @positionals, $_ }
- else { push @positionals, undef }
- }
-
- die $usage if @ARGV; # all processing should be done
-
- return @positionals, %options;
-}