diff options
author | Anton Khirnov <anton@khirnov.net> | 2021-06-08 17:24:24 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2021-06-08 17:24:24 +0200 |
commit | f44da2513c1ae4330ea698e9144fe52f9943ad44 (patch) | |
tree | c5272fa37fe04b2c2a855971d96c2478d4071aef | |
parent | 72b3fe032d61cd9ad1b1b1fe321803ed547c361b (diff) |
Use hints composed of characters, not numbers.
Should be more convenient to type.
-rw-r--r-- | reselect | 52 |
1 files changed, 41 insertions, 11 deletions
@@ -2,6 +2,8 @@ # Author: Chip Camden <sterling@camdensoftware.com> +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; } () |