3 # ----------------------------------------
5 # same url as used in "selection"
8 (?:https?://|ftp://|news://|mailto:|file://)[ab-zA-Z0-9\-\@;\/?:&=%\$_.+!*\x27(),~#]+
9 [ab-zA-Z0-9\-\@;\/?:&=%\$_+!*\x27()~] # exclude some trailing characters (heuristic)
15 $term->{browser} = $term->x_resource ("urlLauncher") || "x-www-browser";
21 my ($term, $row) = @_;
23 # fetch the line that has changed
24 my $line = $term->line ($row);
27 # find all urls (if any)
28 while ($text =~ /$url/g) {
31 # mark all characters as underlined. we _must_ not toggle underline,
32 # as we might get called on an already-marked url.
33 if ($term->x_resource ("underlineURLs") eq "true") {
35 for @{$rend}[ $-[1] .. $+[1] - 1];
44 sub on_button_release {
45 my ($term, $event) = @_;
47 my $mask = $term->ModLevel3Mask | $term->ModMetaMask
48 | urxvt::ShiftMask | urxvt::ControlMask;
50 if ($event->{button} == 2 && ($event->{state} & $mask) == 0) {
51 my $row = $event->{row};
52 my $col = $event->{col};
54 my $line = $term->line ($row);
57 while ($text =~ /$url/g) {
58 if ($-[1] <= $col && $+[1] >= $col) {
59 $term->exec_async ($term->{browser}, $1);
69 # my ($term, $lines, $saved) = @_;
71 # if ($lines > $url_selected && $url_selected>0) {
72 # move_highlight ($term, 1);
75 # for (my $n=0; $n<$lines; $n++) {
82 # ----------------------------------------
84 my $mark_mode_active = 0;
85 my %mod = ( 'control' => 0, 'shift' => 0 );
86 my $url_selected = -1;
89 # ----------------------------------------
91 sub do_scan_for_urls {
96 my $row_start = $term->top_row;
97 my $row_end = $term->nrow;
99 for (my $row=$row_start; $row<=$row_end; $row++) {
101 # fetch the line that has changed
102 my $line = $term->line ($row);
105 # find all urls (if any)
106 while ($text =~ /$url/g) {
109 my %h = ( 'row' => $row,
111 'col_to' => $+[1] - 1,
117 # 0 for none, positive count otherwise
121 sub on_user_command {
122 my ($term, $cmd) = @_;
124 $cmd eq "mark-yank-urls:activate_mark_mode"
125 and activate_mark_mode($term);
131 my ($term, $event, $keysym, $octets) = @_;
133 ($keysym == 65507) && { $mod{control} = 1 };
134 ($keysym == 65505) && { $mod{shift} = 1 };
136 # ignore all input when we are active
137 $mark_mode_active && return 1;
143 my ($term, $event, $keysym, $octets) = @_;
145 if ($mark_mode_active) {
146 my $ch = chr($keysym);
148 if ($keysym == 65307) { # <esc>
149 $mark_mode_active = 0;
150 do_highlight ($term, 0);
155 } elsif ($keysym == 65293) { # <enter>
157 $mark_mode_active = 0;
158 do_highlight ($term, 0);
161 $term->exec_async ($term->{browser} . ' `xclip -o`');
164 } elsif ($keysym == 65507) { # <control>
168 } elsif ($keysym == 65505) { # <shift>
172 } elsif ($mod{control} && (($ch eq 'n') || ($ch eq 'p'))) {
173 # ^n and ^p to cycle list
174 my $dir = ($ch eq 'n') ? 1 : -1;
175 move_highlight ($term, $dir);
177 } elsif ($ch eq 'y') {
179 $mark_mode_active = 0;
180 do_highlight ($term, 0);
195 my $max = $#url_db + 1;
197 return if $url_selected < 0 || $url_selected >= $max;
198 return if not defined $url_db[$url_selected];
199 my $o = $url_db[$url_selected];
202 my $line = $term->line ($url_selected);
203 my $text = substr($line->t, $h{col_from}, $h{col_to} - $h{col_from} + 1);
205 $text =~ s/\(["|><&()]\)/\\$1/;
206 system ("echo -n \"$text\" | xclip -i");
210 my ($term, $dir) = @_;
211 my $max = $#url_db + 1;
213 do_highlight ($term, 0);
215 $url_selected = ($max + $url_selected + $dir) % $max;
217 do_highlight ($term, 1);
223 my ($term, $enable) = @_;
224 my $max = $#url_db + 1;
226 return if $url_selected < 0 || $url_selected >= $max;
227 return if not defined $url_db[$url_selected];
229 my $o = $url_db[$url_selected];
233 my $line = $term->line ($row);
239 for @{$rend}[ $h{col_from} .. $h{col_to}];
242 $term->view_start ( $row < 0 ? $row : 0 );
245 $_ &= ~urxvt::RS_RVid
246 for @{$rend}[ $h{col_from} .. $h{col_to}];
252 sub activate_mark_mode {
253 my ($term, $cmd) = @_;
255 if ($mark_mode_active) {
256 move_highlight ($term, -1);
258 } elsif ( do_scan_for_urls ($term) ) {
259 move_highlight ($term, 0);
260 $mark_mode_active=1 if ($url_selected > -1)
265 # vim: set et ts=4 sw=4: