diff options
Diffstat (limited to 'dwim.pl')
-rwxr-xr-x | dwim.pl | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -0,0 +1,68 @@ +#!/usr/bin/perl + +# dwim (do what i mean) is my own plan9-like plumber + +use v5.24; +use warnings; +use strict; +use Path::ExpandTilde; + +die "usage: $0 phrase\n" if scalar @ARGV > 1; +my $p; +$p = $ARGV[0] if defined $ARGV[0]; +$p = `xsel -o` if not defined $ARGV[0]; + +our $OPENER = $ENV{OPENER}; +our $EDITOR = $ENV{EDITOR}; +our $MAILER = $ENV{MAILER}; +our $MAILROOT = $ENV{MAILROOT}; +$OPENER = "u" if not defined $OPENER; +$EDITOR = "vi" if not defined $EDITOR; +$MAILER = "mutt" if not defined $MAILER; +$MAILROOT = "/home/john/mail/" if not defined $MAILROOT; + +for ($p) { + # web address + if (/^(https?:\/\/.+)$/) { + exec "firefox", "$1" + } + + # e-mail address + if (/^(mailto:\/\/.+)$/ or /^(.+@.+\.\w+)$/) { + exec $MAILER, "$1" + } + + # file:line + if (/^(.+):(\d+)(:.*?)?$/) { + my $f = path($1); + exec $OPENER, $EDITOR, "-c", ":$2", "$f" + } + + # file:query (if file exists) + if (/^(.+):(.+)$/) { + my $f = path($1); + exec $OPENER, $EDITOR, "-c", "/$2", "$f" if -e $f; + # otherwise fall through + } + + # maildir (if it matches) or file (if it exists) + if (/^([^\s]+)$/) { + my $f = path($1); + exec $OPENER, $MAILER, "-f", "$f" if $f =~ /^$MAILROOT/; # maildir + exec $OPENER, $EDITOR, "$f" if -e $f; #file + # otherwise fall through + } + + # otherwise + die "no handler matched by: $p\n" +} + +sub path { + my $f = shift; + $f = expand_tilde($f); + return $f if $f =~ /^\// or $f =~ /^~/; + my $t = `xtitle`; + chomp $t; + die "couldn't retrieve directory\n" if ! -d $t and ! -d ($t = dirname $t); + return "$t/$f"; +} |