diff options
author | Ryan Kavanagh <rak@rak.ac> | 2021-12-13 17:10:42 -0500 |
---|---|---|
committer | Ryan Kavanagh <rak@rak.ac> | 2021-12-13 17:10:42 -0500 |
commit | 9e32e3aaef465a532c7c5432c0176fef6f415f25 (patch) | |
tree | a5ed46a654d3d57cab3642a0c1ba83ad3f325880 | |
parent | more moves (diff) |
urxvt cleanup
Diffstat (limited to '')
-rw-r--r-- | .urxvt/blc | 36 | ||||
-rw-r--r-- | .urxvt/mark-and-yank | 653 | ||||
-rw-r--r-- | .urxvt/mark-yank-urls | 301 | ||||
-rw-r--r-- | dot_Xresources | 1 |
4 files changed, 0 insertions, 991 deletions
diff --git a/.urxvt/blc b/.urxvt/blc deleted file mode 100644 index 6833ca2..0000000 --- a/.urxvt/blc +++ /dev/null @@ -1,36 +0,0 @@ -#! perl - -# Optional Bell Command for http://bugs.debian.org/633989 -# Copyright (C) 2011 Ryan Kavanagh <ryanakca@kubuntu.org> -# -# Permission to use, copy, modify, and/or distribute this software for -# any purpose with or without fee is hereby granted, provided that the -# above copyright notice and this permission notice appear in all -# copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. - -sub on_start { - my ($self) = @_; - - $self->{command} = $self->x_resource("bellCommand") || - "false"; - - () -} - -sub on_bell { - my ($self) = @_; - - my @exec = $self->exec_async($self->{command}); - - () -} -# vim:set sw=3 sts=3 et: diff --git a/.urxvt/mark-and-yank b/.urxvt/mark-and-yank deleted file mode 100644 index e888507..0000000 --- a/.urxvt/mark-and-yank +++ /dev/null @@ -1,653 +0,0 @@ -#! perl -# ------------------------------------------------------------------------ -# Author: Bart Trojanowski <bart@jukie.net> -# -# This script intends to provide functionality similar to screen's -# copy-mode, but instead copy to the X clipboard. In order to copy to -# the clipboard we need either the Clipboard.pm from CPAN or the xclip -# command line utility. -# -# More details here: http://www.jukie.net/~bart/blog/tag/urxvt -# -# This script is based on the mark-urls script from the rxvt-unicode -# distribution. -# -# ------------------------------------------------------------------------ -# configuration -# -# Put this in your .Xdefaults -# -# URxvt.keysym.M-y: perl:mark-and-yank:activate_mark_mode -# URxvt.keysym.M-u: perl:mark-and-yank:activate_mark_url_mode -# URxvt.perl-lib: /home/jukie/bart/.urxvt/ -# URxvt.perl-ext: mark-and-yank -# URxvt.urlLauncher: firefox -# -# you might have to edit the perl-lib line. -# -# ------------------------------------------------------------------------ - -use List::Util qw(first max maxstr min minstr reduce shuffle sum); - - -# same url as used in "selection" -my $url_matcher = - qr{( - (?:https?://|ftp://|news://|mailto:|file://)[ab-zA-Z0-9\-\@;\/?:&=%\$_.+!*\x27(),~#]+ - [ab-zA-Z0-9\-\@;\/?:&=%\$_+!*\x27()~] # exclude some trailing characters (heuristic) - )}x; - -sub canonicalise_coordinates { - if ($_[0] > $_[2] || ($_[0] == $_[2] && $_[1] > $_[3])) { - (@_[2,3],@_[0,1]) - } else { - (@_); - } -} - -sub clamp { min( max( $_[0], $_[1] ), $_[2] ) } - -sub on_start { - my ($term) = @_; - - $term->{have_Clipboard} = eval { require Clipboard; }; - if ($term->{have_Clipboard}) { - import Clipboard; - } - - $term->{browser} = $term->x_resource ("urlLauncher") || "x-www-browser"; - - () -} - -sub open_url { - my ($term, $url) = @_; - - $term->exec_async (split(/[[:blank:]]/, $term->{browser}), $url); -} - -sub on_line_update { - my ($term, $row) = @_; - - return unless ($term->x_resource ("underlineURLs") eq "true"); - - # fetch the line that has changed - my $line = $term->line ($row); - my $text = $line->t; - - # find all urls (if any) - while ($text =~ /$url_matcher/g) { - my $rend = $line->r; - - # mark all characters as underlined. we _must_ not toggle underline, - # as we might get called on an already-marked url. - $_ |= urxvt::RS_Uline - for @{$rend}[ $-[1] .. $+[1] - 1]; - - $line->r ($rend); - } - - () -} - -sub on_button_release { - my ($term, $event) = @_; - - my $mask = $term->ModLevel3Mask | $term->ModMetaMask - | urxvt::ShiftMask | urxvt::ControlMask; - - if ($event->{button} == 2 && ($event->{state} & $mask) == 0) { - my $row = $event->{row}; - my $col = $event->{col}; - - my $line = $term->line ($row); - my $text = $line->t; - - while ($text =~ /$url_matcher/g) { - if ($-[1] <= $col && $+[1] >= $col) { - open_url($term, $1); - return 1; - } - } - } - - () -} - -# ------------------------------------------------------------------------ - -my %key2mod = ( - 65505 => urxvt::ShiftMask, - 65507 => urxvt::ControlMask, - 65513 => urxvt::Mod1Mask, # Alt - 65514 => urxvt::Mod1Mask, # Alt - 65515 => urxvt::Mod4Mask, # Super - 65516 => urxvt::Mod4Mask, # Super -); -my $mod = 0; - -#my %mod = ( 'control' => 0, 'shift' => 0 ); - -my $mark_mode_active = 0; -my @backup_cursor = (); -my @visual_start = (); -my $visual_mode = 0; # 'v', 'V', or '^v' -my @cursor = (); -my $url_selected = -1; -my @url_db = (); -my $first_mark_set = 0; -my $msg_timeout = 2; - -# ------------------------------------------------------------------------ - -sub do_scan_for_urls { - my ($term) = @_; - - @url_db = (); - - my $row_start = $term->top_row; - my $row_end = $term->nrow; - - for (my $row=$row_start; $row<=$row_end; $row++) { - - # fetch the line that has changed - my $line = $term->line ($row); - my $text = $line->t; - - # find all urls (if any) - while ($text =~ /$url_matcher/g) { - my $url = $1; - - my %h = ( 'row' => $row, - 'col_from' => $-[1], - 'col_to' => $+[1] - 1, - 'url' => $url); - push @url_db, \%h; - } - } - - # 0 for none, positive count otherwise - return $#url_db + 1; -} - -sub status_message { - my ($self, $text, $timeout) = @_; - $timeout = $msg_timeout unless defined $timeout; - $self->{msg} = { - ov => $self->overlay (0, -1, length($text)+1, 1, urxvt::OVERLAY_RSTYLE, 1), - to => urxvt::timer - ->new - ->start (urxvt::NOW + $timeout) - ->cb (sub { - delete $self->{msg}; - }), - }; - $self->{msg}{ov}->set(0,0,$text); -} - -sub on_user_command { - my ($term, $cmd) = @_; - - if ($cmd eq "mark-and-yank:activate_mark_mode") { - activate_mark_mode($term); - - } elsif ($cmd eq "mark-and-yank:activate_mark_url_mode") { - activate_mark_url_mode($term); - } - - status_message ($term, "urxvt copy mode started"); - - () -} - -# ------------------------------------------------------------------------ - -sub on_key_press { - my ($term, $event, $keysym, $octets) = @_; - - foreach my $key (keys %key2mod) { - if ($keysym == $key) { - $mod |= $key2mod{$key}; - return (); - } - } - - # ignore all input when we are active - $mark_mode_active && return 1; - - () -} - -sub on_key_release { - my ($term, $event, $keysym) = @_; - - foreach my $key (keys %key2mod) { - if ($keysym == $key) { - $mod &= ~$key2mod{$key}; - return (); - } - } - - return () unless ($mark_mode_active); - - my $ch = chr($keysym); - - if ($mod & urxvt::ShiftMask && $ch =~ m/[[:alpha:]]/) { - $ch = uc $ch; - $mod &= ~urxvt::ShiftMask; - } - - if (!$mod && $keysym == 65307) { # <esc> - deactivate_mark_mode ($term); - visual_mode_disable ($term, @cursor); - - } elsif (($mod & urxvt::ControlMask) && $ch eq 'c') {# ^c - abort - deactivate_mark_mode ($term); - visual_mode_disable ($term, @cursor); - - } elsif (!$mod && $keysym == 65293) { # <enter> - if ($first_mark_set) { - do_copy($term, @visual_start, @cursor); - - deactivate_mark_mode ($term); - visual_mode_disable ($term, @cursor); - } else { - my %url = get_active_url($term); - - if (not %url) { - $first_mark_set = 1; - - visual_mode_enable ($term, 'v', @cursor); - } else { - my $urltext = $url{url}; - - $urltext =~ s/\(["|><&()]\)/\\$1/; - open_url($term, $urltext); - - deactivate_mark_mode ($term); - visual_mode_disable ($term, @cursor); - } - } - - } elsif (!$mod && $keysym == 32) { # <space> - if ($first_mark_set) { - do_copy($term, @visual_start, @cursor); - - deactivate_mark_mode ($term); - visual_mode_disable ($term, @cursor); - } else { - - $first_mark_set = 1; - - visual_mode_enable ($term, 'v', @cursor); - } - - } elsif (!$mod && $ch eq 'o') { # o - go to other end of region - if ($first_mark_set) { - my @dest = @visual_start; - @visual_start = @cursor; - @cursor = @dest; - - $term->screen_cur (@dest); - $term->want_refresh; - } - - } elsif (($mod & urxvt::ControlMask) && $ch eq 'w') {# w - copy the word under the cursor - my ($y1, $x1, $y2, $x2) = (@cursor, @cursor); - - --$x1 while substr($term->ROW_t($y1), $x1 - 1, 1) =~ m/\w/; - ++$x2 while substr($term->ROW_t($y2), $x2 + 1, 1) =~ m/\w/; - - do_copy($term, $y1, $x1, $y2, $x2); - - deactivate_mark_mode ($term); - visual_mode_disable ($term, @cursor); - - } elsif ($ch eq 'Y') { # Y - yank from cursor to EOL - do_copy($term, @cursor, $cursor[0], $term->ROW_l($cursor[0]) - $cursor[0]); - - deactivate_mark_mode ($term); - visual_mode_disable ($term, @cursor); - - } elsif (!$mod && $ch eq 'y') { # y - yank selected - my %url = get_active_url ($term); - - do_copy($term, $url{row}, $url{col_from}, $url{row}, $url{col_to}) if %url; - - deactivate_mark_mode ($term); - visual_mode_disable ($term, @cursor); - - } elsif (($mod & urxvt::ControlMask) && (($ch eq 'n') || ($ch eq 'p'))) { - # ^n and ^p to cycle list - my $dir = ($ch eq 'n') ? 1 : -1; - move_url_highlight ($term, $dir); - visual_mode_disable ($term, @cursor); - - } elsif (($mod & urxvt::ControlMask) && (($ch eq 'f') || ($ch eq 'b'))) { - # ^f and ^b to scroll - my $ofs = ($ch eq 'f') ? 1 : -1; - visual_mode_update ($term, \@cursor, [$cursor[0] + $ofs*($term->nrow - 1), $cursor[1]]); - - } elsif (!$mod && $ch eq 'h') { # left - if ($cursor[1] > 0) { - visual_mode_update ($term, \@cursor, [$cursor[0], $cursor[1] - 1]); - } - - } elsif (!$mod && $ch eq 'j') { # down - if ($cursor[0] < $term->nrow) { - visual_mode_update ($term, \@cursor, [$cursor[0] + 1, $cursor[1]]); - } - - } elsif (!$mod && $ch eq 'k') { # up - if ($cursor[0] > $term->top_row) { - visual_mode_update ($term, \@cursor, [$cursor[0] - 1, $cursor[1]]); - } - - } elsif (!$mod && $ch eq 'l') { # right - if ($cursor[1] < ($term->ncol - 1)) { - visual_mode_update ($term, \@cursor, [$cursor[0], $cursor[1] + 1]); - } - - } elsif ($ch eq 'H') { - visual_mode_update ($term, \@cursor, [0, $cursor[1]]); - - } elsif ($ch eq 'M') { - visual_mode_update ($term, \@cursor, [$term->nrow / 2, $cursor[1]]); - - } elsif ($ch eq 'L') { - visual_mode_update ($term, \@cursor, [$term->nrow, $cursor[1]]); - - } elsif ($ch eq '^') { - $term->ROW_t($cursor[0]) =~ m/^\s*/; - visual_mode_update ($term, \@cursor, [$cursor[0], $+[0]]); - - } elsif ($ch eq '0') { - visual_mode_update ($term, \@cursor, [$cursor[0], 0]); - - } elsif ($ch eq '$') { - visual_mode_update ($term, \@cursor, [$cursor[0], $term->ROW_l($cursor[0]) - 1]); - - } elsif ($ch eq 'g') { - visual_mode_update ($term, \@cursor, [$term->top_row, 0]); - - } elsif ($ch eq 'G') { - visual_mode_update ($term, \@cursor, [$term->nrow - 1, $term->ROW_l($term->nrow - 1) - 1]); - - } elsif ($ch eq 'w') { - my @dest = @cursor; - my $line = $term->ROW_t($dest[0]); - ++$dest[1] while substr($line, $dest[1], 1) =~ m/\w/; - until (substr($line, $dest[1], 1) =~ m/\w/) { - ++$dest[1]; - next if $dest[1] <= $term->ROW_l($dest[0]); - ++$dest[0]; - return 1 if $dest[0] >= $term->nrow; - $dest[1] = 0; - $line = $term->ROW_t($dest[0]); - } - - visual_mode_update ($term, \@cursor, \@dest); - - } elsif ($ch eq 'e') { - my @dest = @cursor; - my $line = $term->ROW_t($dest[0]); - ++$dest[1]; - ++$dest[1] while substr($line, $dest[1], 1) =~ m/\W/; - until (substr($line, $dest[1], 1) =~ m/\w/) { - ++$dest[1]; - next if $dest[1] <= $term->ROW_l($dest[0]); - ++$dest[0]; - return 1 if $dest[0] >= $term->nrow; - $dest[1] = 0; - $line = $term->ROW_t($dest[0]); - } - ++$dest[1] while substr($line, $dest[1] + 1, 1) =~ m/\w/; - - visual_mode_update ($term, \@cursor, \@dest); - - } elsif ($ch eq 'b') { - my @dest = @cursor; - my $line = $term->ROW_t($dest[0]); - # unless at the beginning of a word, jump to the beginning - --$dest[1] while ($dest[1] >= 1 && substr($line, $dest[1] - 1, 1) =~ m/\w/); - if ($dest[1] == $cursor[1]) { # at beginning of a word - # skip non-word characters - until ($dest[1] >= 1 && substr($line, $dest[1] - 1, 1) =~ m/\w/) { - --$dest[1]; - next if $dest[1] > 0; - --$dest[0]; - return 1 if $dest[0] < 0; - $dest[1] = $term->ROW_l($dest[0]); - $line = $term->ROW_t($dest[0]); - } - --$dest[1] while $dest[1] >= 1 && substr($line, $dest[1] - 1, 1) =~ m/\w/; - } - - visual_mode_update ($term, \@cursor, \@dest); - - } elsif ($ch eq 'W') { - my @dest = @cursor; - my $line = $term->ROW_t($dest[0]); - ++$dest[1] while substr($line, $dest[1], 1) =~ m/\S/; - until (substr($line, $dest[1], 1) =~ m/\S/) { - ++$dest[1]; - next if $dest[1] <= $term->ROW_l($dest[0]); - ++$dest[0]; - return 1 if $dest[0] >= $term->nrow; - $dest[1] = 0; - $line = $term->ROW_t($dest[0]); - } - - visual_mode_update ($term, \@cursor, \@dest); - - } elsif ($ch eq 'E') { - my @dest = @cursor; - my $line = $term->ROW_t($dest[0]); - ++$dest[1]; - ++$dest[1] while substr($line, $dest[1], 1) =~ m/\s/; - until (substr($line, $dest[1], 1) =~ m/\S/) { - ++$dest[1]; - next if $dest[1] <= $term->ROW_l($dest[0]); - ++$dest[0]; - return 1 if $dest[0] >= $term->nrow; - $dest[1] = 0; - $line = $term->ROW_t($dest[0]); - } - ++$dest[1] while substr($line, $dest[1] + 1, 1) =~ m/\S/; - - visual_mode_update ($term, \@cursor, \@dest); - - } elsif ($ch eq 'B') { - my @dest = @cursor; - my $line = $term->ROW_t($dest[0]); - --$dest[1] while ($dest[1] >= 1 && substr($line, $dest[1] - 1, 1) =~ m/\S/); - until ($dest[1] >= 1 && substr($line, $dest[1] - 1, 1) =~ m/\S/) { - --$dest[1]; - next if $dest[1] > 0; - --$dest[0]; - return 1 if $dest[0] < 0; - $dest[1] = $term->ROW_l($dest[0]); - $line = $term->ROW_t($dest[0]); - } - --$dest[1] while $dest[1] >= 1 && substr($line, $dest[1] - 1, 1) =~ m/\S/; - - visual_mode_update ($term, \@cursor, \@dest); - } - - return 1; -} - -# ------------------------------------------------------------------------ - -sub get_active_url { - my ($term) = @_; - my $max = $#url_db + 1; - - return if $url_selected < 0 || $url_selected >= $max; - return if not defined $url_db[$url_selected]; - - return %{$url_db[$url_selected]}; -} - -sub do_copy { - my $term = shift; - - my ($y1, $x1, $y2, $x2) = canonicalise_coordinates(@_); - - $term->selection_beg($y1, $x1); - $term->selection_end($y2, 1 + $x2); - $term->selection_make(urxvt::CurrentTime); - - my $text = $term->selection(); - - if ($term->{have_Clipboard}) { - Clipboard->copy($text); - } else { - my $pid = open(XCLIP, "|xclip -i"); - print XCLIP $text; - close(XCLIP) - } - - status_message ($term, "copied ".length($text)." characters into clipboard"); -} - -# ------------------------------------------------------------------------ - -sub move_url_highlight { - my ($term, $dir) = @_; - my $max = $#url_db + 1; - - do_highlight ($term, 0); - - $url_selected = ($max + $url_selected + $dir) % $max; - - do_highlight ($term, 1); - - $term->want_refresh; -} - -sub do_highlight { - my ($term, $enable) = @_; - my $max = $#url_db + 1; - - return if $url_selected < 0 || $url_selected >= $max; - return if not defined $url_db[$url_selected]; - - my $o = $url_db[$url_selected]; - my %h = %$o; - - my $row = $h{row}; - my $line = $term->line ($row); - my $text = $line->t; - my $rend = $line->r; - - if ($enable) { - $_ |= urxvt::RS_RVid - for @{$rend}[ $h{col_from} .. $h{col_to}]; - - # make it visible - $term->view_start ( $row < 0 ? $row : 0 ); - - } else { - $_ &= ~urxvt::RS_RVid - for @{$rend}[ $h{col_from} .. $h{col_to}]; - } - - $line->r ($rend); -} - -# ------------------------------------------------------------------------ - -sub visual_mode_enable { - my ($term, $mode, @cur) = @_; - - $visual_mode = $mode; - @visual_start = @cur; -} - -sub visual_mode_disable { - my ($term, @cursor) = @_; - - if ($visual_mode) { - $term->scr_xor_span(canonicalise_coordinates(@visual_start, @cursor)); - - $visual_mode = 0; - - $term->want_refresh; - } -} - -sub visual_mode_update { - my ($term, $oldref, $newref) = @_; - my @old = @$oldref; - my @new = @$newref; - - @cursor = @new; - - $cursor[0] = clamp $term->top_row, $cursor[0], $term->nrow - 1; - - if ($visual_mode eq 'v') { - $term->scr_xor_span(canonicalise_coordinates(@old, @new)); - } - - $term->screen_cur (@cursor); - - $term->view_start (clamp $cursor[0] - $term->nrow + 1, - $term->view_start, - min 0, $cursor[0]); - - $term->want_refresh; -} - -# ------------------------------------------------------------------------ - -sub activate_mark_mode { - my ($term) = @_; - - print "title: " . ($term->resource("title")) . "\n"; - print "name: " . ($term->resource("name")) . "\n"; - print "term_name: " . ($term->resource("term_name")) . "\n"; - print "color: " . ($term->resource("color")) . "\n"; - - my ($row, $col) = $term->screen_cur; - print "cursor: $row / $col \n"; - - $mark_mode_active = 1; - @backup_cursor = @cursor = $term->screen_cur; -} - -sub activate_mark_url_mode { - my ($term) = @_; - - if ($mark_mode_active) { - - move_url_highlight ($term, -1); - - } elsif ( do_scan_for_urls ($term) ) { - - $term->{save_view_start} = $term->view_start; - - move_url_highlight ($term, 0); - - if ($url_selected > -1) { - $mark_mode_active = 1; - @backup_cursor = @cursor = $term->screen_cur; - } - } -} - -sub deactivate_mark_mode { - my ($term) = @_; - - do_highlight ($term, 0); - - $mark_mode_active = 0; - $term->screen_cur (@backup_cursor); - $first_mark_set = 0; - $url_selected = -1; - - $term->view_start ($term->{save_view_start}); - $term->want_refresh; -} - -# vim: set et ts=4 sw=4: diff --git a/.urxvt/mark-yank-urls b/.urxvt/mark-yank-urls deleted file mode 100644 index 831f95e..0000000 --- a/.urxvt/mark-yank-urls +++ /dev/null @@ -1,301 +0,0 @@ -#!/usr/bin/perl -# Author: Bart Trojanowski <bart@jukie.net> -# Website: http://www.jukie.net/~bart/blog/urxvt-url-yank -# License: GPLv2 - -use strict; -use warnings; - -my $url_matcher = qr{( - (?:https?://|ftp://|news://|mailto:|file://|www\.)[ab-zA-Z0-9\-\@;\/?:&=%\$_.+!*\x27(),~#]+ - [ab-zA-Z0-9\-\@;\/?&=%\$_+!*\x27()~] # exclude some trailing characters (heuristic) -)}x; - - -sub on_start { - my ($term) = @_; - - $term->{have_Clipboard} = eval { require Clipboard; }; - if ($term->{have_Clipboard}) { - import Clipboard; - } - - eval { require Regexp::Common::URI }; - if(!$@) { - require Regexp::Common; - Regexp::Common->import('URI'); - - $url_matcher = $Regexp::Common::RE{URI}{HTTP}; - } - - $term->{browser} = $term->x_resource ("urlLauncher") || "x-www-browser"; - - () -} - -sub on_line_update { - my ($term, $row) = @_; - - # Fetch the line that has changed. - my $line = $term->line($row); - my $text = $line->t; - - # Find and underline URLs. - while ($text =~ /($url_matcher)/g) { - my $url = $1; - my $rend = $line->r; - - # Mark all characters as underlined. we _must_ not toggle underline, as - # we might get called on an already-marked URL. - my $underlineURLs = $term->x_resource ('underlineURLs') || 'false'; - if($underlineURLs eq 'true') { - my ($first, $last) = ($-[1], $+[1] - 1); - - --$last if $url =~ s/["']$//; - - $_ |= urxvt::RS_Uline for @{$rend}[$first .. $last]; - - $line->r($rend); - } - } - - () -} - -sub on_button_release { - my ($term, $event) = @_; - - my $mask = $term->ModLevel3Mask | $term->ModMetaMask - | urxvt::ShiftMask | urxvt::ControlMask; - - if ($event->{button} == 2 && ($event->{state} & $mask) == 0) { - my $row = $event->{row}; - my $col = $event->{col}; - - my $line = $term->line ($row); - my $text = $line->t; - - while ($text =~ /($url_matcher)/g) { - my ($url, $first, $last) = ($1, $-[1], $+[1]); - - if($first <= $col && $last >= $col) { - $url =~ s/["']$//; - $term->exec_async($term->{browser}, $url); - return 1; - } - } - } - - () -} - - -my $mark_mode_active = 0; -my %mod = ( 'control' => 0, 'shift' => 0 ); -my $url_selected = -1; -my @url_db = (); - - -sub do_scan_for_urls { - my ($term) = @_; - - @url_db = (); - - my $row_start = $term->top_row; - my $row_end = $term->nrow; - - for my $row ($row_start .. $row_end) { - - # Fetch the line that has changed. - my $line = $term->line ($row); - my $text = $line->t; - - # Find all urls (if any). - while ($text =~ /($url_matcher)/g) { - my $rend = $line->r; - - my ($url, $first, $last) = ($1, $-[1], $+[1] - 1); - - --$last if $url =~ s/["']$//; - - my %h = ( - row => $row, - col_from => $first, - col_to => $last, - url => $url, - ); - - push @url_db, \%h; - } - } - - # 0 for none, positive count otherwise - return $#url_db + 1; -} - - -sub on_user_command { - my ($term, $cmd) = @_; - - activate_mark_mode($term) if $cmd eq 'mark-yank-urls:activate_mark_mode'; - - () -} - -sub on_key_press { - my ($term, $event, $keysym, $octets) = @_; - - if ($keysym == 65507) { # <control> - $mod{control} = 1; - - } elsif ($keysym == 65505) { # <shift> - $mod{shift} = 1; - - } - - # Ignore all input when we are active. - $mark_mode_active && return 1; - - () -} - -sub on_key_release { - my ($term, $event, $keysym, $octets) = @_; - - if ($mark_mode_active) { - my $ch = chr($keysym); - - if ($keysym == 65307) { # <esc> - deactivate_mark_mode ($term); - return 1; - - } elsif ($keysym == 65293) { # <enter> - my $url = get_active_url($term); - $term->exec_async($term->{browser}, $url); - deactivate_mark_mode ($term); - return 1; - - } elsif ($keysym == 65507) { # <control> - $mod{control} = 0; - return 1; - - } elsif ($keysym == 65505) { # <shift> - $mod{shift} = 0; - return 1; - - } elsif ($mod{control} && (($ch eq 'n') || ($ch eq 'p'))) { - # ^n and ^p to cycle list - my $dir = ($ch eq 'n') ? 1 : -1; - move_highlight ($term, $dir); - - } elsif ($ch eq 'y') { # y - do_copy ($term); - deactivate_mark_mode ($term); - return 1; - - } - - return 1; - } - - () -} - -sub get_active_url { - my ($term) = @_; - my $max = $#url_db + 1; - - return if $url_selected < 0 || $url_selected >= $max; - return if not defined $url_db[$url_selected]; - my $o = $url_db[$url_selected]; - my %h = %$o; - - return $h{url}; -} - -sub do_copy { - my ($term) = @_; - - my $text = get_active_url ($term); - - if ($term->{have_Clipboard}) { - Clipboard->copy($text); - } else { - $text =~ s/\(["|><&()]\)/\\$1/; - system ("echo -n \"$text\" | xclip -i"); - } -} - -sub move_highlight { - my ($term, $dir) = @_; - my $max = $#url_db + 1; - - do_highlight ($term, 0); - - $url_selected = ($max + $url_selected + $dir) % $max; - - do_highlight ($term, 1); - - $term->want_refresh; -} - -sub do_highlight { - my ($term, $enable) = @_; - my $max = $#url_db + 1; - - return if $url_selected < 0 || $url_selected >= $max; - return if not defined $url_db[$url_selected]; - - my $o = $url_db[$url_selected]; - my %h = %$o; - - my $row = $h{row}; - my $line = $term->line ($row); - my $text = $line->t; - my $rend = $line->r; - - if ($enable) { - $_ |= urxvt::RS_RVid - for @{$rend}[ $h{col_from} .. $h{col_to}]; - - # make it visible - $term->view_start ( $row < 0 ? $row : 0 ); - - } else { - $_ &= ~urxvt::RS_RVid - for @{$rend}[ $h{col_from} .. $h{col_to}]; - } - - $line->r ($rend); -} - -sub activate_mark_mode { - my ($term) = @_; - - if ($mark_mode_active) { - - move_highlight ($term, -1); - - } elsif ( do_scan_for_urls ($term) ) { - - $term->{save_view_start} = $term->view_start; - - move_highlight ($term, 0); - - $mark_mode_active=1 if ($url_selected > -1); - } -} - -sub deactivate_mark_mode { - my ($term) = @_; - - do_highlight ($term, 0); - - $mark_mode_active = 0; - $url_selected = -1; - - $term->view_start ($term->{save_view_start}); - $term->want_refresh; -} - -# vim: set et ts=4 sw=4: diff --git a/dot_Xresources b/dot_Xresources index 5173526..51f9e07 100644 --- a/dot_Xresources +++ b/dot_Xresources @@ -15,7 +15,6 @@ URxvt.underlineColor: yellow URxvt.saveLines: 8192 URxvt.mapAlert: true URxvt.font: xft:Inconsolata:size=7,xft:Input Mono Medium:size=7,xft:DejaVu Sans Mono:size=7,xft:Liberation Mono:size=7,xft:symbola:size=10:minspace=False -URxvt.perl-lib: /home/ryan/.urxvt URxvt.perl-ext-common: default,matcher,font-size,-searchable-scrollback URxvt.url-launcher: firefox URxvt.matcher.button: 1 |