aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2021-06-08 17:24:24 +0200
committerAnton Khirnov <anton@khirnov.net>2021-06-08 17:24:24 +0200
commitf44da2513c1ae4330ea698e9144fe52f9943ad44 (patch)
treec5272fa37fe04b2c2a855971d96c2478d4071aef
parent72b3fe032d61cd9ad1b1b1fe321803ed547c361b (diff)
Use hints composed of characters, not numbers.
Should be more convenient to type.
-rw-r--r--reselect52
1 files 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 <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;
}
()