aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
l---------dwim1
-rwxr-xr-xdwim.pl68
-rwxr-xr-xdwim.sh39
3 files changed, 69 insertions, 39 deletions
diff --git a/dwim b/dwim
new file mode 120000
index 0000000..06baf07
--- /dev/null
+++ b/dwim
@@ -0,0 +1 @@
+dwim.pl \ No newline at end of file
diff --git a/dwim.pl b/dwim.pl
new file mode 100755
index 0000000..462fdbb
--- /dev/null
+++ b/dwim.pl
@@ -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";
+}
diff --git a/dwim.sh b/dwim.sh
deleted file mode 100755
index 64f7773..0000000
--- a/dwim.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-
-# dwim (do what i mean) is my own plan9-like plumber
-
-err() { echo "$@" 1>&2; exit 1; }
-usage="$0 phrase"
-
-[ $# -gt 1 ] && err "$usage"
-[ $# -eq 1 ] && p=$1 || p=$(xsel -o)
-[ -z "$p" ] && err "$usage"
-
-[ -z "$OPENER" ] && OPENER=u
-
-case "$p" in
-*:*)
- file=${p%%:*}
- line=${p#*:}; line=${line%:}
-
- dir=
- case "$file" in
- /*) ;;
- ~*) ;;
- *)
- dir=$(xtitle)/
- [ ! -d "$dir" ] && err "couldn't retrieve directory"
- ;;
- esac
-
- exec "$OPENER" "$EDITOR" -c ":$line" "$dir$file"
- ;;
-/*)
- exec "$OPENER" "$EDITOR" "${p%:}"
- ;;
-~*)
- exec "$OPENER" "$EDITOR" "${p%:}"
- ;;
-esac
-
-err "no handler matched"