ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/selection
(Generate patch)

Comparing rxvt-unicode/src/perl/selection (file contents):
Revision 1.52 by root, Sat Dec 26 10:50:46 2009 UTC vs.
Revision 1.61 by sf-exg, Mon Jun 9 19:54:26 2014 UTC

1#! perl 1#! perl
2
3#:META:RESOURCE:%.pattern-0:string:first selection pattern
4
5=head1 NAME
6
7selection - more intelligent selection (enabled by default)
8
9=head1 DESCRIPTION
10
11This extension tries to be more intelligent when the user extends
12selections (double-click and further clicks). Right now, it tries to
13select words, urls and complete shell-quoted arguments, which is very
14convenient, too, if your F<ls> supports C<--quoting-style=shell>.
15
16A double-click usually selects the word under the cursor, further clicks
17will enlarge the selection.
18
19The selection works by trying to match a number of regexes and displaying
20them in increasing order of length. You can add your own regexes by
21specifying resources of the form:
22
23 URxvt.selection.pattern-0: perl-regex
24 URxvt.selection.pattern-1: perl-regex
25 ...
26
27The index number (0, 1...) must not have any holes, and each regex must
28contain at least one pair of capturing parentheses, which will be used for
29the match. For example, the following adds a regex that matches everything
30between two vertical bars:
31
32 URxvt.selection.pattern-0: \\|([^|]+)\\|
33
34Another example: Programs I use often output "absolute path: " at the
35beginning of a line when they process multiple files. The following
36pattern matches the filename (note, there is a single space at the very
37end):
38
39 URxvt.selection.pattern-0: ^(/[^:]+):\
40
41You can look at the source of the selection extension to see more
42interesting uses, such as parsing a line from beginning to end.
43
44This extension also offers the following actions:
45
46=over 4
47
48=item rot13
49
50Rot-13 the selection when activated.
51
52Example:
53
54 URxvt.keysym.C-M-r: selection:rot13
55
56=back
57
58=cut
2 59
3sub on_user_command { 60sub on_user_command {
4 my ($self, $cmd) = @_; 61 my ($self, $cmd) = @_;
5 62
6 $cmd eq "selection:rot13" 63 $cmd eq "selection:rot13"
64 and $self->selection (map { y/A-Za-z/N-ZA-Mn-za-m/; $_ } $self->selection);
65
66 ()
67}
68
69sub on_action {
70 my ($self, $action) = @_;
71
72 $action eq "rot13"
7 and $self->selection (map { y/A-Za-z/N-ZA-Mn-za-m/; $_ } $self->selection); 73 and $self->selection (map { y/A-Za-z/N-ZA-Mn-za-m/; $_ } $self->selection);
8 74
9 () 75 ()
10} 76}
11 77
17 push @{ $self->{patterns} }, qr{\G [\Q$res\E[:space:]]* ([^\Q$res\E[:space:]]+) }x; 83 push @{ $self->{patterns} }, qr{\G [\Q$res\E[:space:]]* ([^\Q$res\E[:space:]]+) }x;
18 } 84 }
19 85
20 for (my $idx = 0; defined (my $res = $self->x_resource ("selection.pattern-$idx")); $idx++) { 86 for (my $idx = 0; defined (my $res = $self->x_resource ("selection.pattern-$idx")); $idx++) {
21 $res = $self->locale_decode ($res); 87 $res = $self->locale_decode ($res);
22 utf8::encode $res;
23 push @{ $self->{patterns} }, qr/$res/; 88 push @{ $self->{patterns} }, qr/$res/;
24 } 89 }
25 90
26 $self->{enabled} = 1; 91 $self->{enabled} = 1;
27 92
91 - $line->offset_of ($self->selection_beg); 156 - $line->offset_of ($self->selection_beg);
92 157
93 my @matches; 158 my @matches;
94 159
95 if ($markofs < $line->l) { 160 if ($markofs < $line->l) {
96 # convert markofs from character to UTF-8 offset space
97 {
98 my $prefix = substr $text, 0, $markofs;
99 utf8::encode $prefix;
100 $markofs = length $prefix;
101 }
102
103 # not doing matches in unicode mode helps speed
104 # enourmously here. working in utf-8 should be
105 # equivalent due to the magic of utf-8 encoding.
106 utf8::encode $text;
107 study $text; # _really_ helps, too :) 161 study $text; # _really_ helps, too :)
108 162
109 for my $regex (@mark_patterns, @{ $self->{patterns} }) { 163 for my $regex (@mark_patterns, @{ $self->{patterns} }) {
110 while ($text =~ /$regex/g) { 164 while ($text =~ /$regex/g) {
111 if ($-[1] <= $markofs and $markofs <= $+[1]) { 165 if ($-[1] <= $markofs and $markofs <= $+[1]) {
131 for (sort { $a->[1] <=> $b->[1] or $b->[0] <=> $a->[0] } @matches) { 185 for (sort { $a->[1] <=> $b->[1] or $b->[0] <=> $a->[0] } @matches) {
132 my ($ofs, $len) = @$_; 186 my ($ofs, $len) = @$_;
133 187
134 next if $len <= $curlen; 188 next if $len <= $curlen;
135 189
136 # convert back from UTF-8 offset space to character space
137 {
138 my $length = substr "$text ", $ofs, $len;
139 utf8::decode $length;
140 $len = length $length;
141 }
142 {
143 my $prefix = substr $text, 0, $ofs;
144 utf8::decode $prefix;
145 $ofs = length $prefix;
146 }
147
148 $self->selection_beg ($line->coord_of ($ofs)); 190 $self->selection_beg ($line->coord_of ($ofs));
149 $self->selection_end ($line->coord_of ($ofs + $len)); 191 $self->selection_end ($line->coord_of ($ofs + $len));
150 return 1; 192 return 1;
151 } 193 }
152 194

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines