From f44da2513c1ae4330ea698e9144fe52f9943ad44 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 8 Jun 2021 17:24:24 +0200 Subject: Use hints composed of characters, not numbers. Should be more convenient to type. --- reselect | 52 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/reselect b/reselect index bd73906..081a44f 100644 --- a/reselect +++ b/reselect @@ -2,6 +2,8 @@ # Author: Chip Camden +my @hintchars = split //,'hjklasdfgyuiopqwertnmzxcvb'; + my $re_url = qr{ (?:https?://|ftp://|news://|mailto:|file://|\bwww\.) @@ -16,6 +18,30 @@ my $re_git_hash = qr{\b[0-9a-f]{7,40}\b}x; my $re_message_id = qr{<\S+?@\S+?>}x; +sub hint_iterator { + # we map successive integers to hints by successive modulo / divide against + # the number of hint chars + # this makes for simple code, but is not very efficient + # should not matter unless we have thousands of hints + my $state = 0; + return sub { + my $idx = $state; + my @retval; + while (1) { + use integer; + unshift @retval, ($hintchars[$idx % @hintchars]); + if ($idx < @hintchars) { + last; + } + $idx /= @hintchars; + } + + $state++; + + return join '',@retval; + } +} + sub find_matches { my ($pattern, $text, $rowmap) = @_; @@ -47,21 +73,22 @@ sub build_overlays { my ($self, $pattern, $text, $rowmap) = @_; my $label_rend = $self->get_rend("label", urxvt::OVERLAY_RSTYLE); - my $num = 0; my @overlays = find_matches($pattern, $text, $rowmap); @overlays = reverse @overlays if ($self->{descending}); my $results = {}; + my $hints = hint_iterator(); for my $ov (@overlays) { my ($col, $row, $href) = @$ov; - $num++; - my $overlay = $self->overlay($col, $row, $self->strwidth($num), + my $hint = $hints->(); + + my $overlay = $self->overlay($col, $row, $self->strwidth($hint), 1, $label_rend, 0); - $overlay->set(0, 0, $num); + $overlay->set(0, 0, $hint); - $results->{$num} = {label => $overlay, match => $href}; + $results->{$hint} = {label => $overlay, match => $href}; } return $results; @@ -137,25 +164,28 @@ sub on_key_press { } my $p = $self->{url_picker}; if ($p) { - if ($keysym == 0xff1b || $keysym == 113) { # escape or q + my $keyname = $self->XKeysymToString($keysym); + + if ($keyname eq 'Escape') { $self->screen_cur($p->{crow},$p->{ccol}); $self->{url_picker} = (); - } elsif ($keysym == 0xff08) { # backspace + } elsif ($keyname eq 'BackSpace') { if (length($p->{buffer}) > 0) { $p->{buffer} = substr($p->{buffer},0,-1); $self->update($p); } - } elsif (($keysym >= 48) && ($keysym <= 57)) { - $p->{buffer} = $p->{buffer} . ($keysym - 48); - $self->update($p); - } elsif ($keysym == 0xff0d) { # CR + } elsif ($keyname eq 'Return' || $keyname eq 'KP_Enter') { my $num = $p->{buffer}; my $results = $p->{results}; if (exists $results->{$num}) { my $match = $results->{$num}->{match}; $self->launch($match); } + } elsif (grep { $_ eq $keyname } @hintchars) { + $p->{buffer} = $p->{buffer} . $keyname; + $self->update($p); } + return 1; } () -- cgit v1.2.3