--- rxvt-unicode/src/perl/selection 2006/01/03 21:08:39 1.9 +++ rxvt-unicode/src/perl/selection 2006/01/08 01:30:32 1.15 @@ -9,19 +9,30 @@ () } -my @patterns = ( - # urls - qr{ ([a-z0-9.+\-]+://[ab-zA-Z0-9\-\@;\/?:&=%\$_.+!*\x27(),]+) }x, +my @mark_patterns = ( + # urls, just a heuristic + qr{( + (?:https?|ftp|news|mailto|file)://[ab-zA-Z0-9\-\@;\/?:&=%\$_.+!*\x27(),~]+ + [ab-zA-Z0-9\-\@;\/?:&=%\$_+!*\x27(),~] # do not include a trailing dot, its wrong too often + )}x, + + # common forms of quoting + qr{(?:^|\s) [‘`] ([^‘`’']+) [’'] (?:\s|$)}x, # shell-like argument quoting - qr{\G\s*( + qr{\G [\ \t|&;<>()] *( (?: - [^"'\\ \t]+ + [^\\"'\ \t|&;<>()]+ | \\. - | " ([^\\"]+ | \\. )* " + | " (?: [^\\"]+ | \\. )* " | ' [^']* ' )+ - )}xs, + )}x, +); + +my @simplify_patterns = ( + qr{^"([^\\"'\ \t|&;<>()*?]+)"$}, # "simple" => simple + qr{^(.*)[,\-]$}, ); sub on_sel_extend { @@ -32,11 +43,22 @@ my $offset = $line->offset_of ($row, $col); my $text = $line->t; - for my $regex (@patterns) { + for my $regex (@mark_patterns) { while ($text =~ /$regex/g) { if ($-[1] <= $offset and $offset <= $+[1]) { - $self->selection_beg ($line->coord_of ($-[1])); - $self->selection_end ($line->coord_of ($+[1])); + my $match = $1; + my ($ofs1, $ofs2) = ($-[1], $+[1]); + + for my $regex (@simplify_patterns) { + if ($match =~ $regex) { + $match = $1; + $ofs1 += $-[1]; + $ofs2 = $ofs1 + length $match; + } + } + + $self->selection_beg ($line->coord_of ($ofs1)); + $self->selection_end ($line->coord_of ($ofs2)); return 1; } }