aboutsummaryrefslogtreecommitdiff
path: root/dwim.pl
blob: 462fdbb5bb913755a38fa0af513d7408cd1068f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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";
}