digraphs: link to and from altgr keyboards master v1.19
authorMischa POSLAWSKY <perl@shiar.org>
Mon, 20 May 2024 16:27:41 +0000 (18:27 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Tue, 21 May 2024 14:34:27 +0000 (16:34 +0200)
53 files changed:
Makefile
Shiar_Sheet/Keyboard.pm
Shiar_Sheet/KeyboardChars.pm
base.css
common.inc.plp
digraphs.plp
font.plp
index.plp
keyboard.plp
keyboard/altgr/apl.eng.inc.pl
keyboard/altgr/atari.eng.inc.pl [new file with mode: 0644]
keyboard/altgr/c64.eng.inc.pl [new file with mode: 0644]
keyboard/altgr/drix.eng.inc.pl
keyboard/altgr/emojiworks.eng.inc.pl
keyboard/altgr/eurkey.eng.inc.pl
keyboard/altgr/index.inc.pl [new file with mode: 0644]
keyboard/altgr/index.inc.plp
keyboard/altgr/ipa-rc.eng.inc.pl [new file with mode: 0644]
keyboard/altgr/ipa-ucl.eng.inc.pl [moved from keyboard/altgr/ipa.eng.inc.pl with 98% similarity]
keyboard/altgr/macos-abc.eng.inc.pl
keyboard/altgr/macos-nl.eng.inc.pl [new file with mode: 0644]
keyboard/altgr/macos.eng.inc.pl
keyboard/altgr/msx-graph.eng.inc.pl
keyboard/altgr/msx.eng.inc.pl
keyboard/altgr/olpc.eng.inc.pl
keyboard/altgr/spacecadet.eng.inc.pl
keyboard/altgr/symbolics.eng.inc.pl
keyboard/altgr/ukext.eng.inc.pl
keyboard/altgr/unigraph.eng.inc.pl [new file with mode: 0644]
keyboard/altgr/weur.eng.inc.pl [new file with mode: 0644]
keyboard/altgr/windows.eng.inc.pl
keyboard/altgr/xipa.eng.inc.pl [new file with mode: 0644]
keyboard/altgr/zoo.eng.inc.pl [new file with mode: 0644]
keyboard/less.eng.inc.pl
keyboard/mplayer.eng.inc.pl
keyboard/mpv.eng.inc.pl
keyboard/mutt.eng.inc.pl
keyboard/nethack.eng.inc.pl
keyboard/readline.eng.inc.pl
keyboard/screen.eng.inc.pl
keyboard/vi.eng.inc.pl
keyboard/vimperator.eng.inc.pl
keys.inc.pl
keyspos.inc.pl [new file with mode: 0644]
perl.inc.pl
perl.plp
source.plp
tools/mkdigraphlist
tools/mkdigraphs-xorg
tools/mkkeyboard-xkb-symbols
tools/mksitemap
tools/mkxkbsymbols [new file with mode: 0755]
unicode-table.inc.pl

index df6cbe5bab35d15e5837a61ca3d67c2f711a6e59..7db808b04a03d1577d276026f9d05773b42a08b6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,7 @@ word/put.js: $(download)
 word/%.min.js: word/%.js
        uglifyjs -m '' $< -o $@
 
 word/%.min.js: word/%.js
        uglifyjs -m '' $< -o $@
 
-data: data/digraphs.json data/unicode-cover.inc.pl data/countries.inc.pl data/browser data/termcol-xcolor.inc.pl data/digraphs-xorg.json data/unicode-sampler word
+data: data/digraphs.json data/unicode-cover.inc.pl data/countries.inc.pl data/browser data/termcol-xcolor.inc.pl data/digraphs-xorg.json data/unicode-sampler word keyboard/symbols/unigraph
 
 data/DerivedAge.txt: $(download)
        tools/wget-ifmodified http://www.unicode.org/Public/UNIDATA/$(@F) $@
 
 data/DerivedAge.txt: $(download)
        tools/wget-ifmodified http://www.unicode.org/Public/UNIDATA/$(@F) $@
@@ -56,6 +56,9 @@ data/keysymdef.json: tools/mkxkeysymdef data/keysymdef.h
 data/digraphs-xorg.json: tools/mkdigraphs-xorg data/xorg-compose data/keysymdef.json
        $(call cmdsave,$^)
 
 data/digraphs-xorg.json: tools/mkdigraphs-xorg data/xorg-compose data/keysymdef.json
        $(call cmdsave,$^)
 
+keyboard/symbols/%: tools/mkxkbsymbols data/keyboard/altgr/%.eng.json
+       $(call cmdsave,$^)
+
 data/digraphs-vim.inc.pl: tools/mkdigraphs-vim
        $(call cmdsave,$<)
 
 data/digraphs-vim.inc.pl: tools/mkdigraphs-vim
        $(call cmdsave,$<)
 
index c7e455b353616b10d7780c963c02c618cfba8e20..4d1c54eba23fb71f309ace67ecfa14572feeb19d 100644 (file)
@@ -6,7 +6,7 @@ use warnings;
 no  warnings 'uninitialized';  # save some useless checks for more legible code
 use Carp;
 
 no  warnings 'uninitialized';  # save some useless checks for more legible code
 use Carp;
 
-our $VERSION = '2.10';
+our $VERSION = '3.01';
 
 my @casedesc = (undef, qw/shift ctrl meta/, 'shift meta');
 my @rowdesc = qw(numeric top home bottom);
 
 my @casedesc = (undef, qw/shift ctrl meta/, 'shift meta');
 my @rowdesc = qw(numeric top home bottom);
@@ -80,12 +80,13 @@ sub keyunalias {
        my $self = shift;
        my ($key, $ancestry) = @_;
 
        my $self = shift;
        my ($key, $ancestry) = @_;
 
-       $key =~ s/(\S*?)(\+?\^?\S)($|\s.*)/$2/;
+       $key =~ s/(\S*?)(\+?\^?\S$)/$2/;
        my $mode = $1;
        my $keyinfo = $self->{def}->{$mode}->{$key};
 
        return unless defined $keyinfo;
        my $mode = $1;
        my $keyinfo = $self->{def}->{$mode}->{$key};
 
        return unless defined $keyinfo;
-       $keyinfo =~ s/^=// or return $keyinfo;
+       return $keyinfo unless ref $keyinfo eq 'SCALAR';
+       $keyinfo = ${$keyinfo};
        return '' if $ancestry->{$key}++;  # endless loop failsafe
        return $self->keyunalias($keyinfo, $ancestry);
 }
        return '' if $ancestry->{$key}++;  # endless loop failsafe
        return $self->keyunalias($keyinfo, $ancestry);
 }
@@ -105,32 +106,44 @@ sub print_letter {
 
 sub print_key {
        my $self = shift;
 
 sub print_key {
        my $self = shift;
-       my ($mode, $key, $flags) = @_;
-       my ($desc, $mnem);
+       my ($mode, $key, $def) = @_;
 
 
-       if (not defined $flags) {
-               $flags = $key eq '^0' ? 'ni' : 'no';
+       if (not defined $def) {
+               $def = [$key eq '^0' ? 'ni' : 'no'];
        }
        }
-       elsif ($flags =~ s/^=(\S+)\s?//) { # alias
-               my $ref = $1;
-               $desc = $self->{sign}->{alias} . ($ref eq "\e" ? 'esc' : $ref);
-               $flags = join ' ', $self->keyunalias($ref), 'alias', $flags;
+       elsif (ref $def eq 'SCALAR') {
+               $def = [undef, $def];
        }
        }
-       if (my $txt = $self->{key}->{$mode.$key}) {
-               ($desc, $mnem) = split /\n/, $self->escapedesc($txt);
+       if (ref $def ne 'ARRAY') {
+               carp "print_key: invalid definition for $mode$key: $def";
+               return;
        }
        }
+       my ($flags, $txt) = @{$def};
+       if (ref $txt eq 'SCALAR') {
+               my $ref = ${$txt};
+               $def = $self->keyunalias($ref);
+               $ref = 'esc' if $ref eq "\e";
+               $flags //= $def->[0] if ref $def eq 'ARRAY';
+               $txt = $self->{sign}->{alias} . $ref;
+               $flags .= ' alias';
+       }
+       my ($desc, $mnem) = split /\n/, $self->escapedesc($txt);
 
 
+       my $onclick = $flags =~ s/ ?\bmode(\S*)// && defined $self->{def}{$1} && sprintf(
+               ' onclick="setmode(%s)"',
+               $1 eq '' ? '' : sprintf(q{'mode%s'}, escapeclass($1))
+       );
+       my $keyhint = defined($mnem) && qq{ title="$mnem"};
+       if ($self->{tableclass} =~ /\bbig\b/) {
+               $onclick .= $keyhint;
+               $keyhint = '';
+       }
        my $keytxt = $self->print_letter($key, $mode);
           $keytxt .= "<small>$self->{sign}->{motion}</small>" if $flags =~ s/ ?\bargm\b//;  # motion argument
           $keytxt .= $self->{sign}->{$1} while $flags =~ s/(?:^| )(arg[a-ln-z]?)\b//;  # arguments
        my $keytxt = $self->print_letter($key, $mode);
           $keytxt .= "<small>$self->{sign}->{motion}</small>" if $flags =~ s/ ?\bargm\b//;  # motion argument
           $keytxt .= $self->{sign}->{$1} while $flags =~ s/(?:^| )(arg[a-ln-z]?)\b//;  # arguments
-       my $keyhint = defined($mnem) && qq{ title="$mnem"};
           $keytxt  = "<b$keyhint>$keytxt</b>";
           $keytxt .= ' '.$desc if defined $desc;
           $keytxt = qq{<a href="/$1">$keytxt</a>} if $flags =~ s/ ?\blink(\S*)//;
           $keytxt  = "<b$keyhint>$keytxt</b>";
           $keytxt .= ' '.$desc if defined $desc;
           $keytxt = qq{<a href="/$1">$keytxt</a>} if $flags =~ s/ ?\blink(\S*)//;
-       my $onclick = $flags =~ s/ ?\bmode(\S*)// && defined $self->{def}{$1} && sprintf(
-               ' onclick="setmode(%s)"',
-               $1 eq '' ? '' : sprintf(q{'mode%s'}, escapeclass($1))
-       );
        $flags =~ s/\bx\w+/ext/;
        $flags =~ s/\bv\d+/new/;
        $flags .= ' chr'.ord(substr $key, -1) if $key ne '^0';
        $flags =~ s/\bx\w+/ext/;
        $flags =~ s/\bv\d+/new/;
        $flags .= ' chr'.ord(substr $key, -1) if $key ne '^0';
@@ -226,13 +239,10 @@ Shiar_Sheet::Keyboard - Output HTML for key sheets
        my $keys = Shiar_Sheet::Keyboard({
                def => {
                        'lead' => {
        my $keys = Shiar_Sheet::Keyboard({
                def => {
                        'lead' => {
-                               'A' => '=a', # alias
-                               'a' => 'classes',
+                               'A' => \'a', # alias
+                               'a' => ['classes', 'description', 'hover comments'],
                        },
                },
                        },
                },
-               key => {
-                       'leada' => ['description', 'comments (on hover)'],
-               },
                mode => {
                        'lead' => 'mode description',
                },
                mode => {
                        'lead' => 'mode description',
                },
index d0e84c8e082799c31b45428b979b20cf36abe895..7077d3c863236c3f594b266a3572835efecb406e 100644 (file)
@@ -9,7 +9,7 @@ use Unicode::Normalize qw( NFKD );
 use Text::Unidecode ();
 use Shiar_Sheet::FormatChar;
 
 use Text::Unidecode ();
 use Shiar_Sheet::FormatChar;
 
-our $VERSION = '1.04';
+our $VERSION = '1.05';
 our @EXPORT = qw( kbchars kbmodes );
 
 my $uc = Shiar_Sheet::FormatChar->new;
 our @EXPORT = qw( kbchars kbmodes );
 
 my $uc = Shiar_Sheet::FormatChar->new;
@@ -42,17 +42,22 @@ sub kbmodes ($modes) {
        );
        for my $lead (keys %{$modes}) {
                if ($lead ne '') {
        );
        for my $lead (keys %{$modes}) {
                if ($lead ne '') {
-                       $info{def}->{''}->{$lead} = "g1 mode$lead";
+                       $info{def}->{''}->{$lead}[0] = "g1 mode$lead";
                        $g{g1} = 1;
                        $info{mode}->{$lead} //= "mode $lead";
                        $g{g1} = 1;
                        $info{mode}->{$lead} //= "mode $lead";
-                       $info{def}->{$lead}{$lead} = 'g1 mode'; # back
+                       $info{def}->{$lead}{$lead} = ['g1 mode']; # back
                }
                while (my ($k, $v) = each %{ $modes->{$lead} }) {
                }
                while (my ($k, $v) = each %{ $modes->{$lead} }) {
+                       my @class;
+                       if (ref $v eq 'SCALAR') {
+                               my ($reflead, $ref) = split /(.)$/, ${$v};
+                               $v = $modes->{$reflead}->{$ref};
+                               @class = 'ext';
+                       }
                        my ($glyph, $title) = $uc->glyph_html($v);
                        my ($glyph, $title) = $uc->glyph_html($v);
-                       $info{key}{$lead.$k} = join "\n", $glyph, $title;
                        my $c = $k =~ s/\A[+^](?=.)//r;  # trim modifier indicator
 
                        my $c = $k =~ s/\A[+^](?=.)//r;  # trim modifier indicator
 
-                       my $class = (
+                       unshift @class, (
                                  !defined $v || $c eq $v ? 'no' # identical
                                : $v =~ /\A\p{Mn}+\z/ ? 'g9' # combining accent
                                : NFKD($v) =~ /\A\Q$c\E\p{Mn}*\z/ ? 'g2' # decomposed equivalent
                                  !defined $v || $c eq $v ? 'no' # identical
                                : $v =~ /\A\p{Mn}+\z/ ? 'g9' # combining accent
                                : NFKD($v) =~ /\A\Q$c\E\p{Mn}*\z/ ? 'g2' # decomposed equivalent
@@ -62,8 +67,9 @@ sub kbmodes ($modes) {
                                : $v =~ /^\p{Latin}/ ? 'g5' # latin script
                                : 'g6'
                        );
                                : $v =~ /^\p{Latin}/ ? 'g5' # latin script
                                : 'g6'
                        );
-                       $g{$class} = 1 unless $class eq 'no';
-                       $info{def}{$lead}{$k} //= $class;
+                       $g{$_} = 1 for grep { $_ ne 'no' } @class;
+                       $info{def}{$lead}{$k} //= [join ' ', @class];
+                       $info{def}{$lead}{$k}[1] = join "\n", $glyph, $title;
                }
        }
        $info{flag} = {%{{
                }
        }
        $info{flag} = {%{{
@@ -75,6 +81,7 @@ sub kbmodes ($modes) {
                g7 => ['punctuation', "(punctuation) mark"],
                g8 => ['mark', "modifier letter or mark (spacing diacritic)"],
                g9 => ['combining', "diacritical mark to be combined with a following character"],
                g7 => ['punctuation', "(punctuation) mark"],
                g8 => ['mark', "modifier letter or mark (spacing diacritic)"],
                g9 => ['combining', "diacritical mark to be combined with a following character"],
+               ext => ['alias', 'alternative with identical results as something else'],
        }}{keys %g}};
        return \%info;
 }
        }}{keys %g}};
        return \%info;
 }
index e4ed58d7fb2da99e8fbd74814177f6124730add6..405b282ab87c078260f6e87c6ea59057ff5aa333 100644 (file)
--- a/base.css
+++ b/base.css
@@ -646,12 +646,9 @@ table.dimap {
 }
 
 dl.legend dt.more,
 }
 
 dl.legend dt.more,
-.keys td.more b {
-       text-shadow: #F20 0 0 0.1em;
-}
-dl.legend dt.more:hover,
-.keys td.more:hover b {
-       text-shadow: #F20 0 0 0.5em, #FC0 0 0 0.2em;
+.keys td.more {
+       outline: 3px solid #0006;
+       outline-offset: -3px; /* inside */
 }
 dl.legend dt.new,
 .keys td.new {
 }
 dl.legend dt.new,
 .keys td.new {
index ee21f022748d60cb2ea20f7fda53d667950291fe..a634733cba704de18de8e56605a78a796f8109c9 100644 (file)
@@ -76,7 +76,7 @@ sub stylesheet {
 
        return map { sprintf(
                '<link rel="%s" type="text/css" media="all" href="%s" title="%s">',
 
        return map { sprintf(
                '<link rel="%s" type="text/css" media="all" href="%s" title="%s">',
-               $_ eq $style ? 'stylesheet' : 'alternate stylesheet', "/$_.css?1.17", $_
+               $_ eq $style ? 'stylesheet' : 'alternate stylesheet', "/$_.css?1.18", $_
        ) } @avail;
 }
 
        ) } @avail;
 }
 
index 5b5f4140b46d48421deb6f2ed6f6f99bb4a2bfd0..7eac2058bfed5c6f9f1b903fe067e09d7bfcddd1 100644 (file)
@@ -9,7 +9,7 @@ warn "error in $include: ", @{$@} if ref $@;
 
 Html({
        title => "$mode digraph cheat sheet",
 
 Html({
        title => "$mode digraph cheat sheet",
-       version => '1.3',
+       version => '1.5',
        description => $di->{description} // [
                "Complete table of digraph characters from",
                ($di->{title} // $mode) . ".",
        description => $di->{description} // [
                "Complete table of digraph characters from",
                ($di->{title} // $mode) . ".",
index 701957305cdcee045ee06d6b4b0156ffaff9400d..d7892626e8b9792bcbce4cff5362339cdf738948 100644 (file)
--- a/font.plp
+++ b/font.plp
@@ -109,13 +109,13 @@ EOT
        say "<caption>$_</caption>" for join(' ', grep {$_}
                $offset > $pagerows && sprintf('<a rel="start" href="%s=%d">◄</a>', $offsetlink, 0),
                $offset > 0 && sprintf(
        say "<caption>$_</caption>" for join(' ', grep {$_}
                $offset > $pagerows && sprintf('<a rel="start" href="%s=%d">◄</a>', $offsetlink, 0),
                $offset > 0 && sprintf(
-                       '<a rel="prev" href="%s=%d" title="U+%2$04X">◅</a>',
+                       '<a rel="prev nofollow" href="%s=%d" title="U+%2$04X">◅</a>',
                        $offsetlink, $offset - $pagerows,
                ),
                sprintf('U+%04X', $map ? $map->[$offset] : $offset),
                Unicode::UCD::charblock($map ? $map->[$offset] : $offset),
                $offset + $pagerows < ($map ? @{$map} : 0x11_0000) && sprintf(
                        $offsetlink, $offset - $pagerows,
                ),
                sprintf('U+%04X', $map ? $map->[$offset] : $offset),
                Unicode::UCD::charblock($map ? $map->[$offset] : $offset),
                $offset + $pagerows < ($map ? @{$map} : 0x11_0000) && sprintf(
-                       '<a rel="next" href="%s=%d" title="U+%2$04X">▻</a>',
+                       '<a rel="next nofollow" href="%s=%d" title="U+%2$04X">▻</a>',
                        $offsetlink, $offset + $pagerows,
                ),
        );
                        $offsetlink, $offset + $pagerows,
                ),
        );
index 690902542701d9eb01aea324ef1fc840ea901cfe..f05c02afb49d372b0e235b5b83802697f0a941cc 100644 (file)
--- a/index.plp
+++ b/index.plp
@@ -3,7 +3,7 @@
 Html({
        title => 'cheat sheets',
        canonical => '/',
 Html({
        title => 'cheat sheets',
        canonical => '/',
-       version => '1.17',
+       version => '1.18',
        description => [
                "Cheat sheets summarising various software programs and standards.",
        ],
        description => [
                "Cheat sheets summarising various software programs and standards.",
        ],
@@ -54,8 +54,7 @@ if (open my $log, '<', 'UPDATE') {{
 <li><a href="/mutt">mutt</a>
 <li><a href="/nethack">nethack</a>
 <li><a href="/mplayer/mpv">mplayer/mpv</a>
 <li><a href="/mutt">mutt</a>
 <li><a href="/nethack">nethack</a>
 <li><a href="/mplayer/mpv">mplayer/mpv</a>
-<li><a href="/keyboard/altgr/windows">altgr</a>
-    <a href="/keyboard/altgr">etc.</a>
+<li><a href="/keyboard/altgr">altgr/option</a>
 </ul>
 </div>
 
 </ul>
 </div>
 
index fa2aaf25d19ef2c7c0c461cd5e8e29cbb43b44c0..3a40a4d22bf9b64a0525fa5403b0481a3a7b407f 100644 (file)
@@ -48,7 +48,7 @@ say "<p>$_</p>" for $info->{intro} // ();
 say "<h2>", $info->{mode}->{''}, " (default)</h2>"
        if $info->{mode} and %{ $info->{mode} } > 1;
 
 say "<h2>", $info->{mode}->{''}, " (default)</h2>"
        if $info->{mode} and %{ $info->{mode} } > 1;
 
-use Shiar_Sheet::Keyboard 2.08;
+use Shiar_Sheet::Keyboard 3.00;
 my $keys = Shiar_Sheet::Keyboard->new($info);
 $keys->map($get{map}) or undef $get{map};
 $keys->print_rows($get{rows} || $info->{moderows}, $info->{rows});
 my $keys = Shiar_Sheet::Keyboard->new($info);
 $keys->map($get{map}) or undef $get{map};
 $keys->print_rows($get{rows} || $info->{moderows}, $info->{rows});
index c796cb31f61169737c74cb102addcd2529301e0a..d7fbbc7b4221a0078d1909911b02db2e368bc7f1 100644 (file)
@@ -93,7 +93,7 @@ my %rows = (
 );
 
 my $groups = kbchars(\%rows);
 );
 
 my $groups = kbchars(\%rows);
-$groups->{def}{''}{$_} .= ' ext' for keys %dyalogx;
+$groups->{def}{''}{$_}[0] .= ' ext' for keys %dyalogx;
 $groups->{flag}{ext} = ['extended', 'optional operators not available in all variants'];
 
 +{
 $groups->{flag}{ext} = ['extended', 'optional operators not available in all variants'];
 
 +{
diff --git a/keyboard/altgr/atari.eng.inc.pl b/keyboard/altgr/atari.eng.inc.pl
new file mode 100644 (file)
index 0000000..6f581f8
--- /dev/null
@@ -0,0 +1,55 @@
+use utf8;
+use strict;
+use warnings;
+no warnings 'qw';
+use Shiar_Sheet::KeyboardChars 'kbchars';
+our %get;
+
+# card suits at 50,00,60,7B mapped differently depending on keyboard
+my %rows = qw(
+       p ♣  , ♥  ; ♠  . ♦
+       q ┌  w ┬  e ┐  r ─  t ●  y ▌  u ▄  i ▗  o ▖
+       a ├  s ┼  d ┤  f ╱  g ╲  h ◢  j ◣  k ▝  l ▘
+       z └  x ┴  c ┘  v ▏  b ▕  n ▁  m ▔
+);
+
+if (exists $get{compat}) {
+       %rows = (%rows, qw(
+               q ┏  w ┳  e ┓  r ━
+               a ┣  s ╋  d ┫
+               z ┗  x ┻  c ┛  v ▎  b 🮇  n ▂  m 🮂
+       ));
+}
+
+my $groups = kbchars(\%rows);
+
+while (my ($k, $c) = each %rows) {
+       $groups->{def}{''}{$k}[0] = (
+               $c =~ /\p{In=1.1}/ ? 'g2' :
+               $c =~ /\p{In=4.0}/ ? 'g3' :
+               $c =~ /[\x{1FB00}-\x{1FBFF}]/ ? 'g5' : # Age=V13.0
+               'g0'
+       );
+}
+
++{
+       %{ $groups },
+       version => '1.0',
+       title => 'Atari graphics',
+       category => 'legacy/graph',
+       moderows => '1-',
+       intro => join("\n",
+               '<abbr title="ATARI Standard Code for Information Interchange">ATASCII</abbr>',
+               'characters from 8-bit Atari machines starting with the 1979 models 400 and 800,',
+               'with modern <a href="/keyboard/altgr/unigraph">Unicode</a> equivalents.',
+               'Similar to <a href="/keyboard/altgr/c64">PETSCII</a>',
+               'and <a href="/keyboard/altgr/msx-graph">MSX graph</a>.',
+       ),
+       image => 'data/keyboard/thumb/atari-130xe.jpg',
+       flag => {
+               g2 => ['standard' => 'original Unicode 1993'],
+               g3 => ['extended' => 'Unicode 4.0'],
+               g5 => ['legacy'   => 'exceptional <em>symbols for legacy computing</em> in Unicode since <abbr title="Unicode 13.0">2020</abbr>'],
+               g9 => ['color'    => 'presentational controls represented by anachronistic hearts'],
+       },
+}
diff --git a/keyboard/altgr/c64.eng.inc.pl b/keyboard/altgr/c64.eng.inc.pl
new file mode 100644 (file)
index 0000000..387b240
--- /dev/null
@@ -0,0 +1,134 @@
+use utf8;
+use strict;
+use warnings;
+use Shiar_Sheet::KeyboardChars 'kbchars';
+
+my %c64 = (
+       # control keys not on pet2001
+       '1' => "🖤\nBLacK",
+       '2' => "🤍\nWHiTe",
+       '3' => "❤️\nRED",
+       '4' => "🩵\nCYaN",
+       '5' => "💜\nPURple",
+       '6' => "💚\nGReeN",
+       '7' => "💙\nBLUe",
+       '8' => "💛\nYELlow",
+       '9' => "💟\nREverSe video ON",
+       '0' => "💔\nREverSe video OFF",
+);
+
+my %rows = (%c64,
+       # literal petscii control characters, unaltered from pet2001
+       'a' => '♠',
+       'b' => '🭲',
+       'c' => '🭸',
+       'd' => '🭷',
+       'e' => '🭶',
+       'f' => '🭺',
+       'g' => '🭱',
+       'h' => '🭴',
+       'i' => '╮',
+       'j' => '╰',
+       'k' => '╯',
+       'l' => '🭼',
+       'm' => '╲',
+       'n' => '╱',
+       'o' => '🭽',
+       'p' => '🭾',
+       'q' => '●',
+       'r' => '🭻',
+       's' => '♥',
+       't' => '🭰',
+       'u' => '╭',
+       'v' => '╳',
+       'w' => '○',
+       'x' => '♣',
+       'y' => '🭵',
+       'z' => '♦',
+       ']' => '─', # @
+
+       # literal pet2001 keys reassigned on c64
+       ',' => '┼', # [ c64 +
+       '.' => '│', # ] c64 -
+       '\\'=> 'π', # ↑ c64 \
+       '}' => '◥', # ← c64 *
+       '>' => '🮌', # \ c64 ^-
+       'B' => '▚', # ?
+
+       # ! " # $ % ' & \ ( ) ←            »  1 2 3 4 5 6 7 8 9 0 + - £
+       # Q W E R T Y U I O P ↑   7 8 9 /  »  Q W E R T Y U I O P @ * ↑
+       # A S D F G H J K L :     4 5 6 *  »  A S D F G H J K L : ; =
+       # Z X C V B N M , ; ?     1 2 3 +  »  Z X C V B N M , . /
+       #     @ [ ]     < >       0 . - =
+
+       # pet2001 top row
+       'K' => '▌', # A pet !
+       'I' => '▄', # B pet "
+       'T' => '▔', # C pet #
+       '{' => '▁', # D pet $
+       'G' => '▏', # E pet %
+       'M' => '▕', # G pet '
+       '<' => '▒', # F pet & c64 ^+
+       '/' => '🮏', # H pet ( c64 ^£
+       '?' => '◤', # I pet ) c64 £
+
+       # pet2001 bottom rows
+       '[' => '🭿', # Z pet :
+       'D' => '▗', # L pet ,
+       'F' => '▖', # { pet ;
+       'C' => '▝', # | pet <
+       'V' => '▘', # ~ pet >
+
+       # pet2001 numpad
+       'Y' => '🮂', # W pet 7
+       'U' => '🮃', # X pet 8
+       'O' => '▃', # Y pet 9
+       'P' => '▂', # O pet /
+       'H' => '▎', # T pet 4
+       'J' => '▍', # U pet 5
+       'L' => '🮈', # V pet 6
+       'N' => '🮇', # J pet *
+       'E' => '┴', # Q pet 1
+       'R' => '┬', # R pet 2
+       'W' => '┤', # S pet 3
+       'Q' => '├', # K pet +
+       'A' => '┌', # P pet 0
+       'S' => '┐', # N pet .
+       'Z' => '└', # M pet -
+       'X' => '┘', # } pet =
+);
+
+my $groups = kbchars(\%rows);
+
+while (my ($k, $c) = each %rows) {
+       $groups->{def}{''}{$k}[0] = (
+               $c64{$k} ? 'g9' :
+               $c =~ /\p{In=1.1}/ ? 'g2' :
+               $c =~ /\p{In=4.0}/ ? 'g3' :
+               $c =~ /[\x{1FB00}-\x{1FBFF}]/ ? 'g5' : # Age=V13.0
+               'g0'
+       );
+}
+
++{
+       %{ $groups },
+       version => '1.0',
+       title => 'Commodore graphics',
+       category => 'legacy/graph',
+       moderows => '21-1',
+       intro => join("\n",
+               '<abbr title="PET Standard Code of Information Interchange">PETSCII</abbr>',
+               'characters designed for the 1977 PET&nbsp;2001 machine',
+               'as found on the VIC-20 and C-64.',
+               'See also <a href="/keyboard/altgr/msx-graph">MSX graph</a>,',
+               '<a href="/keyboard/altgr/atari">ATASCII</a>, and',
+               '<a href="/keyboard/altgr/unigraph">modern Unicode</a>.',
+       ),
+       image => 'data/keyboard/thumb/c64.jpg',
+       flag => {
+               g2 => ['standard' => 'original Unicode 1993'],
+               g3 => ['extended' => 'Unicode 4.0'],
+               g5 => ['legacy'   => 'exceptional <em>symbols for legacy computing</em> in Unicode since <abbr title="Unicode 13.0">2020</abbr>'],
+               g9 => ['color'    => 'presentational controls represented by anachronistic hearts'],
+       },
+}
index c36f53bf1c9e6e42315cf5ce1f7937f3b081ea21..a63a5a0d2a33c982a4451daebe9199e68f088f0f 100644 (file)
@@ -31,7 +31,7 @@ my %rows = (
        ']' => "}",
        '^' => "\N{COMBINING MACRON}",
        '_' => "\xB1",
        ']' => "}",
        '^' => "\N{COMBINING MACRON}",
        '_' => "\xB1",
-       '`' => "\xA3",
+       '`' => \'l',
        'A' => "\x{2190}",
        'a' => "\xE6",
        'B' => "\x{20bf}",
        'A' => "\x{2190}",
        'a' => "\xE6",
        'B' => "\x{20bf}",
@@ -41,7 +41,7 @@ my %rows = (
        'd' => "\x{394}",
        'D' => "\x{2192}",
        'e' => "\x{20AC}",
        'd' => "\x{394}",
        'D' => "\x{2192}",
        'e' => "\x{20AC}",
-       'E' => "\x{20AC}",
+       'E' => \'e',
        'f' => "\x{192}",
        'F' => "\x{191}",
        #'g' => "g",
        'f' => "\x{192}",
        'F' => "\x{191}",
        #'g' => "g",
@@ -81,7 +81,7 @@ my %rows = (
        'x' => "\xD7",
        'X' => "\xF7",
        'y' => "\xA5",
        'x' => "\xD7",
        'X' => "\xF7",
        'y' => "\xA5",
-       'Y' => "\xA5",
+       'Y' => \'y',
        'z' => "\xA7",
        'Z' => "\xB6",
        '{' => "\xAB",
        'z' => "\xA7",
        'Z' => "\xB6",
        '{' => "\xAB",
@@ -103,11 +103,8 @@ my %rows = (
        ';' => "\xA1",     # unshifted ! at m
 );
 
        ';' => "\xA1",     # unshifted ! at m
 );
 
-my $groups = kbchars(\%rows);
-$groups->{def}{''}{$_} .= ' ext' for qw( ` E Y );
-
 +{
 +{
-       %{$groups},
+       %{ kbchars(\%rows) },
        version => '1.0',
        title => 'Drix',
        category => 'latin/xorg',
        version => '1.0',
        title => 'Drix',
        category => 'latin/xorg',
index dca101c4281621a4d6430d15e79247fc3f919748..33c35d18da51a0ec685cd4284a749ef7d5e4b6cf 100644 (file)
@@ -59,7 +59,7 @@ my $groups = kbchars(\%rows);
 
 while (my ($k, $c) = each %rows) {
        # override letter-based classes by unicode versions
 
 while (my ($k, $c) = each %rows) {
        # override letter-based classes by unicode versions
-       $groups->{def}{''}{$k} = (
+       $groups->{def}{''}{$k}[0] = (
                $c =~ /\p{General_Category=Modifier_Symbol}/ ? 'g9' :
                $c =~ /\p{In=1.1}/ ? 'g2' :
                $c =~ /\p{In=5.2}/ ? 'g3' :
                $c =~ /\p{General_Category=Modifier_Symbol}/ ? 'g9' :
                $c =~ /\p{In=1.1}/ ? 'g2' :
                $c =~ /\p{In=5.2}/ ? 'g3' :
index 5b9702cf427f42b003f7de40c84916dbb0cb27f7..456ac15e9fcce059a69fabc9a9c4265b2a2333fd 100644 (file)
@@ -109,7 +109,7 @@ my %rows = (
        # greek
        'm' => {
                'a' => 'α',
        # greek
        'm' => {
                'a' => 'α',
-               'b' => 'β', # v
+               'b' => 'β',
                'g' => 'γ',
                'd' => 'δ',
                'e' => 'ε',
                'g' => 'γ',
                'd' => 'δ',
                'e' => 'ε',
@@ -131,7 +131,13 @@ my %rows = (
                'f' => 'φ',
                'c' => 'χ',
                'w' => 'ψ',
                'f' => 'φ',
                'c' => 'χ',
                'w' => 'ψ',
-               'q' => 'ω', # u
+               'q' => 'ω',
+
+               # aliases
+               'v' => \'mb',
+               'V' => \'mB',
+               'u' => \'mq',
+               'U' => \'mQ',
 
                # suþscript
                '1' => '¹',
 
                # suþscript
                '1' => '¹',
@@ -269,6 +275,9 @@ my %rows = (
        },
 );
 
        },
 );
 
+# uppercase greek
+$rows{m}{uc $_} //= uc $rows{m}{$_} for keys %{ $rows{m} };
+
 +{
        %{ kbmodes(\%rows) },
        mode => {
 +{
        %{ kbmodes(\%rows) },
        mode => {
@@ -277,9 +286,9 @@ my %rows = (
                'M' => '√ maths prefix ⌥M',
                $presymbol => "$rows{''}{$presymbol} symbol prefix ⌥$presymbol",
        },
                'M' => '√ maths prefix ⌥M',
                $presymbol => "$rows{''}{$presymbol} symbol prefix ⌥$presymbol",
        },
-       version => '1.1',
+       version => '1.2',
        title => 'EurKEY',
        title => 'EurKEY',
-       category => 'latin/thirdparty',
+       category => 'latin/thirdparty/xorg',
        intro => join("\n",
                'Third-party proposal <a href="https://eurkey.steffen.bruentjen.eu/">EurKEY</a>',
                '<abbr title="last updated 2017-05-15">v1.3</abbr> by Steffen Brüntjen',
        intro => join("\n",
                'Third-party proposal <a href="https://eurkey.steffen.bruentjen.eu/">EurKEY</a>',
                '<abbr title="last updated 2017-05-15">v1.3</abbr> by Steffen Brüntjen',
diff --git a/keyboard/altgr/index.inc.pl b/keyboard/altgr/index.inc.pl
new file mode 100644 (file)
index 0000000..1f77fa7
--- /dev/null
@@ -0,0 +1,35 @@
+use strict;
+use warnings;
+
+my %cat = (
+       default => [qw( euro latin science graph )],
+       euro => [qw( windows ukext macos macos-abc weur eurkey msx )],
+       ipa     => [qw( ipa-ucl xipa )],
+       latin   => [qw( ipa-ucl olpc boyeg drix )],
+       science => [qw( symbolics apl spacecadet )],
+       graph => [qw( unigraph emojiworks )],
+       extra => [qw( msx-graph c64 atari p8scii zoo )],
+);
+
+for my $name (map {@{$_}} values %cat) {
+       my $keys = do "keyboard/altgr/$name.eng.inc.pl" or next;
+       my %row = %{$keys}{qw( title category flag mode image imagealt )};
+       $cat{$name} = \%row;
+
+       $row{mode} //= {'' => undef};
+
+       if (($keys->{moderows} // '') =~ /^\d* [45] \d{2,}/x) {
+               # move root +meta keys to distinct mode
+               $row{mode}{"\e"} = '+';
+               /^\+./ and $keys->{def}{"\e"}{$_} = delete $keys->{def}{''}{$_}
+                       for keys %{ $keys->{def}{''} };
+       }
+
+       for my $mode (keys %{ $row{mode} }) {
+               $row{inventory}{$mode}{$_}++
+                       for grep { /^g[2-9]/ } map { s/ (?!ext).*//r } map {$_->[0]}
+                       values %{ $keys->{def}{$mode} };
+       }
+}
+
+\%cat
index d4d8bdeabb5c7b200fe6962ff03beb9a92bfb58d..5491df8767567749cd506183615eff003fb35fbf 100644 (file)
@@ -3,11 +3,12 @@ use 5.014;
 use warnings;
 use utf8;
 
 use warnings;
 use utf8;
 
-my @incs = glob 'keyboard/altgr/*.eng.inc.pl';
+my $dirbase = 'keyboard/altgr';
+my $indexfile = "$dirbase/index";
 
 Html({
        title => "altgr keyboard cheat sheets",
 
 Html({
        title => "altgr keyboard cheat sheets",
-       version => '1.2',
+       version => '1.3',
        description => [
                "Overview of alternate keyboard modes,",
                "offering extended Unicode characters if a modifier key",
        description => [
                "Overview of alternate keyboard modes,",
                "offering extended Unicode characters if a modifier key",
@@ -16,9 +17,9 @@ Html({
        keywords => [qw'
                sheet cheat reference overview keyboard altgr option
        '],
        keywords => [qw'
                sheet cheat reference overview keyboard altgr option
        '],
-       image => 'data/keyboard/thumb/ibm-m.jpg',
+       image => "$dirbase/thumb/ibm-m.jpg",
        stylesheet => [qw( light dark circus mono red )],
        stylesheet => [qw( light dark circus mono red )],
-       data => ['keyboard/altgr/index.inc.plp', @incs],
+       data => ["$dirbase/index.inc.plp", "$indexfile.inc.pl"],
        raw => <<'.',
 <style>
 .keys.cmp {
        raw => <<'.',
 <style>
 .keys.cmp {
@@ -32,6 +33,14 @@ Html({
 .keys.big.cmp tbody {
        font-size: 150%;
 }
 .keys.big.cmp tbody {
        font-size: 150%;
 }
+@media (max-width: 48em) {
+       .keys.big.cmp tbody {
+               font-size: 100%;
+       }
+       .keys.big.cmp tbody a {
+               white-space: normal;
+       }
+}
 .keys.cmp tbody {
        display: table-row-group;
 }
 .keys.cmp tbody {
        display: table-row-group;
 }
@@ -102,12 +111,19 @@ img {
 :>
 <h1>Extended keyboards</h1>
 
 :>
 <h1>Extended keyboards</h1>
 
-<p>Overview of available key layouts with AltGr or similar modifier keys.</p>
+<p>Overview of available key layouts with AltGr or similar modifier keys.
+Also see <a href="/digraphs">digraphs</a> for compose key combinations.
+</p>
 
 <:
 
 <:
+my $idx = Data($indexfile);
+my @incs;
+push @incs, @{ $idx->{$_} } for @{ $idx->{default} };
+
 my @sample = split /(?<!\+)/, $get{sample} // 'asSci1!+1';
 require Shiar_Sheet::Keyboard;
 my @sample = split /(?<!\+)/, $get{sample} // 'asSci1!+1';
 require Shiar_Sheet::Keyboard;
-use List::Util qw( uniq max );
+Shiar_Sheet::Keyboard->VERSION(3.00);
+use List::Util qw( uniq max sum );
 
 my %caticon = (
        legacy  => qq{<span class=icon title="deprecated">\N{TOP HAT}</span>},
 
 my %caticon = (
        legacy  => qq{<span class=icon title="deprecated">\N{TOP HAT}</span>},
@@ -123,18 +139,15 @@ if (@sample) {
        print "<th>$_" for @sample;
        say '</tr></thead>';
 }
        print "<th>$_" for @sample;
        say '</tr></thead>';
 }
-my %idx = map {s/\Q.inc.pl\E$//; ($_ => eval{ Data($_) })} @incs;
-my $most = max(map { scalar keys %{$_->{def}{''}} } values %idx);
-for my $inc (sort {
-       $idx{$a}{category} cmp $idx{$b}{category} || $a cmp $b
-} keys %idx) {
+my $most = max(map { sum values %{ $_->{inventory}{''} } } %{$idx}{@incs});
+for my $inc (@incs) {
+       my $table = $idx->{$inc};
        print @sample ? '<tr><th>' : '<figure>';
        print @sample ? '<tr><th>' : '<figure>';
-       printf '<a href="/%s">', $inc =~ s/\.eng$//r;
-       my $table = $idx{$inc};
-       my $title = $table && $table->{title} || $inc;
+       printf '<a href="/%s">', "$dirbase/$inc";
+       my $title = $table->{title} || $inc;
 
        unless (@sample) {
 
        unless (@sample) {
-               if ($table and my $img = $table->{image}) {
+               if (my $img = $table->{image}) {
                        EscapeHTML $name = $table->{imagealt} // $img =~ m{.*/([^/.]*)};
                        print qq{<img src="/$img" alt="$name" />};
                }
                        EscapeHTML $name = $table->{imagealt} // $img =~ m{.*/([^/.]*)};
                        print qq{<img src="/$img" alt="$name" />};
                }
@@ -144,27 +157,35 @@ for my $inc (sort {
        else {
                print $title;
                print '</a>', "\n\t";
        else {
                print $title;
                print '</a>', "\n\t";
-               my $keys = Shiar_Sheet::Keyboard->new($table);
-               for my $mode ($keys->{mode} ? sort keys %{ $keys->{mode} } : '') {
-                       my %inventory;
-                       $inventory{$_}++ for grep { /^g[2-9]/ } map { s/ (?!ext).*//r }
-                               values %{ $keys->{def}{$mode} };
+               for my $mode ($table->{mode} ? sort keys %{ $table->{mode} } : '') {
                        print '<span class=graph>';
                        print '<span class=graph>';
-                       print "<label>$_</label>" for $keys->{key}{$mode} =~ s/\s.*//r || ();
-                       for my $g (sort keys %inventory) {
+                       printf "<label>%s</label>", m/^(\S*)/
+                               for $mode && $table->{mode}{$mode} || ();
+                       for my $g (sort keys %{ $table->{inventory}{$mode} }) {
                                printf '<span class="%s" style="width:%.0f%%" title="%3$d %4$s"> %s</span>',
                                        $g, $_/$most*100, $_,
                                        join(' ', map {
                                printf '<span class="%s" style="width:%.0f%%" title="%3$d %4$s"> %s</span>',
                                        $g, $_/$most*100, $_,
                                        join(' ', map {
-                                               $keys->{flag}{$_}[0] || 'extra'  # legend label of each class
+                                               $table->{flag}{$_}[0] || 'extra'  # legend label of each class
                                        } reverse split / /, $g)
                                        } reverse split / /, $g)
-                                       for $inventory{$g};
+                                       for $table->{inventory}{$mode}{$g};
                        }
                        say '</span>';
                }
                print "\t<td class=ni>";
                        }
                        say '</span>';
                }
                print "\t<td class=ni>";
-               print join ' ', map { $caticon{$_} // () } split m{/}, $keys->{category};
+               print join ' ', map { $caticon{$_} // () }
+                       split m{/}, $table->{category} // '';
                say '';
                say '';
-               $keys->print_key('', $_, $keys->{def}{''}{$_} // 'ni') for @sample;
+               if (my $keys = eval {
+                       my $keydata = Data("$dirbase/$inc.eng");
+                       Shiar_Sheet::Keyboard->new($keydata)
+               }) {
+                       for my $c (@sample) {
+                               my $def = $keys->{def}{''}{$c} // [];
+                               $def->[0] //= 'ni';
+                               $def->[0] =~ s/ mode\S*//;
+                               $keys->print_key('', $c, $def);
+                       }
+               }
                say '</tr>';
        }
 }
                say '</tr>';
        }
 }
diff --git a/keyboard/altgr/ipa-rc.eng.inc.pl b/keyboard/altgr/ipa-rc.eng.inc.pl
new file mode 100644 (file)
index 0000000..9341302
--- /dev/null
@@ -0,0 +1,48 @@
+use utf8;
+use strict;
+use warnings;
+no  warnings 'qw';
+use Shiar_Sheet::KeyboardChars 'kbmodes';
+
+my %rows = (
+       # shifted as normal, altgr as shifted
+       '' => {qw(
+               a ɑ b ʙ c ʕ d ð e ɛ f ɸ g ɢ h ʜ i ɪ j ʔ k ɣ l ʟ m ŋ
+               n ɴ o ɔ p β q ə r ʀ s ʃ t θ u ʊ v ʋ w ɤ x χ y ʏ z ʒ
+               A æ E ɜ O ɒ V ʌ
+               1 ˩ 2 ˨ 3 ˧ 4 ˦ 5 ˥  6 ↗ 7 ↘ 8 ↑ 9 ↓
+               ! ǃ @ ǁ # ǂ $ ǀ % ʘ
+               / ʔ " ˑ ' ː : ˈ = ‿
+       )},
+       ';' => {qw(
+               lead @
+               a ɐ A ɒ e ɘ E ɜ h ɥ J ʕ m ɯ r ɹ R ʁ v ʌ w ʍ X ʔ y ʎ ? ʕ
+       )},
+       '&' => {qw(
+               lead æ
+               a æ b ɓ c ɕ E ɞ g ɠ G ʛ h ɦ H ɧ j ʝ l ɬ L ɮ
+               m ɰ o œ O ɶ Q ɚ r ɾ R ɺ z ʑ
+       )},
+);
+
++{
+       %{ kbmodes(\%rows) },
+       version => '1.0',
+       title => 'IPA',
+       category => 'specialized/ipa',
+       intro => join("\n",
+               "Another layout for typing in the International Phonetic Alphabet",
+               "designed by Richard Collins, last modified in 2009",
+               "and no longer available.",
+       ),
+       flags => {
+               '^' => 'superscript',
+               '_' => 'subscript',
+               '@' => 'reversed',
+               '<' => 'left tailed',  # ɲ
+               '>' => 'right tailed', # ɳ
+               '&' => 'extended',
+               '-' => 'barred',
+       },
+       #moderows => '5421-1',
+}
similarity index 98%
rename from keyboard/altgr/ipa.eng.inc.pl
rename to keyboard/altgr/ipa-ucl.eng.inc.pl
index 4fc3cd590bf9d1306d128bb8ef3b937a5e74516e..54780dfe093821269d3ed1a46bd7ddfb17479ff5 100644 (file)
@@ -125,7 +125,7 @@ my %rows = (
        %{ kbmodes(\%rows) },
        version => '1.0',
        title => 'UCL phonetic',
        %{ kbmodes(\%rows) },
        version => '1.0',
        title => 'UCL phonetic',
-       category => 'specialised',
+       category => 'specialised/ipa',
        intro => join("\n",
                'Unicode Phonetic Keyboard',
                '<abbr title="dated 2009-06-28">v1.10</abbr> by Mark Huckvale',
        intro => join("\n",
                'Unicode Phonetic Keyboard',
                '<abbr title="dated 2009-06-28">v1.10</abbr> by Mark Huckvale',
index 2c9f7297727ba4a43dc78d737080f9ef5826ee44..9b61a9c0e19a6621b1945a5b56ce5669569c9fb1 100644 (file)
@@ -25,17 +25,17 @@ my %rows = (
        'i' => "\N{COMBINING COMMA ABOVE}",
        'J' => "\N{DOUBLE ACUTE ACCENT}",
        'j' => "\N{COMBINING DOUBLE ACUTE ACCENT}",
        'i' => "\N{COMBINING COMMA ABOVE}",
        'J' => "\N{DOUBLE ACUTE ACCENT}",
        'j' => "\N{COMBINING DOUBLE ACUTE ACCENT}",
-       'K' => '°',
+       'K' => "\N{RING ABOVE}",
        'k' => "\N{COMBINING RING ABOVE}",
        'L' => '-',
        'k' => "\N{COMBINING RING ABOVE}",
        'L' => '-',
-       'l' => "\N{COMBINING SHORT STROKE OVERLAY}", #XXX
+       'l' => "\N{COMBINING SHORT STROKE OVERLAY}", # precomposed ŧʉɨɵđǥħłƶƀ
        'M' => "\N{OGONEK}",
        'm' => "\N{COMBINING OGONEK}",
        'N' => "\N{SMALL TILDE}",
        'n' => "\N{COMBINING TILDE}",
        'O' => 'Ø',
        'o' => 'ø',
        'M' => "\N{OGONEK}",
        'm' => "\N{COMBINING OGONEK}",
        'N' => "\N{SMALL TILDE}",
        'n' => "\N{COMBINING TILDE}",
        'O' => 'Ø',
        'o' => 'ø',
-       'P' => "\N{SINGLE LOW-9 QUOTATION MARK}", #XXX
+       'P' => ',',
        'p' => "\N{COMBINING COMMA BELOW}",
        'Q' => 'Œ',
        'q' => 'œ',
        'p' => "\N{COMBINING COMMA BELOW}",
        'Q' => 'Œ',
        'q' => 'œ',
@@ -51,7 +51,7 @@ my %rows = (
        'v' => "\N{COMBINING CARON}",
        'W' => "\N{DOT ABOVE}",
        'w' => "\N{COMBINING DOT ABOVE}",
        'v' => "\N{COMBINING CARON}",
        'W' => "\N{DOT ABOVE}",
        'w' => "\N{COMBINING DOT ABOVE}",
-       'X' => "\N{MODIFIER LETTER LOW RING}", #XXX
+       'X' => '.',
        'x' => "\N{COMBINING DOT BELOW}",
        'Y' => "\N{COMBINING DOUBLE GRAVE ACCENT}",
        'y' => '¥',
        'x' => "\N{COMBINING DOT BELOW}",
        'Y' => "\N{COMBINING DOUBLE GRAVE ACCENT}",
        'y' => '¥',
@@ -86,7 +86,7 @@ my %rows = (
        '5' => '§',
        '%' => '†',
        '6' => "\N{COMBINING CIRCUMFLEX ACCENT}",
        '5' => '§',
        '%' => '†',
        '6' => "\N{COMBINING CIRCUMFLEX ACCENT}",
-       '^' => "\N{MODIFIER LETTER CIRCUMFLEX ACCENT}", #XXX
+       '^' => "\N{MODIFIER LETTER CIRCUMFLEX ACCENT}",
        '7' => '¶',
        '&' => '‡',
        '8' => '•',
        '7' => '¶',
        '&' => '‡',
        '8' => '•',
@@ -109,7 +109,7 @@ my %rows = (
                '%' => 'Ƽ',
                '5' => 'ƽ',
                '^' => 'Ƅ',
                '%' => 'Ƽ',
                '5' => 'ƽ',
                '^' => 'Ƅ',
-               '6' => 'ƅ', #XXX
+               '6' => 'ƅ',
                '7' => '⁊',
                '*' => 'Ȣ',
                '8' => 'ȣ',
                '7' => '⁊',
                '*' => 'Ȣ',
                '8' => 'ȣ',
@@ -118,12 +118,12 @@ my %rows = (
                'W' => 'Ƿ',
                'w' => 'ƿ',
                'E' => 'Ǝ',
                'W' => 'Ƿ',
                'w' => 'ƿ',
                'E' => 'Ǝ',
-               'e' => 'ǝ', #XXX ə
+               'e' => 'ǝ',
                'R' => 'Ʀ',
                'R' => 'Ʀ',
-               'r' => 'ʀ', #XXX
+               'r' => 'ʀ',
                'k' => 'ĸ',
                'k' => 'ĸ',
-               'Y' => '',
-               'y' => 'ɜ',
+               'Y' => 'Ȝ',
+               'y' => 'ȝ',
                'U' => 'Ʊ',
                'u' => 'ʊ',
                'A' => 'Ə',
                'U' => 'Ʊ',
                'u' => 'ʊ',
                'A' => 'Ə',
@@ -134,24 +134,24 @@ my %rows = (
                'H' => 'Ƕ',
                'h' => 'ƕ',
                'J' => 'Ƞ',
                'H' => 'Ƕ',
                'h' => 'ƕ',
                'J' => 'Ƞ',
-               'j' => 'ƞ', #XXX ɳ
+               'j' => 'ƞ',
                'K' => 'Ǩ',
                'Z' => 'Ʒ',
                'z' => 'ʒ',
                'C' => 'Ɔ',
                'c' => 'ɔ',
                'v' => 'ʌ',
                'K' => 'Ǩ',
                'Z' => 'Ʒ',
                'z' => 'ʒ',
                'C' => 'Ɔ',
                'c' => 'ɔ',
                'v' => 'ʌ',
-               'N' => 'Ŋ', #XXX
+               'N' => 'Ŋ',
                'n' => 'ŋ',
                'M' => 'Ɯ',
                'm' => 'ɯ',
                'n' => 'ŋ',
                'M' => 'Ɯ',
                'm' => 'ɯ',
-               '"' => '″', #XXX ʺ
-               "'" => '′', #XXX ʹ
+               '"' => 'ʺ',
+               "'" => 'ʹ',
        },
 
        '>' => {
                'q' => 'ʠ',
        },
 
        '>' => {
                'q' => 'ʠ',
-               'R' => 'Ʈ', #XXX mirrored?
+               'R' => 'Ʈ', # mirrored preview
                'r' => 'ʈ',
                'T' => 'Ƭ',
                't' => 'ƭ',
                'r' => 'ʈ',
                'T' => 'Ƭ',
                't' => 'ƭ',
@@ -194,12 +194,13 @@ my %rows = (
                ':' => '№ number prefix ⌥:',
                '>' => 'ʔ hook prefix ⌥>',
        },
                ':' => '№ number prefix ⌥:',
                '>' => 'ʔ hook prefix ⌥>',
        },
-       version => '1.0',
+       version => '1.1',
        title => 'ABC option',
        category => '2/latin/macos',
        intro => join("\n",
                'Resulting <a href="/unicode">selection</a> of <a href="/charset">Unicode</a> characters',
        title => 'ABC option',
        category => '2/latin/macos',
        intro => join("\n",
                'Resulting <a href="/unicode">selection</a> of <a href="/charset">Unicode</a> characters',
-               "while pressing ⌥ Option (Alt) with Apple's ABC Extended",
+               "while pressing ⌥ Option (Alt) with Apple's",
+               'ABC <em title="distinct from just ABC">Extended</em>',
                "(formerly US Extended and Extended Roman) layout",
                'on <abbr title="at least in Ventura 13.2">macOS</abbr>.',
                'Significant changes from standard',
                "(formerly US Extended and Extended Roman) layout",
                'on <abbr title="at least in Ventura 13.2">macOS</abbr>.',
                'Significant changes from standard',
diff --git a/keyboard/altgr/macos-nl.eng.inc.pl b/keyboard/altgr/macos-nl.eng.inc.pl
new file mode 100644 (file)
index 0000000..1cb96e3
--- /dev/null
@@ -0,0 +1,38 @@
+use utf8;
+use strict;
+use warnings;
+use Shiar_Sheet::KeyboardChars 'kbchars';
+
+my $inherit = 'keyboard/altgr/macos.eng.inc.pl';
+do $inherit or warn "$inherit: ", $@ || $!;
+
+our %rows = (%rows,
+       '@' => '™',
+       '2' => '€',
+       'E' => '‰', # R
+       'R' => 'Â', # M
+       'T' => 'Ê',
+       'U' => 'Ë',
+       'I' => 'È',
+       'G' => 'Ì',
+       '~' => 'Ÿ',
+       'Z' => 'Û',
+       'X' => 'Ù',
+       'N' => "\N{MODIFIER LETTER CIRCUMFLEX ACCENT}",
+       'M' => "\N{SMALL TILDE}",
+);
+
++{
+       %{ Shiar_Sheet::KeyboardChars::kbchars(\%rows) },
+       version => '1.0',
+       title => 'Dutch option',
+       intro => join("\n",
+               'Special <a href="/unicode">characters</a>',
+               "when pressing ⌥ Option (Alt) with Apple's Dutch layout.",
+               q{Not to be confused with <a href="/keyboard/altgr">Windows'</a> AltGr keys.},
+       ),
+       description => [
+               "Apple Dutch keyboard layout table",
+               "with the Option modifier key.",
+       ],
+}
index 15b0a7f67be42ab6a1671c4777424dc8fab6f368..b62c871462d3014a1bd6cbd7780eab258b6fb37e 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 use Shiar_Sheet::KeyboardChars 'kbchars';
 
 use warnings;
 use Shiar_Sheet::KeyboardChars 'kbchars';
 
-my %rows = (
+our %rows = (
        'A' => 'Å',
        'a' => 'å',
        'B' => 'ı',
        'A' => 'Å',
        'a' => 'å',
        'B' => 'ı',
@@ -25,7 +25,7 @@ my %rows = (
        'J' => 'Ô',
        'j' => '∆',
        'K' => '',
        'J' => 'Ô',
        'j' => '∆',
        'K' => '',
-       'k' => '°',
+       'k' => '˚', # really
        'L' => 'Ò',
        'l' => '¬',
        'M' => 'Â',
        'L' => 'Ò',
        'l' => '¬',
        'M' => 'Â',
@@ -53,7 +53,7 @@ my %rows = (
        'X' => "\N{OGONEK}",
        'x' => '≈',
        'Y' => 'Á',
        'X' => "\N{OGONEK}",
        'x' => '≈',
        'Y' => 'Á',
-       'y' => '¥',
+       'y' => '¥', # terminal substitutes \
        'Z' => "\N{CEDILLA}",
        'z' => 'Ω',
        '[' => "\N{LEFT DOUBLE QUOTATION MARK}",
        'Z' => "\N{CEDILLA}",
        'z' => 'Ω',
        '[' => "\N{LEFT DOUBLE QUOTATION MARK}",
@@ -102,7 +102,7 @@ my %rows = (
 
 +{
        %{ kbchars(\%rows) },
 
 +{
        %{ kbchars(\%rows) },
-       version => '1.3',
+       version => '1.4',
        title => 'US option',
        category => '2/latin/macos',
        intro => join("\n",
        title => 'US option',
        category => '2/latin/macos',
        intro => join("\n",
index 3bcf5d1b35d220276baeb1019e6a02d4d4a412f2..dd4a5b55c29f870a7923250816e938fe09a92e0a 100644 (file)
@@ -124,13 +124,13 @@ if (exists $get{compat}) {
 my $groups = kbchars(\%rows);
 
 # replace rare punctuation distinctions by symbols
 my $groups = kbchars(\%rows);
 
 # replace rare punctuation distinctions by symbols
-$groups->{def}{''}{$_} =~ s/g[78]/g6/ for keys %rows;
+$groups->{def}{''}{$_}[0] =~ s/g[78]/g6/ for keys %rows;
 
 
-$groups->{def}{''}{$_} = 'g7'
+$groups->{def}{''}{$_}[0] = 'g7'
        for grep { $rows{$_} =~ /[\x{2500}-\x{259F}]/ } keys %rows;
 $groups->{flag}{g7} = ['drawing', 'box drawing or block elements'];
 
        for grep { $rows{$_} =~ /[\x{2500}-\x{259F}]/ } keys %rows;
 $groups->{flag}{g7} = ['drawing', 'box drawing or block elements'];
 
-$groups->{def}{''}{$_} = 'g8' for keys %compat; # mostly U+1FBxx
+$groups->{def}{''}{$_}[0] = 'g8' for keys %compat; # mostly U+1FBxx
 $groups->{flag}{g8} = ['legacy',
        'drawing symbols best represented by Unicode 13.0'
        . (exists $get{compat} && ', converted to compatible equivalents')
 $groups->{flag}{g8} = ['legacy',
        'drawing symbols best represented by Unicode 13.0'
        . (exists $get{compat} && ', converted to compatible equivalents')
@@ -140,12 +140,15 @@ $groups->{flag}{g8} = ['legacy',
        %{ $groups },
        version => '1.0',
        title => 'MSX graph',
        %{ $groups },
        version => '1.0',
        title => 'MSX graph',
-       category => 'legacy/msx',
+       category => 'legacy/graph/msx',
        intro => join("\n",
                'Resulting <a href="/unicode">selection</a>',
                'of equivalent <a href="/charset">Unicode</a> characters',
                "when the <em>graph</em> key is pressed on an MSX home computer",
                "(International model such as Toshiba HX10 or Phillips NMS 8245).",
        intro => join("\n",
                'Resulting <a href="/unicode">selection</a>',
                'of equivalent <a href="/charset">Unicode</a> characters',
                "when the <em>graph</em> key is pressed on an MSX home computer",
                "(International model such as Toshiba HX10 or Phillips NMS 8245).",
+               'Similar to <a href="/keyboard/altgr/c64">PETSCII</a>,',
+               '<a href="/keyboard/altgr/atari">ATASCII</a>, and',
+               '<a href="/keyboard/altgr/unigraph">modern Unicode</a>.',
                'See also <a href="/keyboard/altgr/msx">letters and symbols</a>',
                "from pressing <em>code</em>.",
        ),
                'See also <a href="/keyboard/altgr/msx">letters and symbols</a>',
                "from pressing <em>code</em>.",
        ),
index a7d8c0bfcb75ba517a6489f9744e429cb116dca7..95ce772cd570ab01c73623d6cc4dea5874222ec3 100644 (file)
@@ -91,7 +91,7 @@ my %uc = (
 );
 
 my $groups = kbchars({%rows, %uc});
 );
 
 my $groups = kbchars({%rows, %uc});
-$groups->{def}{''}{$_} .= ' ext' for keys %uc;
+$groups->{def}{''}{$_}[0] .= ' ext' for keys %uc;
 $groups->{flag}{ext} = ['anachrone', 'expected uppercase variants if allowed by charset'];
 
 +{
 $groups->{flag}{ext} = ['anachrone', 'expected uppercase variants if allowed by charset'];
 
 +{
index 3d72e36306565aa8355b3fd7b52c6a3637a1891e..e67d8e75963b5ba055606b23245abf14d7185c3a 100644 (file)
@@ -64,11 +64,10 @@ my %shift = (
        qw( { [  } ]  " '  | \  < ,  > .  ? /  ` 3  ~ = ),
        (map {uc, lc} qw[ r t y u i o p  h j  m  ]),
 );
        qw( { [  } ]  " '  | \  < ,  > .  ? /  ` 3  ~ = ),
        (map {uc, lc} qw[ r t y u i o p  h j  m  ]),
 );
-$rows{$_} = $rows{ $shift{$_} } for keys %shift; # alias shifted
+$rows{$_} = \$shift{$_} for keys %shift; # alias shifted
 
 my $groups = kbchars(\%rows);
 $groups->{flag}{ext} = ['alias', 'identical results from unshifted key'];
 
 my $groups = kbchars(\%rows);
 $groups->{flag}{ext} = ['alias', 'identical results from unshifted key'];
-$groups->{def}{''}{$_} .= ' ext' for keys %shift; # mark aliases
 
 +{
        %{ $groups },
 
 +{
        %{ $groups },
index 740dd35275ff25869890670bf4c9fb095a4501e1..de6c23256e2938a08afccd404f8b62e635bcfb78 100644 (file)
@@ -90,7 +90,7 @@ my %rows = (
 );
 
 my $groups = kbchars(\%rows);
 );
 
 my $groups = kbchars(\%rows);
-$rows{$_} =~ /\A\p{Greek}/ and $groups->{def}{''}{$_} =~ s/g6/g5/ for map {"+$_"} 'a'..'z';
+$rows{$_} =~ /\A\p{Greek}/ and $groups->{def}{''}{$_}[0] =~ s/g6/g5/ for map {"+$_"} 'a'..'z';
 $groups->{flag}{g4} = ['similar', 'transliterates or transcribes an expected letter'];
 $groups->{flag}{g5} = ['greek', 'different Greek letters or symbols'];
 
 $groups->{flag}{g4} = ['similar', 'transliterates or transcribes an expected letter'];
 $groups->{flag}{g5} = ['greek', 'different Greek letters or symbols'];
 
index b0c3a1ebf2479a02ab4e75bece23d0e25ee51adc..94407f93ee70b06ffce949765fd6309fd665c27d 100644 (file)
@@ -107,11 +107,11 @@ my %rows = (
 );
 
 my $groups = kbchars(\%rows);
 );
 
 my $groups = kbchars(\%rows);
-$groups->{flag}->{g5} = [greek =>
+$groups->{flag}{g5} = [greek =>
        "a different greek letter not corresponding with latin transcription"
 ];
 while (my ($key, $chr) = each %rows) {
        "a different greek letter not corresponding with latin transcription"
 ];
 while (my ($key, $chr) = each %rows) {
-       $groups->{def}->{''}->{$key} =~ s/g6/g5/ if $chr =~ /\A\p{Greek}/;
+       $groups->{def}{''}{$key}[0] =~ s/g6/g5/ if $chr =~ /\A\p{Greek}/;
 }
 
 +{
 }
 
 +{
index 6a8e9148949bfc100fa9ca61a69aa6d30ac91209..972c01e2dcc5bb2567300ae0a7f2df502cf79ee8 100644 (file)
@@ -3,56 +3,72 @@ use strict;
 use warnings;
 use Shiar_Sheet::KeyboardChars 'kbchars';
 
 use warnings;
 use Shiar_Sheet::KeyboardChars 'kbchars';
 
-my %rows = (
-       '~' => '¦',
+my %win = (
+       '`' => '¦',
+       '~' => "\N{COMBINING GRAVE ACCENT}", # uk ¬ originally unshifted
+       '2' => "\N{COMBINING DIAERESIS}",
+       '4' => '€',
+       '6' => "\N{COMBINING CIRCUMFLEX ACCENT}",
+       'W' => 'Ẃ',
+       'w' => 'ẃ',
+       'E' => 'É',
+       'e' => 'é',
+       'Y' => 'Ý',
+       'y' => 'ý',
+       'U' => 'Ú',
+       'u' => 'ú',
+       'I' => 'Í',
+       'i' => 'í',
+       'O' => 'Ó',
+       'o' => 'ó',
+       'A' => 'Á',
+       'a' => 'á',
+       #'"' => '`',
+       "'" => "\N{COMBINING ACUTE ACCENT}",
+       '\\'=> "\N{COMBINING TILDE}", # uk #
+       'C' => 'Ç',
+       'c' => 'ç',
+);
+
+my %dup = (
+       # aliases to unmodified keys
+       '7' => '{',
+       '8' => '[',
+       '9' => ']',
+       '0' => '}',
+       '-' => '\\',
+       'q' => '@',
+       'K' => '&',
+);
+
+my %rows = (%win, %dup,
        '!' => '¡',
        '1' => '¹',
        '@' => '½', # uk "
        '!' => '¡',
        '1' => '¹',
        '@' => '½', # uk "
-       '2' => "\N{COMBINING DIAERESIS}",
        '#' => '⅓', # uk £
        '3' => '³',
        '$' => '¼',
        '#' => '⅓', # uk £
        '3' => '³',
        '$' => '¼',
-       '4' => '€',
        '%' => '⅜',
        '%' => '⅜',
-       '5' => ',
+       '5' => \'@',
        '^' => '⅝',
        '^' => '⅝',
-       '6' => "\N{COMBINING CIRCUMFLEX ACCENT}",
        '&' => '⅞',
        '&' => '⅞',
-       '7' => '{',
        '*' => '™',
        '*' => '™',
-       '8' => '[',
        '(' => '±',
        '(' => '±',
-       '9' => ']',
        ')' => '°',
        ')' => '°',
-       '0' => '}',
        '_' => '¿',
        '_' => '¿',
-       '-' => '\\',
        '+' => "\N{COMBINING OGONEK}",
        '=' => "\N{COMBINING CEDILLA}",
        'Q' => 'Ω',
        '+' => "\N{COMBINING OGONEK}",
        '=' => "\N{COMBINING CEDILLA}",
        'Q' => 'Ω',
-       'q' => '@',
-       'W' => 'Ẃ',
-       'w' => 'ẃ',
-       'E' => 'É',
-       'e' => 'é',
        'R' => '®',
        'r' => '¶',
        'T' => 'Ŧ',
        't' => 'ŧ',
        'R' => '®',
        'r' => '¶',
        'T' => 'Ŧ',
        't' => 'ŧ',
-       'Y' => 'Ý',
-       'y' => 'ý',
-       'U' => 'Ú',
-       'u' => 'ú',
-       'I' => 'Í',
-       'i' => 'í',
-       'O' => 'Ó',
-       'o' => 'ó',
        'P' => 'Þ',
        'p' => 'þ',
        '{' => "\N{COMBINING RING ABOVE}",
        'P' => 'Þ',
        'p' => 'þ',
        '{' => "\N{COMBINING RING ABOVE}",
-       '}' => "\N{COMBINING MACRON}",
-       'A' => 'Á',
-       'a' => 'á',
+       '}' => "\N{COMBINING MACRON}", # originally |
+       '[' => \'2',
+       ']' => \'\\',
        'S' => '§',
        's' => 'ß',
        'D' => 'Ð',
        'S' => '§',
        's' => 'ß',
        'D' => 'Ð',
@@ -65,24 +81,17 @@ my %rows = (
        'h' => 'ħ',
        'J' => "\N{COMBINING HORN}",
        'j' => "\N{COMBINING HOOK ABOVE}",
        'h' => 'ħ',
        'J' => "\N{COMBINING HORN}",
        'j' => "\N{COMBINING HOOK ABOVE}",
-       'K' => '&',
        'k' => 'ĸ',
        'L' => 'Ł',
        'l' => 'ł',
        ':' => "\N{COMBINING DOUBLE ACUTE ACCENT}",
        'k' => 'ĸ',
        'L' => 'Ł',
        'l' => 'ł',
        ':' => "\N{COMBINING DOUBLE ACUTE ACCENT}",
-       ';' => "\N{COMBINING ACUTE ACCENT}",
+       ';' => \"'",
        '"' => "\N{COMBINING CARON}", # uk @
        '"' => "\N{COMBINING CARON}", # uk @
-       "'" => "\N{COMBINING ACUTE ACCENT}", # same as ;?
-       '|' => "\N{COMBINING TILDE}",
-       '\\'=> "\N{COMBINING BREVE}",
-       '~' => "\N{COMBINING GRAVE ACCENT}",
-       '`' => '¦',
-       'Z' => '<',
+       '|' => "\N{COMBINING BREVE}", # uk ~ originally \
+       'Z' => '‹',
        'z' => '«',
        'z' => '«',
-       'X' => '>',
+       'X' => '',
        'x' => '»',
        'x' => '»',
-       'C' => 'Ç',
-       'c' => 'ç',
        'V' => '‘',
        'v' => '“',
        'B' => '’',
        'V' => '‘',
        'v' => '“',
        'B' => '’',
@@ -98,18 +107,22 @@ my %rows = (
        '?' => "\N{COMBINING DOT ABOVE}",
        '/' => "\N{COMBINING DOT BELOW}",
 );
        '?' => "\N{COMBINING DOT ABOVE}",
        '/' => "\N{COMBINING DOT BELOW}",
 );
-$rows{'['} = $rows{'2'};
-$rows{']'} = $rows{'#'};
+
+my $groups = kbchars(\%rows);
+
+$_->[0] .= ' ext'  for @{ $groups->{def}{''} }{keys %dup};
+$_->[0] .= ' more' for @{ $groups->{def}{''} }{keys %win};
+$groups->{flag}{more} = ['windows', "only a small subset is present on Microsoft's layout"];
 
 +{
 
 +{
-       %{ kbchars(\%rows) },
+       %{$groups},
        title => 'UK-extended',
        category => 'latin/thirdparty',
        title => 'UK-extended',
        category => 'latin/thirdparty',
-       version => '1.0',
+       version => '1.1',
        intro => join("\n",
        intro => join("\n",
-               "A Chrome OS extension",
+               "A Chrome OS extension and Xorg option",
                "expanding on Windows' UK Extended QWERTY keyboard.",
                "expanding on Windows' UK Extended QWERTY keyboard.",
-               'Similar to the <a href="/keyboard/altgr">US international</a> variant.',
+               'Distinct from the <a href="/keyboard/altgr/windows">US international</a> variant.',
        ),
        description => [
                "Google UK-Extended keyboard layout table for Chrome OS",
        ),
        description => [
                "Google UK-Extended keyboard layout table for Chrome OS",
diff --git a/keyboard/altgr/unigraph.eng.inc.pl b/keyboard/altgr/unigraph.eng.inc.pl
new file mode 100644 (file)
index 0000000..7c4d570
--- /dev/null
@@ -0,0 +1,93 @@
+use utf8;
+use strict;
+use warnings;
+no  warnings 'qw';
+use Shiar_Sheet::KeyboardChars 'kbchars';
+
+my %guys = qw{
+       ! 🐀 @ 🐂 # 🐅 $ 🐇 % 🐉 ^ 🐍 & 🐎 * 🐐 ( 🐒 ) 🐓 _ 🐕 + 🐖
+       1 ♙  2 ♖  3 ♘  4 ♗  5 ♕  6 ♔  7 ♚  8 ♛  9 ♝  0 ♞  -  ♜ = ♟
+};
+
+my %rows = qw`
+       +- ♠ += ♥ ++ ♦ +_ ♣
+       ) ☺ +) ☹ 0 ☻  +6 ✂  +0 ☼  ^ ⚐ 6 ⚑
+       +! ○ +1 ●  +@ □ +2 ■  +# ☆ +3 ★
+       - ✗ = ✓  _ ✘ + ✔  +^ ☓
+
+       q ↖ w ↑ e ↗  Q ⇖ W ⇑ E ⇗  +q ◤ +w ▲ +e ◥  +Q ◸ +W △ +E ◹
+       a ← s ↔ d →  A ⇐ S ⇔ D ⇒  +a ◀ +s ◆ +d ▶  +A ◁ +S ◇ +D ▷
+       z ↙ x ↓ c ↘  Z ⇙ X ⇓ C ⇘  +z ◣ +x ▼ +c ◢  +Z ◺ +X ▽ +C ◿
+       1 ⤡ 2 ↕ 3 ⤢  ! ◄ @ ⇕ # ►
+
+       r ┌ t ┬ y ┐  R ╔ T ╦ Y ╗  +u ╭ +i ╷ +o ╮
+       f ├ g ┼ h ┤  F ╠ G ╬ H ╣  +j ╶ +k 🮯 +l ╴
+       v └ b ┴ n ┘  V ╚ B ╩ N ╝  +m ╰ +, ╵ +. ╯
+       4 ─ 5 │      $ ═ % ║
+       { ⋯ | ⋮ \\ · P ⋰ } ⋱      +| ⁙ +" ⁘
+       [ ╳          p ╱ ] ╲
+       +[ ┄ +4 ╌ +$ ┈  +\\ ┆ +5 ╎ +% ┊
+
+       +r ╒ +R ╓ +t ╤ +T ╥ +y ╕ +Y ╖
+       +f ╞ +F ╟ +g ╪ +G ╫ +h ╡ +H ╢
+       +v ╘ +V ╙ +b ╧ +B ╨ +n ╛ +N ╜
+
+       ' ▬ " ▮
+       > ▛ . ▘ , ▀ M ▜ m ▝
+       l ▌ ( ▚ k █ & ▞ j ▐  ; ▎ : ▊  +; 🮇 +: 🮊
+       O ▙ o ▖ i ▄ U ▟ u ▗  / ▂ ? ▆  +/ 🮂 +? 🮅
+       7 ░ 8 ▒ 9 ▓
+       +p 🮙 +] 🮘  +8 🮕 +* 🮖  +{ 🮗
+       I 🭯 < 🭭 J 🭮 L 🭬  * 🮚 K 🮛
+
+       +U 🮣 +I 🮦 +O 🮢  +7 🮫 +9 🮪
+       +J 🮥 +K 🮮 +L 🮤  +P 🮨 +} 🮩
+       +M 🮡 +< 🮧 +> 🮠  +& 🮬 +( 🮭
+`;
+
+$rows{' '} = "\N{FIGURE SPACE}";
+
+my $groups = kbchars(\%rows);
+
+use Encode 'decode';
+my %cpcompat = (
+       # lower cp437 representations from charset-encoding excluding BEL/BS/CR/LF
+       (map {$_ => 'g3'} split //, '☺☻♥♦♣♠○♂♀♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼'),
+       # upper characters converted to unicode
+       (map {$_ => 'g4'} split //, decode('cp437', pack 'C*', 127..255)),
+       (map {$_ => 'g2'} split //, decode('cp850', pack 'C*', 127..255)),
+);
+
+while (my ($k, $c) = each %rows) {
+       $groups->{def}{''}{$k}[0] = $cpcompat{$c} // (
+               $c =~ /\p{In=1.1}/ ? 'g5' :
+               $c =~ /\p{In=6.0}/ ? 'g6' :
+               $c =~ /[\x{1FB00}-\x{1FBFF}]/ ? 'g7' : # Age=V13.0
+               'g0'
+       );
+}
+$groups->{def}{''}{')'}[0] .= ' linkkeyboard/altgr/zoo';
+
++{
+       %{ $groups },
+       version => '1.2',
+       title => 'Unicode semigraphics',
+       category => 'specialized/graph',
+       intro => join("\n",
+               sprintf('Keyboard mode to %s draw character graphics.',
+                       '<span title="without requiring a specialised editor">manually</span>',
+               ),
+               'Inspired by <a href="/keyboard/altgr/msx-graph">MSX graph</a> mode,',
+               'but reimagined for modern Unicode coverage.',
+               'Freely available as <a href="/keyboard/symbols/unigraph">xorg symbols</a> export.',
+       ),
+       moderows => '5421',
+       flag => {
+               g2 => ['cp850'    => 'shared international repetoire in most DOS code pages'],
+               g3 => ['historic' => 'extended graphics presentations of control characters in cp437 ea'],
+               g4 => ['cp437'    => '<em>ANSI art</em> drawing glyphs in English code page 437 (OEM-US)'],
+               g5 => ['standard' => 'gathered in the original Unicode release in 1993'],
+               g6 => ['extended' => 'later additions accumulated within a decade, mostly Unicode 3.2'],
+               g7 => ['rare'     => 'exceptional <em>symbols for legacy computing</em> in Unicode since <abbr title="Unicode 13.0">2020</abbr>'],
+       },
+}
diff --git a/keyboard/altgr/weur.eng.inc.pl b/keyboard/altgr/weur.eng.inc.pl
new file mode 100644 (file)
index 0000000..8d5a390
--- /dev/null
@@ -0,0 +1,192 @@
+use utf8;
+use strict;
+use warnings;
+no warnings 'qw';
+use Shiar_Sheet::KeyboardChars 'kbmodes';
+
+my %rows = (
+       '' => {
+               '!'  => "\N{COMBINING DOT ABOVE}",
+               '"'  => "\N{COMBINING DIAERESIS}",
+               '#'  => "\N{COMBINING MACRON}",
+               '$'  => '¥',
+               '%'  => '£',
+               '&'  => '‚',
+               "'"  => "\N{COMBINING ACUTE ACCENT}",
+               '('  => '‘',
+               ')'  => '’',
+               '*'  => 'µ',
+               '+'  => "\N{COMBINING RING ABOVE}",
+               ','  => "\N{COMBINING CEDILLA}",
+               '-'  => '–',
+               '.'  => 'œ',
+               '/'  => '¿',
+               '0'  => '”',
+               '1'  => '¡',
+               '2'  => '²',
+               '3'  => '³',
+               '4'  => '¢',
+               '5'  => '€',
+               '6'  => "\N{COMBINING CIRCUMFLEX ACCENT}",
+               '7'  => '„',
+               '8'  => 'ß',
+               '9'  => '“',
+               ':'  => 'Ô',
+               ';'  => 'ô',
+               '<'  => "\N{COMBINING OGONEK}",
+               '='  => '°',
+               '>'  => 'Œ',
+               '?'  => "\N{COMBINING SHORT STROKE OVERLAY}",
+               '@'  => "\N{COMBINING DOUBLE ACUTE ACCENT}",
+               '['  => '«',
+               "\\" => 'ij',
+               ']'  => '»',
+               '^'  => "\N{COMBINING CARON}",
+               '_'  => '—',
+               '`'  => "\N{COMBINING GRAVE ACCENT}",
+               'a'  => 'ä',
+               'A'  => 'Ä',
+               'B'  => 'Õ',
+               'b'  => 'õ',
+               'C'  => 'Ç',
+               'c'  => 'ç',
+               'D'  => 'É',
+               'd'  => 'é',
+               'e'  => 'ë',
+               'E'  => 'Ë',
+               'F'  => 'Ê',
+               'f'  => 'ê',
+               'G'  => 'Î',
+               'g'  => 'î',
+               'h'  => 'û',
+               'H'  => 'Û',
+               'I'  => 'Ï',
+               'i'  => 'ï',
+               'j'  => 'ú',
+               'J'  => 'Ú',
+               'k'  => 'í',
+               'K'  => 'Í',
+               'L'  => 'Ó',
+               'l'  => 'ó',
+               'm'  => 'ì',
+               'M'  => 'Ì',
+               'n'  => 'ñ',
+               'N'  => 'Ñ',
+               'o'  => 'ö',
+               'O'  => 'Ö',
+               'P'  => 'Ò',
+               'p'  => 'ò',
+               'Q'  => 'Å',
+               'q'  => 'å',
+               'R'  => 'È',
+               'r'  => 'è',
+               'S'  => 'À',
+               's'  => 'à',
+               'T'  => 'Ø',
+               't'  => 'ø',
+               'u'  => 'ü',
+               'U'  => 'Ü',
+               'v'  => 'ã',
+               'V'  => 'Ã',
+               'W'  => 'Æ',
+               'w'  => 'æ',
+               'x'  => 'â',
+               'X'  => 'Â',
+               'Y'  => 'Ù',
+               'y'  => 'ù',
+               'z'  => 'á',
+               'Z'  => 'Á',
+               '{'  => '‹',
+               '|'  => 'IJ',
+               '}'  => '›',
+               '~'  => "\N{COMBINING TILDE}",
+       },
+       '*' => {
+               # dead_greek digraphs from data/xorg-compose
+               'A' => 'Α',
+               'a' => 'α',
+               'B' => 'Β',
+               'b' => 'β',
+               'D' => 'Δ',
+               'd' => 'δ',
+               'E' => 'Ε',
+               'e' => 'ε',
+               'F' => 'Φ',
+               'f' => 'φ',
+               'G' => 'Γ',
+               'g' => 'γ',
+               'H' => 'Η',
+               'h' => 'η',
+               'I' => 'Ι',
+               'i' => 'ι',
+               'J' => 'Θ',
+               'j' => 'θ',
+               'K' => 'Κ',
+               'k' => 'κ',
+               'L' => 'Λ',
+               'l' => 'λ',
+               'M' => 'Μ',
+               'm' => 'μ',
+               'N' => 'Ν',
+               'n' => 'ν',
+               'O' => 'Ο',
+               'o' => 'ο',
+               'P' => 'Π',
+               'p' => 'π',
+               'Q' => 'Χ',
+               'q' => 'χ',
+               'R' => 'Ρ',
+               'r' => 'ρ',
+               'S' => 'Σ',
+               's' => 'σ',
+               'T' => 'Τ',
+               't' => 'τ',
+               'U' => 'Υ',
+               'u' => 'υ',
+               'W' => 'Ω',
+               'w' => 'ω',
+               'X' => 'Ξ',
+               'x' => 'ξ',
+               'Y' => 'Ψ',
+               'y' => 'ψ',
+               'Z' => 'Ζ',
+               'z' => 'ζ',
+               '*' => 'µ', # MICRO SIGN at space and double mode
+       },
+);
+
+our %get;
+my $dweur = $get{map} && $get{map} eq 'dvorak';
+if ($dweur) {
+       my $dq = q{
+               'z ,l .d pj yk  fq gt  r, l'
+               dv hb s8  tw 8.
+               ;s qp jr ky xm  bx m; wf vh zg
+       };
+       my %dq = split //, $dq =~ s/\s//gr;  # dvorak => qwerty key
+
+       my %uc = (qw{ ' "  , <  . >  ; :  - _  8 * }, map {lc, uc} 'a'..'z');
+       $dq{ $uc{$_} } = $uc{ $dq{$_} } for keys %dq;  # same shifted
+
+       @{ $rows{''} }{keys %dq} = map { $rows{''}{$_} } values %dq;
+       $rows{S} = delete $rows{'*'};
+}
+
++{
+       %{ kbmodes(\%rows) },
+       mode => {
+               ''  => 'altgr-shifted ⌥',
+               '*' => 'μ greek prefix ⌥*',
+       },
+       version => '1.0', # upstream v2.0 2021/04/12
+       title => $dweur ? 'dWEURak' : 'Western European',
+       category => 'latin/thirdparty/xorg',
+       intro => join("\n",
+               'Layout (<a href="https://altgr-weur.eu/" target=_blank>available</a> for major OSes)',
+               'to provide all accented characters commonly used',
+               'in 10 Western European languages available through one AltGr keystroke.',
+       ),
+       description => [
+               "QWERTY for Western European languages",
+       ],
+}
index eb021b7148b8e8323594f81c2b3a01ba0108c204..512b6fbcead1ed4edb097941ec543a04f2da8a48 100644 (file)
@@ -75,7 +75,7 @@ my %rows = (
 );
 
 my $groups = kbchars(\%rows);
 );
 
 my $groups = kbchars(\%rows);
-$groups->{def}{''}{$_} .= ' ext' for keys %xkb;
+$groups->{def}{''}{$_}[0] .= ' ext' for keys %xkb;
 $groups->{flag}{ext} = ['xkb', 'unofficial extensions added in Linux (Gnome, KDE)'];
 
 +{
 $groups->{flag}{ext} = ['xkb', 'unofficial extensions added in Linux (Gnome, KDE)'];
 
 +{
diff --git a/keyboard/altgr/xipa.eng.inc.pl b/keyboard/altgr/xipa.eng.inc.pl
new file mode 100644 (file)
index 0000000..7a86363
--- /dev/null
@@ -0,0 +1,330 @@
+use utf8;
+use strict;
+use warnings;
+use Shiar_Sheet::KeyboardChars 'kbmodes';
+
+my %rows = (
+       '' => {
+               "'" => "\N{COMBINING INVERTED BREVE BELOW}",
+               "?" => "ʔ", # was at -
+               "<" => "ʲ", # was at ;
+               "=" => "↗",
+               ">" => "ˤ", # was at [
+               "\\"=> "\N{COMBINING VERTICAL LINE BELOW}",
+               "]" => "ː",
+               "§" => "|",
+
+               '"' => "\N{COMBINING RING BELOW}",
+               "+" => "↘",
+               ":" => "ʷ",
+               "A" => "ɑ",
+               "B" => "β",
+               "C" => "ç",
+               "D" => "ð",
+               "E" => "ə",
+               "F" => "ɸ",
+               "G" => "ɣ",
+               "H" => "ɦ",
+               "I" => "ɪ",
+               "J" => "ʝ",
+               "K" => "ʰ",
+               "L" => "ʎ",
+               "M" => "ɱ",
+               "N" => "ŋ",
+               "O" => "ɔ",
+               "P" => "\N{COMBINING TILDE}",
+               "Q" => "ɜ",
+               "R" => "ɾ",
+               "S" => "ʃ",
+               "T" => "θ",
+               "U" => "ʊ",
+               "V" => "ʋ",
+               "W" => "ʍ",
+               "X" => "χ",
+               "Z" => "ʒ",
+               "Y" => "ʏ",
+               "{" => "\N{COMBINING TILDE BELOW}",
+               "|" => "ˈ",
+               "}" => "ˑ",
+               "~" => "~",
+               "±" => "‖",
+       },
+
+       '!' => {
+               "!" => "¡",
+               '"' => "\N{COMBINING CARON}",
+               "#" => "£",
+               '$' => "¤",
+               "%" => "⅜",
+               "&" => "⅞",
+               "'" => "\N{COMBINING CARON BELOW}",
+               "(" => "⸩",
+               ")" => "°",
+               "*" => "⸨",
+               "+" => "ꜛ",
+               "," => "·",
+               "-" => "\\",
+               "." => "…",
+               "/" => "–",
+               "0" => "}",
+               "1" => "¹",
+               "2" => "²",
+               "3" => "³",
+               "4" => "¼",
+               "5" => "\N{COMBINING MACRON BELOW}",
+               "6" => "\N{COMBINING BREVE BELOW}",
+               "7" => "{",
+               "8" => "[",
+               "9" => "]",
+               ":" => "ʸ",
+               ";" => "ˠ",
+               "<" => "×",
+               "=" => "ꜜ",
+               ">" => "÷",
+               "?" => "—",
+               '@' => "⅛",
+               "[" => "\N{COMBINING DIAERESIS}",
+               "\\"=> "ˌ",
+               "]" => "\N{COMBINING MINUS SIGN BELOW}",
+               "^" => "⅝",
+               "_" => "¿",
+               "`" => "′",
+               "a" => "æ",
+               "A" => "ɒ",
+               "b" => "ʙ",
+               "B" => "ɓ",
+               "c" => "ɕ",
+               "C" => "ȼ",
+               "D" => "ɗ",
+               "d" => "ɖ",
+               "e" => "ɛ",
+               "E" => "ɜ",
+               "G" => "ɠ",
+               "g" => "ɢ",
+               "H" => "ʜ",
+               "h" => "ɧ",
+               "I" => "ɤ",
+               "i" => "ɨ",
+               "j" => "ɟ",
+               "J" => "ʄ",
+               "K" => "ʞ",
+               "k" => "ʱ",
+               "l" => "ɫ",
+               "L" => "ɬ",
+               "m" => "µ",
+               "M" => "⋅",
+               "n" => "ɲ",
+               "N" => "ɳ",
+               "O" => "œ",
+               "o" => "ø",
+               "p" => "\N{COMBINING PLUS SIGN BELOW}",
+               "P" => "‸",
+               "Q" => "Ω",
+               "q" => "§", # was @
+               "r" => "ʁ",
+               "R" => "ʀ",
+               "S" => "ʆ",
+               "t" => "ʈ",
+               "u" => "ʉ",
+               "U" => "ʌ",
+               "V" => "ɴ",
+               "v" => "ⱱ",
+               "w" => "ɰ",
+               "X" => "‹",
+               "x" => "«",
+               "z" => "ʑ",
+               "Z" => "ʓ",
+               "y" => "»",
+               "Y" => "›",
+               "{" => "\N{COMBINING X ABOVE}",
+               "|" => "\N{COMBINING BREVE}",
+               "}" => "\N{COMBINING MACRON}",
+               "~" => "″",
+               "§" => "‿",
+               "±" => "\N{COMBINING DOUBLE BREVE BELOW}",
+       },
+
+       '@' => {
+               "!" => "\N{COMBINING DOUBLE ACUTE ACCENT}",
+               '"' => "\N{COMBINING CEDILLA}",
+               "#" => "\N{COMBINING MACRON}",
+               '$' => "\N{COMBINING GRAVE ACCENT}",
+               "%" => "\N{COMBINING DOUBLE GRAVE ACCENT}",
+               "&" => "\N{COMBINING COMMA ABOVE}",
+               "'" => "\N{COMBINING LEFT ANGLE ABOVE}",
+               ")" => "≠",
+               "*" => "\N{COMBINING CIRCUMFLEX ACCENT BELOW}",
+               "+" => "*",
+               "," => "†",
+               "-" => "ʕ",
+               "." => "•",
+               "/" => "‑",
+               "0" => "ʾ",
+               "1" => "˥",
+               "2" => "˦",
+               "3" => "˧",
+               "4" => "˨",
+               "5" => "˩",
+               "6" => "\N{COMBINING DOT BELOW}",
+               "7" => "\N{COMBINING DOT ABOVE}",
+               "8" => "⟨",
+               "9" => "⟩",
+               ":" => "ˡ",
+               ";" => "ⁿ",
+               "<" => "‡",
+               "=" => "ʿ",
+               "?" => "­",
+               '@' => "\N{COMBINING ACUTE ACCENT}",
+               "[" => "\N{COMBINING SQUARE BELOW}",
+               "\\"=> "ʼ",
+               "]" => "\N{COMBINING SEAGULL BELOW}",
+               "^" => "\N{COMBINING INVERTED BREVE}",
+               "_" => "ʡ",
+               "`" => "⁓",
+               "A" => "ɶ",
+               "a" => "ɐ",
+               "b" => "“",
+               "B" => "‘",
+               "c" => "ꜣ",
+               "C" => "Ꜣ",
+               "D" => "\N{COMBINING RIGHT HALF RING BELOW}",
+               "d" => "ᶑ",
+               "e" => "ɘ",
+               "g" => "ʛ",
+               "G" => "ɡ",
+               "h" => "ħ",
+               "i" => "ɵ",
+               "I" => "ʫ",
+               "K" => "ꞎ",
+               "l" => "ʟ",
+               "L" => "ɭ",
+               "M" => "ǃ",
+               "m" => "ʘ",
+               "n" => "”",
+               "N" => "’",
+               "o" => "\N{COMBINING BRIDGE BELOW}",
+               "O" => "ɞ",
+               "p" => "\N{COMBINING INVERTED BRIDGE BELOW}",
+               "q" => "˞",
+               "R" => "ɻ",
+               "r" => "ɹ",
+               "S" => "\N{COMBINING LEFT HALF RING BELOW}",
+               "s" => "ʂ",
+               "t" => "ǀ",
+               "T" => "ǁ",
+               "U" => "ʪ",
+               "u" => "ɞ",
+               "V" => "‚",
+               "v" => "„",
+               "w" => "ɯ",
+               "x" => "ꜥ",
+               "X" => "Ꜥ",
+               "z" => "ʐ",
+               "Z" => "ɮ",
+               "y" => "ɥ",
+               "{" => "ˀ",
+               "|" => "\N{COMBINING OGONEK}",
+               "§" => "\N{COMBINING DOUBLE INVERTED BREVE}",
+       },
+
+       "#" => {
+               "\"" => "\N{COMBINING DOUBLE VERTICAL LINE BELOW}",
+               "#"  => "\N{COMBINING DOUBLE VERTICAL LINE BELOW}",
+               "\$" => "\N{COMBINING BRIDGE BELOW}",
+               "%"  => "\N{COMBINING EQUALS SIGN BELOW}",
+               "&"  => "˭",
+               "'"  => "\N{COMBINING HOMOTHETIC ABOVE}",
+               "("  => "\N{COMBINING RIGHT ARROWHEAD BELOW}",
+               ")"  => "\N{COMBINING UPWARDS ARROW BELOW}",
+               "*"  => "\N{COMBINING LEFT ARROWHEAD BELOW}",
+               "+"  => "↑",
+               "-"  => "ʢ",
+               "/"  => "‐",
+               "0"  => "≈",
+               "2"  => "○",
+               "8"  => "⟪",
+               "9"  => "⟫",
+               ":"  => "\N{COMBINING LEFT RIGHT ARROW BELOW}",
+               ";"  => "\N{COMBINING ALMOST EQUAL TO ABOVE}",
+               "="  => "↓",
+               "?"  => "−",
+               "\@" => "\N{COMBINING ENCLOSING CIRCLE}",
+               "["  => "ˁ",
+               "\\" => "\N{COMBINING NOT TILDE ABOVE}",
+               "^"  => "ˬ",
+               "_"  => "\N{COMBINING DOUBLE RIGHTWARDS ARROW BELOW}",
+               "`"  => "―",
+               "A"  => "A",
+               "a"  => "\N{COMBINING DOWN TACK BELOW}",
+               "B"  => "B",
+               "b"  => "ʘ",
+               "c"  => "ʖ",
+               "C"  => "C",
+               "d"  => "\N{COMBINING RIGHT TACK BELOW}",
+               "D"  => "D",
+               "E"  => "E",
+               "e"  => "€",
+               "F"  => "F",
+               "f"  => "ʩ",
+               "g"  => "₸",
+               "G"  => "G",
+               "H"  => "H",
+               "h"  => "₴",
+               "i"  => "☟",
+               "I"  => "I",
+               "J"  => "J",
+               "k"  => "ℓ",
+               "K"  => "K",
+               "l"  => "ɺ",
+               "L"  => "L",
+               "M"  => "M",
+               "m"  => "₼",
+               "n"  => "ǃ",
+               "N"  => "N",
+               "O"  => "O",
+               "o"  => "☞",
+               "P"  => "P",
+               "p"  => "𝔓",
+               "Q"  => "Q",
+               "q"  => "₽",
+               "r"  => "ɽ",
+               "R"  => "R",
+               "S"  => "S",
+               "s"  => "\N{COMBINING LEFT TACK BELOW}",
+               "t"  => "ǂ",
+               "T"  => "T",
+               "U"  => "U",
+               "u"  => "☝",
+               "V"  => "V",
+               "w"  => "\N{COMBINING UP TACK BELOW}",
+               "W"  => "W",
+               "X"  => "X",
+               "x"  => "ʗ",
+               "y"  => "☜",
+               "Y"  => "Z",
+               "z"  => "ʇ",
+               "Z"  => "Y",
+               "{"  => "ʬ",
+               "|"  => "\N{COMBINING LEFT ANGLE BELOW}",
+               "}"  => "ʭ",
+               "~"  => "^",
+       },
+);
+
++{
+       %{ kbmodes(\%rows) },
+       version => '1.0',
+       title => 'X-IPA',
+       category => 'specialised/ipa',
+       intro => join("\n",
+               'An input to type phonetic (IPA) <a href="/unicode">unicode</a>',
+               'characters, available Xorg map <em>trans</em>.',
+               'Designed separately from the more well-known SIL',
+               'or <a href="/keyboard/altgr/ipa-ucl">UCL</a> implementations.',
+       ),
+       description => [
+               "Table of an Xorg keyboard for transcribing",
+               "in the International Phonetic Alphabet",
+               "with the AltGr modifier key.",
+       ],
+}
diff --git a/keyboard/altgr/zoo.eng.inc.pl b/keyboard/altgr/zoo.eng.inc.pl
new file mode 100644 (file)
index 0000000..be03e0a
--- /dev/null
@@ -0,0 +1,162 @@
+use utf8;
+use strict;
+use warnings;
+no  warnings 'qw';
+use Shiar_Sheet::KeyboardChars 'kbchars';
+
+my %rows = qw(
+       a  🐒Apey_monkey
+       A  🐜Ant
+       +a 🕷Arachnid
+       +A 🐵Apey_face
+       b  🐇Bunny
+       B  🐦Bird
+       +b 🦡Badger
+       +B 🐰Bunny_face
+       c  🐈Cat
+       C  🐊CroC
+       +c 🦀Crab
+       +C 🐱Cat_face
+       d  🐕Dog
+       D  🦆Duck
+       +d 🐩pooDle_Dog
+       +D 🐶Dog_face
+       e  🐘Elephant
+       E  🦅Eagle
+       +e 🦣Elder_Elephant_or_mammoth
+       f  🐟Fish
+       F  🪰Fly
+       +f 🦩Flamingo
+       +F 🐸Frog_Face
+       g  🐐Goat
+       G  🦍Gorilla
+       +g 🪿Goose
+       +G 🦒Giraffe_face
+       h  🐎Horse
+       H  🐝Honeybee
+       +h 🦔HedgeHog
+       +H 🐴Horse_face
+       i  🐛Insect
+       I  🐿chIpmunk_or_squIrrel
+       +i 🪲beetle_Insect
+       +I 🦄unIcorn_face
+       j  🪼Jelly
+       J  🐬dolphin_Jumping
+       +j 🦐Jrimp
+       k  🐨Koala
+       K  🦨sKunK
+       +k 🦘Kangaroo
+       +K 🐼fake_Koala_face_(panda)
+       l  🦎Lizard
+       L  🦙LLama
+       +l 🐆Leopard
+       +L 🦁Lion_face
+       m  🐁Mouse
+       M  🦠Microbe
+       +m 🫏Mule_or_donkey
+       +M 🐭Mouse_face
+       n  🐌sNail
+       N  🦛Nile_hippo
+       +n 🦞Nephropid_lobster
+       o  🦉Owl
+       O  🦦Otter
+       +o 🦧Orangutan
+       +O 🫎mOOOse
+       p  🐖Pig
+       P  🐧Penguin
+       +p 🦜Parrot
+       +P 🐷Pig_face
+       q  🦑sQuid
+       Q  🦟Mosquito
+       +q 🦚peaQoQ
+       r  🐀Rat
+       R  🦏Rhino
+       +r 🪳Roach
+       +R 🐹Rodent_hamster_face
+       s  🐍SSSnail
+       S  🦂Scorpion
+       +s 🦈Shark
+       +S 🦭Seal_face
+       t  🐢TurTle
+       T  🐅Tiger
+       +t 🦃Turkey
+       +T 🐯Tiger_face
+       u  🐙octopUs
+       U  🐫hUmped_camel
+       +u 🐪hUmped_dromedary
+       +U 🐻Ursus_face
+       v  🦇Vampire_in_bat_form
+       V  🕊doVe
+       +v 🦫beaVer,_kurVa!
+       w  🐋Whale
+       W  🪱Worm
+       +w 🐃Water_buffalo
+       +W 🐺Wolf_face
+       x  🦖reX
+       X  🐂oX
+       +x 🦤eXtinct_dodo
+       +X 🦊foX_face
+       y  🐞ladYbug
+       Y  🦋butterflY
+       +y 🦪oYster
+       z  🐑zzz_sheep
+       Z  🐏zzz_ram
+       +z 🦥Zzzloth
+       +Z 🦓Zebra_face
+       ,  🐔<:_chicken
+       <  🐓<:_rooster
+       +, 🐤<:_chicklet
+       +< 🐥<:_chicklet_face
+
+       >  🦢swan??
+       ;  🐉dragon
+       :  🦕sauropod
+       +; 🪸coral??
+       +: 🐲dragon_face
+       +> 🦝raccoon_trash_Panda
+       .  🐗wild_Pig
+
+       [  🐄horned_cow
+       {  🦌horned_deer
+       +[ 🦬horned_bison
+       +{ 🐮cow_face
+);
+s/.\K/\n/, y/_/ / for values %rows;
+
+#      🐠tropical_fish
+#      🐡blowfish??
+
+my $groups = kbchars(\%rows);
+
+while (my ($k, $c) = each %rows) {
+       $c =~ s/\n.*//;
+       $groups->{def}{''}{$k}[0] = (
+               $c =~ /\p{In=1.1}/ ? 'g2' :
+               $c =~ /\p{In=6.0}/ ? 'g3' :
+               $c =~ /\p{In=8.0}/ ? 'g4' :
+               $c =~ /\p{In=10.0}/ ? 'g5' :
+               $c =~ /\p{In=10.0}/ ? 'g6' :
+               'g7'
+       );
+}
+
++{
+       %{ $groups },
+       version => '1.1',
+       title => 'Unicode animals',
+       category => 'specialized',
+       intro => join("\n",
+               "Collecting all emoji animals as of Unicode 11.0",
+               "with English mnemonics as AltGr mode.",
+               'Because who needs <a href="/keyboard/altgr">letters</a>',
+               'or <a href="/keyboard/altgr/emojiworks">other emoji</a>',
+               'when you have direct access to all these critters and creatures.',
+       ),
+       moderows => '5421-',
+       flag => {
+               g3 => ['initial'  => 'initial emoji in Unicode 6.0'],
+               g4 => ['8.0'      => 'added in Unicode 7 or 8 (2015)'],
+               g5 => ['10.0'     => 'added in Unicode 9 or 10 (2017)'],
+               g7 => ['later'    => 'Unicode 11.0 or above'],
+       },
+}
index 9000189d42a76152cb675cc93e155b9f068d55a8..b73c34fce33781c0e6453551d2f5d742255ea4e3 100644 (file)
@@ -11,113 +11,6 @@ description => [
 keywords => [qw' less keys pager more options '],
 rows => [1, 0],
 
 keywords => [qw' less keys pager more options '],
 rows => [1, 0],
 
-key => {
-       "\e"=> "alt<>/meta",
-
-       'b' => "page up",
-       'd' => 'scroll down',
-       'f' => "page down",
-       'F' => "follow\nForward Forever",
-       'g' => "(first) line",
-       'G' => "last line",
-       'h' => "help",
-       'j' => "<down>",
-       'k' => "<up>",
-       'm' => "mark pos<>ition",
-       'n' => "next find",
-       'N' => "prev find",
-       'p' => "reset position\nbeginning or Percentage",
-       'q' => "quit",
-       'r' => "redraw",
-       'R' => "refresh",
-       's' => "save to file",
-       't' => "next tag",
-       'T' => "prev tag",
-       'u' => 'scroll up',
-       'v' => "edit",
-       'V' => "version",
-       'w' => "page up and set window",
-       '^x'=> "emacs aliases",
-       'z' => "set page down",
-
-       '!' => "shell command",
-       '|' => "pipe till mark",
-       ':' => "com<>mand",
-       '/' => "find",
-       '?' => "find rev.",
-       '&' => "filter match<>es",
-       "'" => "goto mark",
-       '-' => "toggle option",
-       '_' => "show option",
-       '=' => "file name",
-       '+' => "initial cmd",
-
-       '(' => "closing",
-
-       "^[\e"=> "noop",
-       '^[n' => "any next find",
-       '^[N' => "any prev find",
-       '^[u' => "mark search\nUndo",
-       '^[(' => "scroll left",
-       '^[)' => "scroll right",
-
-       ":\e"=> "noop",
-       ':d' => "drop file",
-       ':e' => "open file",
-       ':n' => "next file",
-       ':p' => "prev file",
-       ':x' => "first file",
-
-       "-\e"=> "noop",
-       '-a' => "advance find page",
-       '-b' => "buffer space",
-       '-B' => "static buffer for pipes",
-       '-c' => "clear on scroll",
-       '-d' => "dumb term<>inal",
-       '-D' => "dos colours",
-       '-e' => "exit after eof",
-       '-E' => "exit at eof",
-       '-f' => "force open",
-       '-F' => "exit if 1 page",
-       '-g' => "hilight last match",
-       '-h' => "scroll back limit",
-       '-i' => "ignore lower<>c<>ase",
-       '-I' => "ignore case",
-       '-j' => "top offset",
-       '-J' => "status column",
-       '-k' => "key bind<>ing<>s",
-       '-L' => qq[ignore <span style="font-variant:small-caps">lesso<>pen</span> filter],
-       '-m' => "med. promp<>t tog<>gle",
-       '-M' => "long promp<>t tog<>gle",
-       '-n' => "count line num<>ber<>s",
-       '-N' => "show line n<>um<>ber<>s",
-       '-o' => "stdin to log",
-       '-O' => "log over<>wr<>ite",
-       '-p' => "initial search",
-       '-P' => "status line\nPrompt",
-       '-q' => "no info bell\nQuiet",
-       '-Q' => "no warn bell\nQuiet!",
-       '-r' => "raw chars",
-       '-R' => "ansi chars",
-       '-s' => "squeeze blank lines",
-       '-S' => "no line wrap",
-       '-t' => "find tag",
-       '-T' => "tags file",
-       '-u' => 'parse \b \r',
-       '-U' => 'escape \t \b \r',
-       '-w' => "hilight page d<>own",
-       '-W' => "hilight forw<>ard",
-       '-x' => "tab stops",
-       '-X' => "no termcap init",
-       '-y' => "scroll limit fw<>d",
-       '-z' => "page size",
-       '-"' => "shell quotes",
-       '-~' => "outside tildes toggle",
-       '-#' => "col shift",
-       '--' => "option name",
-       '-+' => "reset option",
-},
-
 mode => {
        ''   => 'normal pager',
        '^[' => 'escape keys (hold meta/alt)',
 mode => {
        ''   => 'normal pager',
        '^[' => 'escape keys (hold meta/alt)',
@@ -139,150 +32,150 @@ flag => {
 
 def => {
        '' => {
 
 def => {
        '' => {
-               "\e"=> 'g7 mode^[',
-
-               'b' => 'g2 more',
-               '^b'=> '=b',
-               'd' => 'g2 more',
-               '^d'=> '=d',
-               'e' => '=j',
-               '^e'=> '=j',
-               'f' => 'g2 more',
-               '^f'=> '=f',
-               'F' => 'g7',
-               'g' => 'g2',
-               '^g'=> '==',
-               'G' => 'g2',
-               'h' => 'g7 more',
-               'H' => '=h',
-               'j' => 'g2',
-               'k' => 'g2',
-               '^k'=> '=k',
-               '^l'=> '=r', # more
-               'm' => 'g3 arg',
-               '^m'=> '=j',
-               'n' => 'g4 more',
-               'N' => 'g4',
-               '^n'=> '=j',
-               'p' => 'g2',
-               '^p'=> '=k',
-               'q' => 'g8 more',
-               'Q' => '=q',
-               'r' => 'g1',
-               '^r'=> '=r',
-               'R' => 'g1',
-               's' => 'g8 arg',
-               't' => 'g4',
-               'T' => 'g4',
-               'u' => 'g2',
-               '^u'=> '=u',
-               'v' => 'g8 linkvi more',
-               '^v'=> '=f',
-               'V' => 'g1',
-               'w' => 'g2',
-               '^x'=> 'g8 arg mode^x',
-               'y' => '=k',
-               '^y'=> '=k',
-               'z' => 'g2 more',
-
-               '!' => 'g8 more',
-               '|' => 'g8 arg',
-               ':' => 'g8 arg mode:',
-               '/' => 'g4 arg more',
-               '?' => 'g4 arg',
-               '%' => '=p',
-               '&' => 'g4 arg',
-               "'" => 'g3 arg',
-               '-' => 'g8 arg mode-',
-               '_' => 'g1 arg mode-',
-               '=' => 'g1 more',
-               '+' => 'g7',
-
-               '(' => 'g4',
-               '<' => '=g',
-               '>' => '=G',
+               "\e"=> ['g7 mode^[', "alt<>/meta"],
+
+               'b' => ['g2 more', "page up"],
+               '^b'=> \'b',
+               'd' => ['g2 more', 'scroll down'],
+               '^d'=> \'d',
+               'e' => \'j',
+               '^e'=> \'j',
+               'f' => ['g2 more', "page down"],
+               '^f'=> \'f',
+               'F' => ['g7', "follow\nForward Forever"],
+               'g' => ['g2', "(first) line"],
+               '^g'=> \'=',
+               'G' => ['g2', "last line"],
+               'h' => ['g7 more', "help"],
+               'H' => \'h',
+               'j' => ['g2', "<down>"],
+               'k' => ['g2', "<up>"],
+               '^k'=> \'k',
+               '^l'=> \'r', # more
+               'm' => ['g3 arg', "mark pos<>ition"],
+               '^m'=> \'j',
+               'n' => ['g4 more', "next find"],
+               'N' => ['g4', "prev find"],
+               '^n'=> \'j',
+               'p' => ['g2', "reset position\nbeginning or Percentage"],
+               '^p'=> \'k',
+               'q' => ['g8 more', "quit"],
+               'Q' => \'q',
+               'r' => ['g1', "redraw"],
+               '^r'=> \'r',
+               'R' => ['g1', "refresh"],
+               's' => ['g8 arg', "save to file"],
+               't' => ['g4', "next tag"],
+               'T' => ['g4', "prev tag"],
+               'u' => ['g2', 'scroll up'],
+               '^u'=> \'u',
+               'v' => ['g8 linkvi more', "edit"],
+               '^v'=> \'f',
+               'V' => ['g1', "version"],
+               'w' => ['g2', "page up and set window"],
+               '^x'=> ['g8 arg mode^x', "emacs aliases"],
+               'y' => \'k',
+               '^y'=> \'k',
+               'z' => ['g2 more', "set page down"],
+
+               '!' => ['g8 more', "shell command"],
+               '|' => ['g8 arg', "pipe till mark"],
+               ':' => ['g8 arg mode:', "com<>mand"],
+               '/' => ['g4 arg more', "find"],
+               '?' => ['g4 arg', "find rev."],
+               '%' => \'p',
+               '&' => ['g4 arg', "filter match<>es"],
+               "'" => ['g3 arg', "goto mark"],
+               '-' => ['g8 arg mode-', "toggle option"],
+               '_' => ['g1 arg mode-', "show option"],
+               '=' => ['g1 more', "file name"],
+               '+' => ['g7', "initial cmd"],
+
+               '(' => ['g4', "closing"],
+               '<' => \'g',
+               '>' => \'G',
        },
 
        '^[' => { # esc
        },
 
        '^[' => { # esc
-               "\e"=> 'g7 mode',
-               'n' => 'g4',
-               'N' => 'g4',
-               'u' => 'g1',
-               'v' => '=b',
-               '(' => 'g2',
-               ')' => 'g2',
-               '<' => '=g',
-               '>' => '=G',
+               "\e"=> ['g7 mode', "noop"],
+               'n' => ['g4', "any next find"],
+               'N' => ['g4', "any prev find"],
+               'u' => ['g1', "mark search\nUndo"],
+               'v' => \'b',
+               '(' => ['g2', "scroll left"],
+               ')' => ['g2', "scroll right"],
+               '<' => \'g',
+               '>' => \'G',
        },
 
        #'^x' => {
        #       "\e"=> 'g7 mode',
        },
 
        #'^x' => {
        #       "\e"=> 'g7 mode',
-       #       '^x' => "='",
-       #       '^v' => '=:e',
+       #       '^x' => \"'",
+       #       '^v' => \':e',
        #},
 
        ':' => {
        #},
 
        ':' => {
-               "\e"=> 'g7 mode',
-               'd' => 'g7',
-               'e' => 'g7',
-               'f' => '==',
-               'n' => 'g7 more',
-               'p' => 'g7 more',
-               'q' => '=q',
-               'Q' => '=:q',
-               'x' => 'g7',
+               "\e"=> ['g7 mode', "noop"],
+               'd' => ['g7', "drop file"],
+               'e' => ['g7', "open file"],
+               'f' => \'=',
+               'n' => ['g7 more', "next file"],
+               'p' => ['g7 more', "prev file"],
+               'q' => \'q',
+               'Q' => \':q',
+               'x' => ['g7', "first file"],
        },
 
        '-' => {
        },
 
        '-' => {
-               "\e"=> 'g7 mode',
-               'a' => 'g4',
-               'b' => 'g7 arg',
-               'B' => 'g7',
-               'c' => 'g2',
-               'd' => 'g8',
-               'D' => 'g8 arg ext',
-               'e' => 'g7',
-               'E' => 'g7',
-               'f' => 'g7',
-               'F' => 'g7',
-               'g' => 'g4',
-               'h' => 'g2 arg',
-               'i' => 'g4',
-               'I' => 'g4',
-               'j' => 'g3 arg',
-               'J' => 'g1',
-               'k' => 'g8 arg',
-               'L' => 'g8',
-               'm' => 'g1',
-               'M' => 'g1',
-               'n' => 'g8',
-               'N' => 'g1',
-               'o' => 'g8 arg',
-               'O' => 'g8 arg',
-               'p' => 'g4 arg',
-               'P' => 'g1 arg',
-               'q' => 'g8',
-               'Q' => 'g8',
-               'r' => 'g8',
-               'R' => 'g8',
-               's' => 'g8',
-               'S' => 'g8',
-               't' => 'g4 arg',
-               'T' => 'g4 arg',
-               'u' => 'g8',
-               'U' => 'g8',
-               'V' => '=V',
-               'w' => 'g8',
-               'W' => 'g8',
-               'x' => 'g8 arg',
-               'X' => 'g8',
-               'y' => 'g2 arg',
-               'z' => 'g2 arg',
-               '"' => 'g8 arg',
-               '~' => 'g8',
-               '#' => 'g2 arg',
-               '-' => 'g8 arg',
-               '+' => 'g8 arg',
+               "\e"=> ['g7 mode', "noop"],
+               'a' => ['g4', "advance find page"],
+               'b' => ['g7 arg', "buffer space"],
+               'B' => ['g7', "static buffer for pipes"],
+               'c' => ['g2', "clear on scroll"],
+               'd' => ['g8', "dumb term<>inal"],
+               'D' => ['g8 arg ext', "dos colours"],
+               'e' => ['g7', "exit after eof"],
+               'E' => ['g7', "exit at eof"],
+               'f' => ['g7', "force open"],
+               'F' => ['g7', "exit if 1 page"],
+               'g' => ['g4', "hilight last match"],
+               'h' => ['g2 arg', "scroll back limit"],
+               'i' => ['g4', "ignore lower<>c<>ase"],
+               'I' => ['g4', "ignore case"],
+               'j' => ['g3 arg', "top offset"],
+               'J' => ['g1', "status column"],
+               'k' => ['g8 arg', "key bind<>ing<>s"],
+               'L' => ['g8', qq[ignore <span style="font-variant:small-caps">lesso<>pen</span> filter]],
+               'm' => ['g1', "med. promp<>t tog<>gle"],
+               'M' => ['g1', "long promp<>t tog<>gle"],
+               'n' => ['g8', "count line num<>ber<>s"],
+               'N' => ['g1', "show line n<>um<>ber<>s"],
+               'o' => ['g8 arg', "stdin to log"],
+               'O' => ['g8 arg', "log over<>wr<>ite"],
+               'p' => ['g4 arg', "initial search"],
+               'P' => ['g1 arg', "status line\nPrompt"],
+               'q' => ['g8', "no info bell\nQuiet"],
+               'Q' => ['g8', "no warn bell\nQuiet!"],
+               'r' => ['g8', "raw chars"],
+               'R' => ['g8', "ansi chars"],
+               's' => ['g8', "squeeze blank lines"],
+               'S' => ['g8', "no line wrap"],
+               't' => ['g4 arg', "find tag"],
+               'T' => ['g4 arg', "tags file"],
+               'u' => ['g8', 'parse \b \r'],
+               'U' => ['g8', 'escape \t \b \r'],
+               'V' => \'V',
+               'w' => ['g8', "hilight page d<>own"],
+               'W' => ['g8', "hilight forw<>ard"],
+               'x' => ['g8 arg', "tab stops"],
+               'X' => ['g8', "no termcap init"],
+               'y' => ['g2 arg', "scroll limit fw<>d"],
+               'z' => ['g2 arg', "page size"],
+               '"' => ['g8 arg', "shell quotes"],
+               '~' => ['g8', "outside tildes toggle"],
+               '#' => ['g2 arg', "col shift"],
+               '-' => ['g8 arg', "option name"],
+               '+' => ['g8 arg', "reset option"],
        },
 },
 }
        },
 },
 }
index 9568ed8513adaeb09384c5e7a0752fada3b5ddd6..c34cd7456e9aaa30e7263d2911f017b0e7084969 100644 (file)
@@ -14,56 +14,6 @@ description => [
 keywords => [qw'mpv mplayer mplayer2 media player video audio'],
 rows => [1, 0],
 
 keywords => [qw'mpv mplayer mplayer2 media player video audio'],
 rows => [1, 0],
 
-key => {
-       '[' => "slow down 10%",
-       ']' => "speed up 10%",
-       '{' => "half speed",
-       '}' => "double speed",
-       '<' => "previous file",
-       '>' => "next file",
-       'p' => "pause",
-       '.' => "step forward",
-       'q' => "stop and quit",
-       '+' => "audio delay +<>.1s", # +ctrl in mpv
-       '-' => "audio delay -<>.1s", # +ctrl in mpv
-       '/' => "volume decrease",
-       '*' => "volume increase",
-       'm' => "mute sound",
-       '#' => "cycle audio tr<>ack<>s",
-       'f' => "full<>screen",
-       'T' => "stay on top",
-       'w' => "pan/sc. decr<>eas<>e",
-       'e' => "pan/scan increase",
-       'o' => "osd state switch",
-       'd' => "frame drop mode",
-       'v' => "subtitle visibility",
-       'b' => "next sub<>title",
-       'j' => "prev<>ious sub<>title",
-       'g' => "back in sub<>title<>s list",
-       'y' => "forward in sub<>title<>s list",
-       'F' => "forced subtitles",
-       'a' => "align subtitles",
-       'c' => "cycle fs mode",
-       'n' => "restore video mode",
-       'x' => "subtitle delay +<>.1<>s",
-       'z' => "subtitle delay -<>.1<>s",
-       'r' => "subtitles up",
-       't' => "subtitles down",
-       's' => "screen<>shot\n-vf screenshot",
-       'S' => "record screen<>shot<>s\n-vf screenshot",
-       'I' => "filename",
-       '!' => "chapter back", # also pgdn in mpv
-       '@' => "chapter forward", # also pgup in mpv
-       '1' => "contrast less",
-       '2' => "contrast more",
-       '3' => "brighter",
-       '4' => "darker",
-       '5' => "hue to red",
-       '6' => "hue to blue",
-       '7' => "saturate",
-       '8' => "de<>saturate",
-},
-
 mode => {
        '' => "interactive control",
 },
 mode => {
        '' => "interactive control",
 },
@@ -82,56 +32,56 @@ flag => {
 
 def => {
        '' => {
 
 def => {
        '' => {
-               "\e"=> 'q',
-               '[' => 'g7',
-               ']' => 'g7',
-               '{' => 'g7',
-               '}' => 'g7',
-               '<' => 'g9',
-               '>' => 'g9',
-               'p' => 'g7',
-               '.' => 'g7',
-               'q' => 'g9',
-               '+' => 'g6',
-               '-' => 'g6',
-               '/' => 'g6',
-               '*' => 'g6',
-               '9' => '=/',
-               '0' => '=*',
-               'm' => 'g6',
-               '#' => 'g6',
-               'f' => 'g4',
-               'T' => 'g4',
-               'w' => 'g4',
-               'e' => 'g4',
-               'o' => 'g1',
-               'd' => 'g4',
-               'v' => 'g2',
-               'b' => 'g2',
-               'j' => 'g2',
-               'y' => 'g2',
-               'g' => 'g2',
-               'F' => 'g2',
-               'a' => 'g2',
-               'c' => 'g4 ext',
-               'n' => 'g4 ext',
-               'x' => 'g2',
-               'z' => 'g2',
-               'r' => 'g2',
-               't' => 'g2',
-               's' => 'g9 ext',
-               'S' => 'g9 ext',
-               'I' => 'g1',
-               '!' => 'g7',
-               '@' => 'g7',
-               '1' => 'g4 ext',
-               '2' => 'g4 ext',
-               '3' => 'g4 ext',
-               '4' => 'g4 ext',
-               '5' => 'g4 ext',
-               '6' => 'g4 ext',
-               '7' => 'g4 ext',
-               '8' => 'g4 ext',
+               "\e"=> \'q',
+               '[' => ['g7', "slow down 10%"],
+               ']' => ['g7', "speed up 10%"],
+               '{' => ['g7', "half speed"],
+               '}' => ['g7', "double speed"],
+               '<' => ['g9', "previous file"],
+               '>' => ['g9', "next file"],
+               'p' => ['g7', "pause"],
+               '.' => ['g7', "step forward"],
+               'q' => ['g9', "stop and quit"],
+               '+' => ['g6', "audio delay +<>.1s"],
+               '-' => ['g6', "audio delay -<>.1s"],
+               '/' => ['g6', "volume decrease"],
+               '*' => ['g6', "volume increase"],
+               '9' => \'/',
+               '0' => \'*',
+               'm' => ['g6', "mute sound"],
+               '#' => ['g6', "cycle audio tr<>ack<>s"],
+               'f' => ['g4', "full<>screen"],
+               'T' => ['g4', "stay on top"],
+               'w' => ['g4', "pan/sc. decr<>eas<>e"],
+               'e' => ['g4', "pan/scan increase"],
+               'o' => ['g1', "osd state switch"],
+               'd' => ['g4', "frame drop mode"],
+               'v' => ['g2', "subtitle visibility"],
+               'b' => ['g2', "next sub<>title"],
+               'j' => ['g2', "prev<>ious sub<>title"],
+               'y' => ['g2', "forward in sub<>title<>s list"],
+               'g' => ['g2', "back in sub<>title<>s list"],
+               'F' => ['g2', "forced subtitles"],
+               'a' => ['g2', "align subtitles"],
+               'c' => ['g4 ext', "cycle fs mode"],
+               'n' => ['g4 ext', "restore video mode"],
+               'x' => ['g2', "subtitle delay +<>.1<>s"],
+               'z' => ['g2', "subtitle delay -<>.1<>s"],
+               'r' => ['g2', "subtitles up"],
+               't' => ['g2', "subtitles down"],
+               's' => ['g9 ext', "screen<>shot\n-vf screenshot"],
+               'S' => ['g9 ext', "record screen<>shot<>s\n-vf screenshot"],
+               'I' => ['g1', "filename"],
+               '!' => ['g7', "chapter back"], # also pgdn in mpv
+               '@' => ['g7', "chapter forward"], # also pgup in mpv
+               '1' => ['g4 ext', "contrast less"],
+               '2' => ['g4 ext', "contrast more"],
+               '3' => ['g4 ext', "brighter"],
+               '4' => ['g4 ext', "darker"],
+               '5' => ['g4 ext', "hue to red"],
+               '6' => ['g4 ext', "hue to blue"],
+               '7' => ['g4 ext', "saturate"],
+               '8' => ['g4 ext', "de<>saturate"],
        },
 },
 }
        },
 },
 }
index 11d4aff9224ba88c69e6de6557bb0fb3fce53f3a..2a3bc8b1f0f3cfbba5fd66d3f84af0cb14596de1 100644 (file)
@@ -1,6 +1,7 @@
 use utf8;
 
 my $legacy = do 'keyboard/mplayer.eng.inc.pl' or die $@;
 use utf8;
 
 my $legacy = do 'keyboard/mplayer.eng.inc.pl' or die $@;
+$legacy->{def}{''}{$_}[0] =~ s/ ext\b// for '1'..'8';
 
 {
 title => 'mpv',
 
 {
 title => 'mpv',
@@ -12,34 +13,6 @@ intro => join("\n",
 keywords => $legacy->{keywords},
 rows => [1, 0],
 
 keywords => $legacy->{keywords},
 rows => [1, 0],
 
-key => { %{ $legacy->{key} },
-       ',' => "step backward<>s",
-       'Q' => "save and quit",
-       '_' => "cycle video tr<>ack<>s",
-       '+' => "audio delay +<>.1s", # +ctrl in mpv
-       '-' => "audio delay -<>.1s", # +ctrl in mpv
-       'o' => "osd state switch",
-       'O' => "osd mode toggle",
-       'd' => "deint<>erlace",
-       'E' => "edition cycle",
-       'i' => "stats info",
-       'I' => "toggle stats info",
-       'j' => "next sub<>title",
-       'J' => "prev<>ious sub<>title",
-       'A' => "aspect override",
-       'u' => "subtitle style",
-       'V' => "subtitle aspect",
-       'l' => "A-B loop",
-       'L' => "infinite looping",
-       'S' => "record screen<>shot<>s\n-vf screenshot", # mpv?
-       '^s'=> "actual screen<>shot",
-       '5' => "gamma decrease",
-       '6' => "gamma increase",
-       'F' => 'enlarge sub font',
-       'G' => 'smaller sub font',
-       '`' => 'console',
-},
-
 mode => $legacy->{mode},
 
 flag => { %{ $legacy->{flag} },
 mode => $legacy->{mode},
 
 flag => { %{ $legacy->{flag} },
@@ -48,33 +21,41 @@ flag => { %{ $legacy->{flag} },
 
 def => {
        '' => { %{ $legacy->{def}->{''} },
 
 def => {
        '' => { %{ $legacy->{def}->{''} },
-               '`' => 'g9 arg new',
-               'b' => undef,
-               'g' => undef,
+               '+' => ['g6 new', "audio delay +<>.1s\n+control"], # +ctrl in mpv
+               '-' => ['g6 new', "audio delay -<>.1s\n+control"], # +ctrl in mpv
+               'd' => ['g4 new', "deint<>erlace"],
+               '5' => ['g4 new', "gamma decrease"], # replaces hue
+               '6' => ['g4 new', "gamma increase"], # replaces hue
+
                'y' => undef,
                'y' => undef,
-               'F' => 'g2 new',
-               'G' => 'g2 new',
+               'g' => undef,
+               'b' => undef,
+               'j' => ['g2 new', "next sub<>title"], # was b
+               'J' => ['g2 new', "prev<>ious sub<>title"], # was j
+
+               '`' => ['g9 arg new', 'console'],
+               'F' => ['g2 new', 'enlarge sub font'],
+               'G' => ['g2 new', 'smaller sub font'],
                'a' => undef,
                'c' => undef,
                'n' => undef,
                'a' => undef,
                'c' => undef,
                'n' => undef,
-               'i' => 'g1 new',
-               'I' => 'g1 new',
-               ',' => 'g7 new',
-               '_' => 'g4 new',
-               'Q' => 'g9 new',
-               'O' => 'g1 new',
-               'P' => '=o new',
-               'J' => 'g2 new',
-               'A' => 'g4 new',
-               'u' => 'g2 new',
-               'V' => 'g2 new',
-               'l' => 'g7 new',
-               'L' => 'g7 new',
-               'E' => 'g4 new',
-               '^s'=> 'g9 ext new',
-               'R' => '=t new',
-               'Z' => '=x new',
-               'W' => '=e new',
+               'i' => ['g1 new', "stats info"],
+               'I' => ['g1 new', "toggle stats info"],
+               ',' => ['g7 new', "step backward<>s"],
+               '_' => ['g4 new', "cycle video tr<>ack<>s"],
+               'Q' => ['g9 new', "save and quit"],
+               'O' => ['g1 new', "osd mode toggle"],
+               'P' => [new => \'o'],
+               'A' => ['g4 new', "aspect override"],
+               'u' => ['g2 new', "subtitle style"],
+               'V' => ['g2 new', "subtitle aspect"],
+               'l' => ['g7 new', "A-B loop"],
+               'L' => ['g7 new', "infinite looping"],
+               'E' => ['g4 new', "edition cycle"],
+               '^s'=> ['g9 ext new', "actual screen<>shot"],
+               'R' => [new => \'t'],
+               'Z' => [new => \'x'],
+               'W' => [new => \'e'],
        },
 },
 }
        },
 },
 }
index 4c94c09349a2af06d8afb51956217f1e09a003e3..bbafa6ddb655a1aca058f77db88fc41cdd759ce1 100644 (file)
@@ -1,61 +1,35 @@
 use utf8;
 
 use utf8;
 
-my %commonkey = (
-       'H' => "screen top",
-       'j' => "entry <down>",
-       'k' => "entry <up>",
-       'L' => "screen bottom",
-       '^l'=> "redraw",
-       'M' => "screen middle",
-       '^m'=> "select",
-       'n' => "search <down>",
-       'q' => "exit",
-       't' => "tag",
-       'z' => "page <down>",
-       'Z' => "page <up>",
-
-       '*' => "last entry",
-       '=' => "first entry",
-       ':' => "enter command",
-       ';' => "apply to tagged",
-       '>' => "line <down>",
-       '<' => "line <up>",
-       ']' => "half page <down>",
-       '[' => "half page <up>",
-       '?' => "help",
-       '!' => "invoke shell",
-       '/' => "search <down>",
-       '+/'=> "search <up>",
-);
+my $esc = ['g9 mode', '+']; # globally label escape as meta key
 
 my %commondef = (
 
 my %commondef = (
-       "\e"=> 'g9 mode',
+       "\e"=> $esc,
 
 
-       'H' => 'g2', # top-page
-       'j' => 'g2', # next-entry, next-undeleted
-       'k' => 'g2', # previous-entry, previous-undeleted
-       'L' => 'g2', # bottom-page
-       '^l'=> 'g1', # refresh
-       'M' => 'g2', # middle-page
-       '^m'=> 'g6 mode^m', # select-entry, display-message
-       'n' => 'g3', # search-next
-       'q' => 'g8 mode', # exit
-       't' => 'g4', # tag-entry
-       'z' => 'g2', # next-page
-       'Z' => 'g2', # previous-page
+       'H' => ['g2', "screen top"], # top-page
+       'j' => ['g2', "entry <down>"], # next-entry, next-undeleted
+       'k' => ['g2', "entry <up>"], # previous-entry, previous-undeleted
+       'L' => ['g2', "screen bottom"], # bottom-page
+       '^l'=> ['g1', "redraw"], # refresh
+       'M' => ['g2', "screen middle"], # middle-page
+       '^m'=> ['g6 mode^m', "select"], # select-entry, display-message
+       'n' => ['g3', "search <down>"], # search-next
+       'q' => ['g8 mode', "exit"], # exit
+       't' => ['g4', "tag"], # tag-entry
+       'z' => ['g2', "page <down>"], # next-page
+       'Z' => ['g2', "page <up>"], # previous-page
 
 
-       '*' => 'g2', # last-entry
-       '=' => 'g2', # first-entry
-       ':' => 'g6', # enter-command
-       ';' => 'g6 arg', # tag-prefix
-       '>' => 'g2', # next-line
-       '<' => 'g2', # previous-line
-       ']' => 'g2', # half-down
-       '[' => 'g2', # half-up
-       '?' => 'g1', # help
-       '!' => 'g1 arg', # shell
-       '/' => 'g3 arg mode/~', # search
-       '+/'=> 'g3 arg mode/~', # search
+       '*' => ['g2', "last entry"], # last-entry
+       '=' => ['g2', "first entry"], # first-entry
+       ':' => ['g6', "enter command"], # enter-command
+       ';' => ['g6 arg', "apply to tagged"], # tag-prefix
+       '>' => ['g2', "line <down>"], # next-line
+       '<' => ['g2', "line <up>"], # previous-line
+       ']' => ['g2', "half page <down>"], # half-down
+       '[' => ['g2', "half page <up>"], # half-up
+       '?' => ['g1', "help"], # help
+       '!' => ['g1 arg', "invoke shell"], # shell
+       '/' => ['g3 arg mode/~', "search <down>"], # search
+       '+/'=> ['g3 arg mode/~', "search <up>"], # search
 );
 
 {
 );
 
 {
@@ -67,199 +41,6 @@ description => [
 ],
 keywords => [qw' mutt MUA email client '],
 
 ],
 keywords => [qw' mutt MUA email client '],
 
-key => {
-       %commonkey,
-
-       '@' => "display sender",
-       '.' => "list new mail",
-       '|' => "pipe to shell",
-       '$' => "save mailbox",
-       '#' => "split up thread",
-       '&' => "thread tagged",
-       '%' => "toggle reado<>nl<>y",
-       '-' => "collapse thread",
-       '_' => "collapse all",
-       "'" => "marked mes<>sag<>e",
-       '~' => "save mark",
-
-       'a' => "create alias",
-       'b' => "bounce",
-       '^b'=> "url<>view",
-       '+b'=> "search bodies",
-       'c' => "open folder",
-       'C' => "copy messag<>e",
-       '+c'=> "open reado<>nly",
-       '+C'=> "make plain copy",
-       'd' => "delete",
-       'D' => "delete patt<>er<>n",
-       '^d'=> "delete thread",
-       '+d'=> "delete subthread",
-       'e' => "edit",
-       '^e'=> "edit con<>tent type",
-       '+e'=> "edit+send copy",
-       'f' => "forward",
-       'F' => "toggle important",
-       '^f'=> "forget pass<>phras<>e",
-       'g' => "reply to all\nGroup reply",
-       'G' => "fetch POP\nGather new mail",
-       'h' => "toggle headers",
-       'i' => "fetch IMAP",
-       '^i'=> "unread msg <down>",
-       '+^i'=> "unread msg <up>",
-       'j' => "messag<>e <down>",
-       'k' => "messag<>e <up>",
-       'J' => "any <down>",
-       'K' => "any <up>",
-       '^k'=> "extract pub keys",
-       '+k'=> "send public key",
-       'l' => "limit pattern",
-       'L' => "reply to list",
-       '+l'=> "mlist actions",
-       #'+l'=> "show current limit",
-       'm' => "compo<>s<>e mail",
-       'N' => "toggle new",
-       '^n'=> "thread <down>",
-       '+n'=> "subthr<>ead <down>",
-       'o' => "sort",
-       'O' => "sort reverse",
-       'p' => "print",
-       'P' => "to parent",
-       '^p'=> "thread <up>",
-       '+p'=> "subthr<>ead <up>",
-       '+P'=> "check for pgp",
-       'q' => "quit",
-       'Q' => "query addr<>ess<>es",
-       'r' => "reply to sender",
-       'R' => "recall postpon<>e<>d",
-       '^r'=> "mark thread read",
-       '+r'=> "mark sub<>thread r<>ead",
-       's' => "move",
-       '+s'=> "save and delete",
-       'T' => "tag patt<>er<>n",
-       '^t'=> "untag pattern",
-       '+t'=> "tag thread",
-       'u' => "undo delete",
-       'U' => "res<>tore pat<>t<>er<>n",
-       '^u'=> "restore thread",
-       '+u'=> "restore subthread",
-       'v' => "attach<>ments",
-       'V' => "version",
-       '+v'=> "(un)collapse thread",
-       '+V'=> "(un)collapse threads",
-       'w' => "set flag",
-       'W' => "clear flag",
-       'x' => "abort",
-       'y' => "list incoming mailboxes",
-       'Y' => "edit label",
-
-       (map { 'm'.$_ => $commonkey{$_} } keys %commonkey),
-
-       'm|' => "pipe attach<>m<>ent",
-       'ma' => "attach file",
-       'mA' => "attach messag<>e",
-       'm^b'=> "url<>view",
-       'mb' => "edit bcc",
-       'mc' => "edit cc",
-       'mC' => "copy file",
-       'md' => "desc<>ribe attach<>m<>ent",
-       'mD' => "delete attach<>m<>ent",
-       'm^d'=> "dispo<>sition tog<>gle",
-       'me' => "edit body",
-       'mE' => "edit all",
-       'm^e'=> "edit encoding",
-       'mf' => "edit fcc",
-       'm^f'=> "forget pass<>phrase",
-       'm+f'=> "edit from",
-       'mF' => "filter attach<>m<>ent",
-       'mG' => "get attach<>m<>ent",
-       'mh' => "display message",
-       'mi' => "run ispell",
-       'm+k'=> "attach PGP key",
-       'ml' => "print attach<>m<>ent",
-       'mm' => "edit attach<>m<>ent\nMime-appropriate open",
-       'mM' => "edit mix",
-       'm^m'=> "view attach<>m<>ent",
-       'mn' => "new attach<>m<>ent",
-       'mo' => "autocrypt toggle", #TODO
-       'm^o'=> "rename attach<>m<>ent",
-       'mp' => "PGP menu",
-       'mP' => "post<>pone",
-       'mr' => "edit reply<>-to",
-       'mR' => "rename attach<>m<>ent",
-       'ms' => "edit subject",
-       'mS' => "s/mime options",
-       'mt' => "edit to",
-       'mT' => "enter tags", #TODO
-       'm^t'=> "ctype attach<>m<>ent",
-       'mu' => "unlink toggle",
-       'mv' => "preview alt fil<>t<>er", # m+v mV
-       'mV' => "preview mailcap filter",
-       'mw' => "copy to folder",
-       'mU' => "encode attach<>m<>ent",
-       'my' => "send",
-       # ^xe
-
-       'wD' => "deleted",
-       'wN' => "new",
-       'wO' => "old",
-       'wr' => "replied",
-       'w*' => "tagged",
-       'w!' => "flagged",
-
-       '/~A' => "all",
-       '/~b' => "msg body",
-       '/~B' => "whole msg",
-       '/~c' => "cc address",
-       '/~C' => "to or cc address",
-       '/~d' => "date sent ran<>g<>e",
-       '/~D' => "deleted",
-       '/~e' => "sender",
-       '/~E' => "expired",
-       '/~f' => "from",
-       '/~F' => "flagged",
-       '/~g' => "signed",
-       '/~G' => "encryp<>ted",
-       '/~h' => "header",
-       '/~H' => "spam attr<>ib<>ute",
-       '/~i' => "msg id",
-       '/~k' => "pgp key",
-       '/~L' => "receiv<>d by",
-       '/~l' => "mailing list",
-       '/~m' => "num<>ber ran<>g<>e",
-       '/~M' => "mime type",
-       '/~n' => "score range",
-       '/~N' => "new",
-       '/~O' => "old",
-       '/~p' => "to you",
-       '/~P' => "by you",
-       '/~Q' => "replies",
-       '/~r' => "receive date ran<>ge",
-       '/~R' => "read",
-       '/~s' => "subject",
-       '/~S' => "super<>seded",
-       '/~t' => "to address",
-       '/~T' => "tagged",
-       '/~u' => "subscr<>ibed list",
-       '/~U' => "unread",
-       '/~v' => "collapsed thread",
-       '/~V' => "verified",
-       '/~x' => "refer<>ence",
-       '/~X' => "attach<>ments",
-       '/~y' => "x-label",
-       '/~z' => "size range",
-       '/~=' => "dupli<>cate",
-       '/~$' => "unrefer<>enced",
-       '/~(' => "in thread",
-       '/~<' => "parent match",
-       '/~>' => "child match",
-
-       # globally label escape as meta key
-         "\e"=> "+",
-        "m\e"=> "+",
-        "w\e"=> "+",
-       "/~\e"=> "+",
-},
-
 mode => {
        '' => 'index',
        'm' => 'compose (m)',
 mode => {
        '' => 'index',
        'm' => 'compose (m)',
@@ -284,200 +65,201 @@ def => {
        '' => {
                %commondef,
 
        '' => {
                %commondef,
 
-               '@' => 'g1', # display-address
-               '.' => 'g8', # buffy-list #TODO
-               '|' => 'g6', # pipe-message
-               '$' => 'g4', # sync-mailbox
-               '#' => 'g4', # break-thread
-               '&' => 'g4', # link-threads
-               '%' => 'g4', # toggle-write
-               '-' => 'g9',
-               '_' => 'g9',
-               '~' => 'g4 arg', # mark-message #TODO
-               "'" => 'g3 arg',
-               ' ' => '=^m',
+               '@' => ['g1', "display sender"], # display-address
+               '.' => ['g8', "list new mail"], # buffy-list #TODO
+               '|' => ['g6', "pipe to shell"], # pipe-message
+               '$' => ['g4', "save mailbox"], # sync-mailbox
+               '#' => ['g4', "split up thread"], # break-thread
+               '&' => ['g4', "thread tagged"], # link-threads
+               '%' => ['g4', "toggle reado<>nl<>y"], # toggle-write
+               '-' => ['g9', "collapse thread"],
+               '_' => ['g9', "collapse all"],
+               '~' => ['g4 arg', "save mark"], # mark-message #TODO
+               "'" => ['g3 arg', "marked mes<>sag<>e"],
+               ' ' => \'^m',
 
 
-               'a' => 'g6', # create-alias
-               'b' => 'g7', # bounce-message
-               '^b'=> 'g1',
-               '+b'=> undef, # M <search>~b
-               'c' => 'g8', # change-folder
-               'C' => 'g6', # copy-message
-               '+c'=> 'g8', # change-folder-readonly
-               '+C'=> undef, # decode-copy
-               'd' => 'g4', # delete-message
-               'D' => 'g4 arg mode/~', # delete-pattern
-               '^d'=> 'g4', # delete-thread
-               '+d'=> 'g4', # delete-subthread
-               'e' => 'g4 linkvi', # edit
-               '^e'=> 'g4', # edit-type
-               '+e'=> undef, # resend-message
-               'f' => 'g7 modem', # forward-message
-               'F' => 'g4', # flag-message
-               '^f'=> 'g6', # forget-passphrase
-               'g' => 'g7 modem', # group-reply
-               'G' => 'g6', # fetch-mail
-               'h' => 'g9', # display-toggle-weed
-               'i' => 'g6', # imap-fetch-mail
-               '^i'=> 'g3', # next-new-then-unread
-               '+^i'=> undef, # previous-new-then-unread
-               'j' => 'g2', # next-undeleted
-               'k' => 'g2', # previous-undeleted
-               'J' => 'g3', # next-entry
-               'K' => 'g3', # previous-entry
-               '^k'=> 'g1', # extract-keys
-               '+k'=> 'g7 modem', # mail-key
-               'l' => 'g9 arg mode/~', # limit
-               'L' => 'g7 modem', # list-reply
-               '+l'=> 'g1', # list-actions/show-limit
-               'm' => 'g7 modem', # mail
-               'N' => 'g4', # toggle-new
-               '^n'=> 'g3', # next-thread
-               '+n'=> 'g3', # next-subthread
-               'o' => 'g9 modeo', # sort-mailbox
-               'O' => 'g9 modeo', # sort-reverse
-               'p' => 'g1', # print-message
-               'P' => 'g3', # parent-message
-               '^p'=> 'g3', # previous-thread
-               '+p'=> 'g3', # previous-subthread
-               '+P'=> undef, # check-traditional-pgp
-               'q' => 'g8', # quit
-               'Q' => 'g1 arg', # query
-               'r' => 'g7 modem', # reply
-               'R' => 'g7 modem', # recall-message
-               '^r'=> 'g4', # read-thread
-               '+r'=> 'g4', # read-subthread
-               's' => 'g4', # save-message
-               '+s'=> 'g4', # decode-save
-               'T' => 'g4 arg mode/~', # tag-pattern
-               '^t'=> 'g4 arg mode/~', # untag-pattern
-               '+t'=> 'g4', # tag-thread
-               'u' => 'g4', # undelete-message
-               'U' => 'g4 arg mode/~', # undelete-pattern
-               '^u'=> 'g4', # undelete-thread
-               '+u'=> 'g4', # undelete-subthread
-               'v' => 'g1', # view-attachments
-               'V' => 'g1', # show-version
-               '+v'=> 'g9', # collapse-thread
-               '+V'=> 'g9', # collapse-all
-               'w' => 'g4 arg modew', # set-flag
-               'W' => 'g4 arg modew', # clear-flag
-               'x' => 'g8', # exit
-               'y' => 'g8', # M <change-folder>?<toggle-mailboxes>
-               'Y' => 'g4 arg', # edit-label
+               'a' => ['g6', "create alias"], # create-alias
+               'b' => ['g7', "bounce"], # bounce-message
+               '^b'=> ['g1', "url<>view"],
+               '+b'=> [undef, "search bodies"], # M <search>~b
+               'c' => ['g8', "open folder"], # change-folder
+               'C' => ['g6', "copy messag<>e"], # copy-message
+               '+c'=> ['g8', "open reado<>nly"], # change-folder-readonly
+               '+C'=> [undef, "make plain copy"], # decode-copy
+               'd' => ['g4', "delete"], # delete-message
+               'D' => ['g4 arg mode/~', "delete patt<>er<>n"], # delete-pattern
+               '^d'=> ['g4', "delete thread"], # delete-thread
+               '+d'=> ['g4', "delete subthread"], # delete-subthread
+               'e' => ['g4 linkvi', "edit"], # edit
+               '^e'=> ['g4', "edit con<>tent type"], # edit-type
+               '+e'=> [undef, "edit+send copy"], # resend-message
+               'f' => ['g7 modem', "forward"], # forward-message
+               'F' => ['g4', "toggle important"], # flag-message
+               '^f'=> ['g6', "forget pass<>phras<>e"], # forget-passphrase
+               'g' => ['g7 modem', "reply to all\nGroup reply"], # group-reply
+               'G' => ['g6', "fetch POP\nGather new mail"], # fetch-mail
+               'i' => ['g6', "fetch IMAP"], # imap-fetch-mail
+               '^i'=> ['g3', "unread msg <down>"], # next-new-then-unread
+               '+^i'=> [undef, "unread msg <up>"], # previous-new-then-unread
+               'j' => ['g2', "messag<>e <down>"], # next-undeleted
+               'k' => ['g2', "messag<>e <up>"], # previous-undeleted
+               'J' => ['g3', "any <down>"], # next-entry
+               'K' => ['g3', "any <up>"], # previous-entry
+               '^k'=> ['g1', "extract pub keys"], # extract-keys
+               '+k'=> ['g7 modem', "send public key"], # mail-key
+               'l' => ['g9 arg mode/~', "limit pattern"], # limit
+               'L' => ['g7 modem', "reply to list"], # list-reply
+               '+l'=> ['g1', "mlist actions"], # list-actions/show-limit
+               #'+l'=> [, "show current limit"],
+               'm' => ['g7 modem', "compo<>s<>e mail"], # mail
+               'N' => ['g4', "toggle new"], # toggle-new
+               '^n'=> ['g3', "thread <down>"], # next-thread
+               '+n'=> ['g3', "subthr<>ead <down>"], # next-subthread
+               'o' => ['g9 modeo', "sort"], # sort-mailbox
+               'O' => ['g9 modeo', "sort reverse"], # sort-reverse
+               'p' => ['g1', "print"], # print-message
+               'P' => ['g3', "to parent"], # parent-message
+               '^p'=> ['g3', "thread <up>"], # previous-thread
+               '+p'=> ['g3', "subthr<>ead <up>"], # previous-subthread
+               '+P'=> [undef, "check for pgp"], # check-traditional-pgp
+               'q' => ['g8', "quit"], # quit
+               'Q' => ['g1 arg', "query addr<>ess<>es"], # query
+               'r' => ['g7 modem', "reply to sender"], # reply
+               'R' => ['g7 modem', "recall postpon<>e<>d"], # recall-message
+               '^r'=> ['g4', "mark thread read"], # read-thread
+               '+r'=> ['g4', "mark sub<>thread r<>ead"], # read-subthread
+               's' => ['g4', "move"], # save-message
+               '+s'=> ['g4', "save and delete"], # decode-save
+               'T' => ['g4 arg mode/~', "tag patt<>er<>n"], # tag-pattern
+               '^t'=> ['g4 arg mode/~', "untag pattern"], # untag-pattern
+               '+t'=> ['g4', "tag thread"], # tag-thread
+               'u' => ['g4', "undo delete"], # undelete-message
+               'U' => ['g4 arg mode/~', "res<>tore pat<>t<>er<>n"], # undelete-pattern
+               '^u'=> ['g4', "restore thread"], # undelete-thread
+               '+u'=> ['g4', "restore subthread"], # undelete-subthread
+               'v' => ['g1', "attach<>ments"], # view-attachments
+               'V' => ['g1', "version"], # show-version
+               '+v'=> ['g9', "(un)collapse thread"], # collapse-thread
+               '+V'=> ['g9', "(un)collapse threads"], # collapse-all
+               'w' => ['g4 arg modew', "set flag"], # set-flag
+               'W' => ['g4 arg modew', "clear flag"], # clear-flag
+               'x' => ['g8', "abort"], # exit
+               'y' => ['g8', "list incoming mailboxes"], # M <change-folder>?<toggle-mailboxes>
+               'Y' => ['g4 arg', "edit label"], # edit-label
        }, # index
 
        'm' => {
                %commondef,
 
        }, # index
 
        'm' => {
                %commondef,
 
-               '|' => 'g4',
-               'a' => 'g4',
-               'A' => 'g4',
-               'b' => 'g4',
-               '^b'=> 'g1',
-               'c' => 'g4',
-               'C' => 'g6',
-               'd' => 'g4',
-               'D' => 'g4',
-               '^d'=> 'g4',
-               'e' => 'g4 linkvi',
-               'E' => 'g4 linkvi',
-               '^e'=> 'g4',
-               'f' => 'g4',
-               '^f'=> 'g6',
-               '+f'=> 'g4',
-               'F' => 'g4',
-               'G' => 'g1',
-               'h' => 'g1',
-               'i' => 'g6',
-               '+k'=> 'g4',
-               'l' => 'g1',
-               'm' => 'g4',
-               'M' => 'g4',
-               '^m'=> 'g1',
-               'n' => 'g6',
-               'o' => 'g4 ext',
-               '^o'=> 'g4',
-               'p' => 'g1', #TODO
-               'P' => 'g8 mode',
-               'r' => 'g4',
-               'R' => 'g4',
-               's' => 'g4',
-               'S' => 'g4 menumS',
-               't' => 'g4',
-               'T' => 'g4',
-               '^t'=> 'g4',
-               'w' => 'g6',
-               'u' => 'g6',
-               'v' => 'g1',
+               '|' => ['g4', "pipe attach<>m<>ent"],
+               'a' => ['g4', "attach file"],
+               'A' => ['g4', "attach messag<>e"],
+               'b' => ['g4', "edit bcc"],
+               '^b'=> ['g1', "url<>view"],
+               'c' => ['g4', "edit cc"],
+               'C' => ['g6', "copy file"],
+               'd' => ['g4', "desc<>ribe attach<>m<>ent"],
+               'D' => ['g4', "delete attach<>m<>ent"],
+               '^d'=> ['g4', "dispo<>sition tog<>gle"],
+               'e' => ['g4 linkvi', "edit body"],
+               'E' => ['g4 linkvi', "edit all"],
+               '^e'=> ['g4', "edit encoding"],
+               'f' => ['g4', "edit fcc"],
+               '^f'=> ['g6', "forget pass<>phrase"],
+               '+f'=> ['g4', "edit from"],
+               'F' => ['g4', "filter attach<>m<>ent"],
+               'G' => ['g1', "get attach<>m<>ent"],
+               'h' => ['g1', "display message"],
+               'i' => ['g6', "run ispell"],
+               '+k'=> ['g4', "attach PGP key"],
+               'l' => ['g1', "print attach<>m<>ent"],
+               'm' => ['g4', "edit attach<>m<>ent\nMime-appropriate open"],
+               'M' => ['g4', "edit mix"],
+               '^m'=> ['g1', "view attach<>m<>ent"],
+               'n' => ['g6', "new attach<>m<>ent"],
+               'o' => ['g4 ext', "autocrypt toggle"], #TODO
+               '^o'=> ['g4', "rename attach<>m<>ent"],
+               'p' => ['g1', "PGP menu"], #TODO
+               'P' => ['g8 mode', "post<>pone"],
+               'r' => ['g4', "edit reply<>-to"],
+               'R' => ['g4', "rename attach<>m<>ent"],
+               's' => ['g4', "edit subject"],
+               'S' => ['g4 menumS', "s/mime options"],
+               't' => ['g4', "edit to"],
+               'T' => ['g4', "enter tags"], #TODO
+               '^t'=> ['g4', "ctype attach<>m<>ent"],
+               'w' => ['g6', "copy to folder"],
+               'u' => ['g6', "unlink toggle"],
+               'v' => ['g1', "preview alt fil<>t<>er"], # m+v mV
                '+v'=> 'g1',
                '+v'=> 'g1',
-               'V' => 'g1',
-               'U' => 'g4',
-               'y' => 'g7',
+               'V' => ['g1', "preview mailcap filter"],
+               'U' => ['g4', "encode attach<>m<>ent"],
+               'y' => ['g7', "send"],
+               # ^xe
        }, # compose
 
        w => {
        }, # compose
 
        w => {
-               "\e"=> 'g9 mode',
-               'D' => 'g4',
-               'd' => '=wD',
-               'N' => 'g4',
-               'n' => '=wN',
-               'O' => 'g4',
-               'o' => '=wO',
-               'r' => 'g4',
-               'R' => '=wr',
-               '*' => 'g4',
-               '!' => 'g4',
+               "\e"=> $esc,
+               'D' => ['g4', "deleted"],
+               'd' => \'wD',
+               'N' => ['g4', "new"],
+               'n' => \'wN',
+               'O' => ['g4', "old"],
+               'o' => \'wO',
+               'r' => ['g4', "replied"],
+               'R' => \'wr',
+               '*' => ['g4', "tagged"],
+               '!' => ['g4', "flagged"],
        }, # flag
 
        '/~' => {
        }, # flag
 
        '/~' => {
-               "\e"=> 'g9 mode',
-               A => 'g3',
-               b => 'g3 arg',
-               B => 'g3 arg',
-               c => 'g3 arg',
-               C => 'g3 arg',
-               d => 'g3 arg',
-               D => 'g3',
-               e => 'g3 arg',
-               E => 'g3',
-               f => 'g3 arg',
-               F => 'g3',
-               g => 'g3',
-               G => 'g3',
-               h => 'g3 arg',
-               H => 'g3 arg',
-               i => 'g3 arg',
-               k => 'g3',
-               L => 'g3 arg',
-               l => 'g3',
-               m => 'g3 arg',
-               M => 'g3 arg',
-               n => 'g3 arg',
-               N => 'g3',
-               O => 'g3',
-               p => 'g3',
-               P => 'g3',
-               Q => 'g3',
-               r => 'g3 arg',
-               R => 'g3',
-               s => 'g3',
-               S => 'g3',
-               t => 'g3 arg',
-               T => 'g3',
-               u => 'g3',
-               U => 'g3',
-               v => 'g3',
-               V => 'g3',
-               x => 'g3 arg',
-               X => 'g3 arg',
-               y => 'g3 arg',
-               z => 'g3 arg',
-               '=' => 'g3',
-               '$' => 'g3',
-               '(' => 'g3 arg',
-               '<' => 'g3 arg',
-               '>' => 'g3 arg',
+               "\e"=> $esc,
+               'A' => ['g3', => "all"],
+               'b' => ['g3 arg', => "msg body"],
+               'B' => ['g3 arg', => "whole msg"],
+               'c' => ['g3 arg', => "cc address"],
+               'C' => ['g3 arg', => "to or cc address"],
+               'd' => ['g3 arg', => "date sent ran<>g<>e"],
+               'D' => ['g3', => "deleted"],
+               'e' => ['g3 arg', => "sender"],
+               'E' => ['g3', => "expired"],
+               'f' => ['g3 arg', => "from"],
+               'F' => ['g3', => "flagged"],
+               'g' => ['g3', => "signed"],
+               'G' => ['g3', => "encryp<>ted"],
+               'h' => ['g3 arg', => "header"],
+               'H' => ['g3 arg', => "spam attr<>ib<>ute"],
+               'i' => ['g3 arg', => "msg id"],
+               'k' => ['g3', => "pgp key"],
+               'L' => ['g3 arg', => "receiv<>d by"],
+               'l' => ['g3', => "mailing list"],
+               'm' => ['g3 arg', => "num<>ber ran<>g<>e"],
+               'M' => ['g3 arg', => "mime type"],
+               'n' => ['g3 arg', => "score range"],
+               'N' => ['g3', => "new"],
+               'O' => ['g3', => "old"],
+               'p' => ['g3', => "to you"],
+               'P' => ['g3', => "by you"],
+               'Q' => ['g3', => "replies"],
+               'r' => ['g3 arg', => "receive date ran<>ge"],
+               'R' => ['g3', => "read"],
+               's' => ['g3', => "subject"],
+               'S' => ['g3', => "super<>seded"],
+               't' => ['g3 arg', => "to address"],
+               'T' => ['g3', => "tagged"],
+               'u' => ['g3', => "subscr<>ibed list"],
+               'U' => ['g3', => "unread"],
+               'v' => ['g3', => "collapsed thread"],
+               'V' => ['g3', => "verified"],
+               'x' => ['g3 arg', => "refer<>ence"],
+               'X' => ['g3 arg', => "attach<>ments"],
+               'y' => ['g3 arg', => "x-label"],
+               'z' => ['g3 arg', => "size range"],
+               '=' => ['g3', => "dupli<>cate"],
+               '$' => ['g3', => "unrefer<>enced"],
+               '(' => ['g3 arg', => "in thread"],
+               '<' => ['g3 arg', => "parent match"],
+               '>' => ['g3 arg', => "child match"],
        }, # search option
 },
 }
        }, # search option
 },
 }
index 19aa7a3110579eebc69232af87efef3e8e6dc28c..d9743e32ce147e6ac2a6ae77420669dc31c3db40 100644 (file)
@@ -12,148 +12,6 @@ keywords => [qw' nethack rogue game controls '],
 rows => [3, 2, 1, 0],
 moderows => '4321-421',
 
 rows => [3, 2, 1, 0],
 moderows => '4321-421',
 
-key => {
-       'b' =>   "step left down\nnumpad 1",
-       'j' =>        "step down\nnumpad 2",
-       'n' =>  "step right down\nnumpad 3",
-       'h' =>        "step left\nnumpad 4",
-       'l' =>       "step right\nnumpad 6",
-       'y' =>     "step left up\nnumpad 7",
-       'k' =>          "step up\nnumpad 8",
-       'u' =>    "step right up\nnumpad 9",
-
-       'B' =>     "go left down\nshift numpad 1",
-       'J' =>          "go down\nshift numpad 2",
-       'N' =>    "go right down\nshift numpad 3",
-       'H' =>          "go left\nshift numpad 4",
-       'L' =>         "go right\nshift numpad 6",
-       'Y' =>       "go left up\nshift numpad 7",
-       'K' =>            "go up\nshift numpad 8",
-       'U' =>      "go right up\nshift numpad 9",
-
-       '^b'=>    "run left down\nnumpad 5 1",
-       '^j'=>         "run down\nnumpad 5 2",
-       '^n'=>   "run right down\nnumpad 5 3",
-       '^h'=>         "run left\nnumpad 5 4",
-       '^l'=>        "run right\nnumpad 5 6",
-       '^y'=>      "run left up\nnumpad 5 7",
-       '^k'=>           "run up\nnumpad 5 8",
-       '^u'=>     "run right up\nnumpad 5 9",
-
-       'g' => "run until interest",
-       'm' => "m<>ove blind\nno pickup",
-       'M' => "go far",
-       'G' => "g any<>where\nfollow branches",
-
-       '?' => "help menu",
-       '+?'=> "more help",
-       '/' => "explain symbol",
-       '&' => "tell com<>m<>and",
-       '<' => "climb up ladder",
-       '>' => "desc<>ent ladder",
-       '.' => "rest (noop)",
-       '_' => "travel to",
-
-       '+2'=> "two<>weapon toggle",
-       'a' => "apply tool",
-       'A' => "remove all armor",
-       '^a'=> "redo comm<>and\nAgain",
-       '+a'=> "adjust inv<>ent<>ory",
-       'c' => "close door",
-       'C' => "call monster",
-       '^c'=> "panic quit",
-       '+c'=> "chat",
-       'd' => "drop item",
-       'D' => "drop items",
-       '^d'=> "kick",
-       '+d'=> "dip",
-       'e' => "eat food",
-       'E' => "en<>grave",
-       '+e'=> "weapon skills\nEnhance",
-       'f' => "fire quiver",
-       'F' => "fight monster",
-       '+f'=> "force lock",
-       'i' => "invent<>ory",
-       'I' => "invent<>ory part",
-       '+i'=> "invoke object",
-       '+j'=> "jump",
-       '+l'=> "loot",
-       '+m'=> "mons<>ter abil<>ity",
-       '+n'=> "name item<>(s)",
-       'o' => "open door",
-       'O' => "options",
-       '^o'=> "overview levels",
-       '+o'=> "offer sacrifice",
-       'p' => "pay bill",
-       'P' => "put on",
-       '^p'=> "repeat message",
-       '+p'=> "pray",
-       'q' => "drink\nQuaff",
-       'Q' => "quiver ammo",
-       '+q'=> "exit game\nQuit",
-       'r' => "read scroll",
-       'R' => "put off\nRemove accessory",
-       '^r'=> "redraw",
-       '+r'=> "rub object",
-       's' => "search secrets",
-       'S' => "save game",
-       '+s'=> "sit down",
-       't' => "throw<>/shoot",
-       'T' => "remove armor",
-       '^t'=> "teleport",
-       '+t'=> "turn undead",
-       '+u'=> "untrap",
-       'v' => "version",
-       'V' => "verbose version",
-       '+v'=> "compile details",
-       'w' => "wield weap<>on",
-       'W' => "wear armor",
-       '+w'=> "wipe face",
-       'x' => "swap weapons\nXchange",
-       'X' => "explore mode",
-       '^x'=> "show stats",
-       'z' => "zap wand",
-       'Z' => "cast spell",
-       '^z'=> "suspend game",
-
-       ':' => "look here",
-       ';' => "look else<>where",
-       ',' => "pick up",
-       '@' => "toggle pick<>up",
-       '^' => "show trap",
-       ')' => "show weapon",
-       '[' => "show armor",
-       '=' => "show rings",
-       '"' => "show amulet",
-       '(' => "show tools",
-       '*' => "show equip<>ment",
-       '$' => "count gold",
-       '+' => "list spells",
-       '\\'=> "discover<>ed obj<>ects",
-       '`' => "types ident<>if<>ied",
-       '!' => "shell escape",
-       '#' => "more comm<>ands",
-
-       'DB' => 'drop blessed',
-       'DU' => 'drop uncursed',
-       'DC' => 'drop cursed',
-       'DX' => 'drop unknown',
-       'Da' => 'drop all',
-       'Di' => "invent<>ory",
-       'Du' => 'drop unpaid',
-       'Dm' => 'drop any',
-       'D%' => 'drop more',
-
-       'I*' => 'list gems',
-       'Iu' => 'list unpaid',
-       'Ix' => 'list billed',
-       'I$' => 'count money',
-       'IB' => 'list blessed',
-       'IU' => 'list uncurs<>e<>d',
-       'IC' => 'list cursed',
-       'IX' => 'list un<>know<>n',
-},
-
 mode => {
        '' => 'normal gameplay',
        'I' => 'inventory type',
 mode => {
        '' => 'normal gameplay',
        'I' => 'inventory type',
@@ -175,154 +33,153 @@ flag => {
 
 def => {
        '' => {
 
 def => {
        '' => {
-               'b' => 'g2',
-               'j' => 'g2',
-               'n' => 'g2',
-               'h' => 'g2',
-               'l' => 'g2',
-               'y' => 'g2',
-               'k' => 'g2',
-               'u' => 'g2',
-
-               'B' => 'g3',
-               'J' => 'g3',
-               'N' => 'g3',
-               'H' => 'g3',
-               'L' => 'g3',
-               'Y' => 'g3',
-               'K' => 'g3',
-               'U' => 'g3',
-
-               '^b'=> 'g3',
-               '^j'=> 'g3',
-               '^n'=> 'g3',
-               '^h'=> 'g3',
-               '^l'=> 'g3',
-               '^y'=> 'g3',
-               '^k'=> 'g3',
-               '^u'=> 'g3',
-
-               'g' => 'g3 argm',
-               'm' => 'g3 argm',
-               'M' => 'g3 argm',
-               'G' => 'g3 argm',
-
-               '?' => 'g8 mode?', #help
-               '+?'=> 'g8',
-               '/' => 'g6 arg mode/', #whatis
-               '&' => 'g6 arg',
-               '<' => 'g2', #up
-               '>' => 'g2', #down
-               '.' => 'g2', #rest
-               '_' => 'g3 argM', #travel
-
-               '+2'=> 'g4', #twoweapon
-               'a' => 'g4 argi', #apply
-               'A' => 'g4', #armor
-               '^a'=> 'g4', #again
-               '+a'=> 'g6', #adjust
-               'c' => 'g4 argm', #close
-               'C' => 'g4 arg', #call
-               '^c'=> 'g6',
-               '+c'=> 'g4 arg', #chat
-               'd' => 'g4 argi', #drop
-               'D' => 'g4 arg modeD', #Drop
-               '^d'=> 'g4 argm', #kick
-               '+d'=> 'g4 argi', #dip
-               'e' => 'g4 argi', #eat
-               'E' => 'g4 argi', #engrave
-               '+e'=> 'g4', #enhance
-               'f' => 'g4 argm', #fire
-               'F' => 'g4 argm', #fight
-               '+f'=> 'g4', #force
-               'i' => 'g7', #invent
-               'I' => 'g7 arg modeI', #Invent
-               '+i'=> 'g4 argi', #invoke
-               '+j'=> 'g4', #jump
-               '+l'=> 'g4', #loot
-               '+m'=> 'g4', #monster
-               '+n'=> 'g7 arg', #name
-               'o' => 'g4 argm', #open
-               'O' => 'g8 modeO', #options
-               '^o'=> 'g6',
-               '+o'=> 'g4 argi', #offer
-               '+O'=> "=^o", #overview
-               'p' => 'g4', #pay
-               'P' => 'g4 argi', #puton
-               '^p'=> 'g6', #prevmsg
-               '+p'=> 'g4 arg', #pray
-               'q' => 'g4 argi', #quaff
-               'Q' => 'g4 argi', #quiver
-               '+q'=> 'g6', #quit
-               'r' => 'g4 argi', #read
-               'R' => 'g4 argi', #remove
-               '^r'=> 'g6', #redraw
-               '+r'=> 'g4 argi', #rub
-               's' => 'g4', #search
-               'S' => 'g6', #save
-               '+s'=> 'g4', #sit
-               't' => 'g4 argm', #throw
-               'T' => 'g4 argi', #takeoff
-               '^t'=> 'g4', #'port
-               '+t'=> 'g4', #turn
-               '+u'=> 'g4', #untrap
-               'v' => 'g6',
-               'V' => 'g6', #history
-               '+v'=> 'g6', #version
-               'w' => 'g4 argi', #wield
-               'W' => 'g4 argi', #wear
-               '+w'=> 'g4', #wipe
-               'x' => 'g4', #xchange
-               'X' => 'g6', #explore
-               '^x'=> 'g6', #show
-               'z' => 'g4 argm', #zap
-               'Z' => 'g4 argi', #Zap
-               '^z'=> 'g6', #suspend
-
-               ':' => 'g6', #look
-               ';' => 'g6 argM', #farlook
-               ',' => 'g4', #pickup
-               '@' => 'g6',
-               '^' => 'g6 argm', #trap_id
-               ')' => 'g7', #seeweapon
-               '[' => 'g7', #seearmor
-               '=' => 'g7', #seerings
-               '"' => 'g7', #seeamulet
-               '(' => 'g7', #seetools
-               '*' => 'g7', #seeall
-               '$' => 'g6', #seegold
-               '+' => 'g7', #seespells
-               '\\'=> 'g7', #known
-               '`' => 'g7', #knownclass
-               '!' => 'g6', #sh
-               '#' => 'g8',
+               'b' => ['g2',   "step left down\nnumpad 1"],
+               'j' => ['g2',        "step down\nnumpad 2"],
+               'n' => ['g2',  "step right down\nnumpad 3"],
+               'h' => ['g2',        "step left\nnumpad 4"],
+               'l' => ['g2',       "step right\nnumpad 6"],
+               'y' => ['g2',     "step left up\nnumpad 7"],
+               'k' => ['g2',          "step up\nnumpad 8"],
+               'u' => ['g2',    "step right up\nnumpad 9"],
+
+               'B' => ['g3',     "go left down\nshift numpad 1"],
+               'J' => ['g3',          "go down\nshift numpad 2"],
+               'N' => ['g3',    "go right down\nshift numpad 3"],
+               'H' => ['g3',          "go left\nshift numpad 4"],
+               'L' => ['g3',         "go right\nshift numpad 6"],
+               'Y' => ['g3',       "go left up\nshift numpad 7"],
+               'K' => ['g3',            "go up\nshift numpad 8"],
+               'U' => ['g3',      "go right up\nshift numpad 9"],
+
+               '^b'=> ['g3',    "run left down\nnumpad 5 1"],
+               '^j'=> ['g3',         "run down\nnumpad 5 2"],
+               '^n'=> ['g3',   "run right down\nnumpad 5 3"],
+               '^h'=> ['g3',         "run left\nnumpad 5 4"],
+               '^l'=> ['g3',        "run right\nnumpad 5 6"],
+               '^y'=> ['g3',      "run left up\nnumpad 5 7"],
+               '^k'=> ['g3',           "run up\nnumpad 5 8"],
+               '^u'=> ['g3',     "run right up\nnumpad 5 9"],
+
+               'g' => ['g3 argm', "run until interest"],
+               'm' => ['g3 argm', "m<>ove blind\nno pickup"],
+               'M' => ['g3 argm', "go far"],
+               'G' => ['g3 argm', "g any<>where\nfollow branches"],
+
+               '?' => ['g8 mode?', "help menu"], #help
+               '+?'=> ['g8', "more help"],
+               '/' => ['g6 arg mode/', "explain symbol"], #whatis
+               '&' => ['g6 arg', "tell com<>m<>and"],
+               '<' => ['g2', "climb up ladder"], #up
+               '>' => ['g2', "desc<>ent ladder"], #down
+               '.' => ['g2', "rest (noop)"], #rest
+               '_' => ['g3 argM', "travel to"], #travel
+
+               '+2'=> ['g4', "two<>weapon toggle"], #twoweapon
+               'a' => ['g4 argi', "apply tool"], #apply
+               'A' => ['g4', "remove all armor"], #armor
+               '^a'=> ['g4', "redo comm<>and\nAgain"], #again
+               '+a'=> ['g6', "adjust inv<>ent<>ory"], #adjust
+               'c' => ['g4 argm', "close door"], #close
+               'C' => ['g4 arg', "call monster"], #call
+               '^c'=> ['g6', "panic quit"],
+               '+c'=> ['g4 arg', "chat"], #chat
+               'd' => ['g4 argi', "drop item"], #drop
+               'D' => ['g4 arg modeD', "drop items"], #Drop
+               '^d'=> ['g4 argm', "kick"], #kick
+               '+d'=> ['g4 argi', "dip"], #dip
+               'e' => ['g4 argi', "eat food"], #eat
+               'E' => ['g4 argi', "en<>grave"], #engrave
+               '+e'=> ['g4', "weapon skills\nEnhance"], #enhance
+               'f' => ['g4 argm', "fire quiver"], #fire
+               'F' => ['g4 argm', "fight monster"], #fight
+               '+f'=> ['g4', "force lock"], #force
+               'i' => ['g7', "invent<>ory"], #invent
+               'I' => ['g7 arg modeI', "invent<>ory part"], #Invent
+               '+i'=> ['g4 argi', "invoke object"], #invoke
+               '+j'=> ['g4', "jump"], #jump
+               '+l'=> ['g4', "loot"], #loot
+               '+m'=> ['g4', "mons<>ter abil<>ity"], #monster
+               '+n'=> ['g7 arg', "name item<>(s)"], #name
+               'o' => ['g4 argm', "open door"], #open
+               'O' => ['g8 modeO', "options"], #options
+               '^o'=> ['g6', "overview levels"],
+               '+o'=> ['g4 argi', "offer sacrifice"], #offer
+               'p' => ['g4', "pay bill"], #pay
+               'P' => ['g4 argi', "put on"], #puton
+               '^p'=> ['g6', "repeat message"], #prevmsg
+               '+p'=> ['g4 arg', "pray"], #pray
+               'q' => ['g4 argi', "drink\nQuaff"], #quaff
+               'Q' => ['g4 argi', "quiver ammo"], #quiver
+               '+q'=> ['g6', "exit game\nQuit"], #quit
+               'r' => ['g4 argi', "read scroll"], #read
+               'R' => ['g4 argi', "put off\nRemove accessory"], #remove
+               '^r'=> ['g6', "redraw"], #redraw
+               '+r'=> ['g4 argi', "rub object"], #rub
+               's' => ['g4', "search secrets"], #search
+               'S' => ['g6', "save game"], #save
+               '+s'=> ['g4', "sit down"], #sit
+               't' => ['g4 argm', "throw<>/shoot"], #throw
+               'T' => ['g4 argi', "remove armor"], #takeoff
+               '^t'=> ['g4', "teleport"], #'port
+               '+t'=> ['g4', "turn undead"], #turn
+               '+u'=> ['g4', "untrap"], #untrap
+               'v' => ['g6', "version"],
+               'V' => ['g6', "verbose version"], #history
+               '+v'=> ['g6', "compile details"], #version
+               'w' => ['g4 argi', "wield weap<>on"], #wield
+               'W' => ['g4 argi', "wear armor"], #wear
+               '+w'=> ['g4', "wipe face"], #wipe
+               'x' => ['g4', "swap weapons\nXchange"], #xchange
+               'X' => ['g6', "explore mode"], #explore
+               '^x'=> ['g6', "show stats"], #show
+               'z' => ['g4 argm', "zap wand"], #zap
+               'Z' => ['g4 argi', "cast spell"], #Zap
+               '^z'=> ['g6', "suspend game"], #suspend
+
+               ':' => ['g6', "look here"], #look
+               ';' => ['g6 argM', "look else<>where"], #farlook
+               ',' => ['g4', "pick up"], #pickup
+               '@' => ['g6', "toggle pick<>up"],
+               '^' => ['g6 argm', "show trap"], #trap_id
+               ')' => ['g7', "show weapon"], #seeweapon
+               '[' => ['g7', "show armor"], #seearmor
+               '=' => ['g7', "show rings"], #seerings
+               '"' => ['g7', "show amulet"], #seeamulet
+               '(' => ['g7', "show tools"], #seetools
+               '*' => ['g7', "show equip<>ment"], #seeall
+               '$' => ['g6', "count gold"], #seegold
+               '+' => ['g7', "list spells"], #seespells
+               '\\'=> ['g7', "discover<>ed obj<>ects"], #known
+               '`' => ['g7', "types ident<>if<>ied"], #knownclass
+               '!' => ['g6', "shell escape"], #sh
+               '#' => ['g8', "more comm<>ands"],
        },
 
        'D' => {
        },
 
        'D' => {
-               "\e" => 'g8 mode', # static reset button, even though it's not (officially) in the game
-
-               'B' => 'g4',
-               'U' => 'g4',
-               'C' => 'g4',
-               'X' => 'g4',
-               'a' => 'g4',
-               'i' => 'g6',
-               'u' => 'g4',
-               'm' => 'g4 argi',
-               '%' => 'g4 arg',
+               "\e" => ['g8 mode'], # static reset button, even though it's not (officially) in the game
+
+               'B' => ['g4', 'drop blessed'],
+               'U' => ['g4', 'drop uncursed'],
+               'C' => ['g4', 'drop cursed'],
+               'X' => ['g4', 'drop unknown'],
+               'a' => ['g4', 'drop all'],
+               'i' => ['g6', "invent<>ory"],
+               'u' => ['g4', 'drop unpaid'],
+               'm' => ['g4 argi', 'drop any'],
+               '%' => ['g4 arg', 'drop more'],
        },
 
        'I' => {
        },
 
        'I' => {
-               "\e" => 'g8 mode',
-
-               '*' => 'g6',
-               'u' => 'g6',
-               'x' => 'g6',
-               '$' => 'g6',
-               'B' => 'g6',
-               'U' => 'g6',
-               'C' => 'g6',
-               'X' => 'g6',
+               "\e" => ['g8 mode'],
+
+               '*' => ['g6', 'list gems'],
+               'u' => ['g6', 'list unpaid'],
+               'x' => ['g6', 'list billed'],
+               '$' => ['g6', 'count money'],
+               'B' => ['g6', 'list blessed'],
+               'U' => ['g6', 'list uncurs<>e<>d'],
+               'C' => ['g6', 'list cursed'],
+               'X' => ['g6', 'list un<>know<>n'],
        },
 },
 }
        },
 },
 }
index 5e5b0cd18f32b98086ed5d55f0ba35bfd3afd68b..acdd89dacec5ca4b60abdd280cba7077a4ec95a0 100644 (file)
@@ -11,84 +11,6 @@ keywords => [qw( readline gnu bash emacs editing curses )],
 rows => [4, 3, 2],
 moderows => '^x=213',
 
 rows => [4, 3, 2],
 moderows => '^x=213',
 
-key => {
-       '+<' => "history start",
-       '+>' => "history end",
-       '+?' => "list complet<>ion<>s",
-       '^@' => "set mark",
-
-       '+#' => "prefix comm<>en<>t",
-       '+&' => "tilde expand",
-       '+*' => "complet<>e all",
-       '+.' => "insert last",
-
-       '^[' => "meta",
-       '+\\'=> "delete whitesp<>ace",
-       '^]' => "find char",
-       '^+]'=> "rev find char",
-       '^_' => "undo",
-
-       '+~' => "user<>name exp<>and",
-       '+!' => "cmd expand",
-       '+@' => "host<>name exp<>and",
-       '+$' => "variable expand",
-       '+^' => "history expand",
-       '+/' => "filename expand",
-
-       '^a' => "begin of line",
-       '^b' => "char back<>w<>ard<>s",
-       '+b' => "word back<>w<>ard<>s",
-       '^c' => "cancel comm<>and",
-       '+c' => "capital<>ise word",
-       '^d' => "delete char",
-       '+d' => "delete word rem<>ain<>der",
-#      '^e' => "emacs mode",
-       '^e' => "end of line",
-       '^f' => "char forward",
-       '+f' => "word forward",
-       '^g' => "abort cmd, bell",
-       '^h' => "back<>space",
-       '^+h'=> "delete bound word",
-       '^i' => "auto<>complet<>e\n(tab)",
-       '^+j'=> "vim mode",
-       '^k' => "delete till eol",
-       '^l' => "clear screen",
-       '+l' => "lowcase word",
-       '^m' => "enter line\n(enter)",
-       '^n' => "history next",
-       '+n' => "match history",
-       '^o' => "enter and next",
-       '^p' => "history back",
-       '+p' => "rev match history",
-#      '^q' => "\nQuote",  #TODO fix partial override
-       '^r' => "reverse history",
-       '+r' => "full undo\nRevert",
-       '^s' => "search history",
-       '^t' => "move char forw<>ard\nTranspose char",
-       '+t' => "move word forw<>ard\nTranspose word",
-       '^u' => "delete till bol", # unix
-       '+u' => "upcase word",
-       '^v' => "verbat<>im char",
-       '^w' => "delete word", # unix
-       '^x' => "extend<>ed",
-       '^y' => "yank top",
-       '+y' => "rotate yank",
-       '^+y'=> "yank arg",
-       '^z' => "back<>ground",
-
-       '^x('  => "start macro",
-       '^x)'  => "end macro",
-       '^xe'  => "run macro\nExecute",
-       '^x^e' => "editor",
-       '^x^r' => "reload inputrc",
-       '^x^x' => "swap cursor\neXchange",
-       '^x^v' => "shell version",
-
-       # globally label escape as meta key
-         "\e" => "+",
-       "^x\e" => "+",
-},
-
 mode => {
        ''   => "emacs mode",
        '^x' => "emacs ctrl-x bindings",
 mode => {
        ''   => "emacs mode",
        '^x' => "emacs ctrl-x bindings",
@@ -110,99 +32,99 @@ flag => {
 
 def => {
        '' => {
 
 def => {
        '' => {
-               "\e" => 'g8',
-
-               '+<' => 'g4',
-               '+=' => '=+?', #TODO: v21 # emacs, not in v2.0
-               '+>' => 'g4',
-               '^?' => '=^h',
-               '+?' => 'g1',
-               '^@' => 'g8 v21', # not in v2.0
-
-               '+#' => 'g6 v21', # not in v2.0
-               '+&' => 'g6',
-               '+*' => 'g6 v21', # not in v2.0
-               '+.' => 'g4',
-               '+~' => '=+&amp;', # emacs
-
-               '^[' => 'g8',
-               '^+['=> '=^i',
-               '+\\'=> 'g7',
-               '^]' => 'g2 arg v21', # not in v2.0
-               '^+]'=> 'g2 arg v21', # not in v2.0
-               '^_' => 'g4',
-               '+_' => '=+.',
-
-               '+~' => 'g6 xbash', # common emacs => '=+&'
-               '+!' => 'g6 xbash',
-               '+@' => 'g6 xbash',
-               '+$' => 'g6 xbash',
-               '+^' => 'g4 xbash',
-               '+/' => 'g1 xbash',
-
-               '^a' => 'g2',
-               '^b' => 'g2',
-               '+b' => 'g2',
-               '^c' => 'g8 xbash',
-               '+c' => 'g6',
-               '^d' => 'g7',
-               '+d' => 'g7 ring',
-       #       '^e' => 'g9',
-               '^e' => 'g2',
-               '^f' => 'g2',
-               '+f' => 'g2',
-               '^g' => 'g8',
-               '^+g'=> '=^g',
-               '^h' => 'g7',
-               '^+h'=> 'g7 ring', #TODO
-               '^i' => 'g6',
-               '^+i'=> '=^v^i',
-               '^j' => '=^m',
-               '^+j'=> 'g9', #TODO: mode^+j
-               '^k' => 'g7 ring',
-               '^l' => 'g1',
-               '+l' => 'g6',
-               '^m' => 'g4',
-               '^+m'=> '=^+j',
-               '^n' => 'g4',
-               '+n' => 'g4',
-               '^o' => 'g4 xbash',
-               '^p' => 'g4',
-               '+p' => 'g4',
-               '^q' => '=^v',
-               '^r' => 'g4',
-               '+r' => 'g4',
-               '^+r'=> '=+r',
-               '^s' => 'g4',
-               '^t' => 'g6',
-               '+t' => 'g6',
-               '^u' => 'g7 ring',
-               '+u' => 'g6',
-               '^v' => 'g8',
-               '^w' => 'g7 ring',
-               '^x' => 'g9 arg mode^x',
-               '^y' => 'g4',
-               '+y' => 'g4 ring',
-               '^+y'=> "yank arg",
-               '^z' => 'g8 xbash',
+               "\e" => ['g8', "+"],  # label escape as meta key
+
+               '+<' => ['g4', "history start"],
+               '+=' => \'+?', #TODO: v21 # emacs, not in v2.0
+               '+>' => ['g4', "history end"],
+               '^?' => \'^h',
+               '+?' => ['g1', "list complet<>ion<>s"],
+               '^@' => ['g8 v21', "set mark"], # not in v2.0
+
+               '+#' => ['g6 v21', "prefix comm<>en<>t"], # not in v2.0
+               '+&' => ['g6', "tilde expand"],
+               '+*' => ['g6 v21', "complet<>e all"], # not in v2.0
+               '+.' => ['g4', "insert last"],
+               '+~' => \'+&', # common emacs
+
+               '^[' => ['g8', "meta"],
+               '^+['=> \'^i',
+               '+\\'=> ['g7', "delete whitesp<>ace"],
+               '^]' => ['g2 arg v21', "find char"], # not in v2.0
+               '^+]'=> ['g2 arg v21', "rev find char"], # not in v2.0
+               '^_' => ['g4', "undo"],
+               '+_' => \'+.',
+
+               '+~' => ['g6 xbash', "user<>name exp<>and"], # overrides alias
+               '+!' => ['g6 xbash', "cmd expand"],
+               '+@' => ['g6 xbash', "host<>name exp<>and"],
+               '+$' => ['g6 xbash', "variable expand"],
+               '+^' => ['g4 xbash', "history expand"],
+               '+/' => ['g1 xbash', "filename expand"],
+
+               '^a' => ['g2', "begin of line"],
+               '^b' => ['g2', "char back<>w<>ard<>s"],
+               '+b' => ['g2', "word back<>w<>ard<>s"],
+               '^c' => ['g8 xbash', "cancel comm<>and"],
+               '+c' => ['g6', "capital<>ise word"],
+               '^d' => ['g7', "delete char"],
+               '+d' => ['g7 ring', "delete word rem<>ain<>der"],
+       #       '^e' => ['g9', "emacs mode"],
+               '^e' => ['g2', "end of line"],
+               '^f' => ['g2', "char forward"],
+               '+f' => ['g2', "word forward"],
+               '^g' => ['g8', "abort cmd, bell"],
+               '^+g'=> \'^g',
+               '^h' => ['g7', "back<>space"],
+               '^+h'=> ['g7 ring', "delete bound word"], #TODO
+               '^i' => ['g6', "auto<>complet<>e\n(tab)"],
+               '^+i'=> \'^v^i',
+               '^j' => \'^m',
+               '^+j'=> ['g9', "vim mode"], #TODO: mode^+j
+               '^k' => ['g7 ring', "delete till eol"],
+               '^l' => ['g1', "clear screen"],
+               '+l' => ['g6', "lowcase word"],
+               '^m' => ['g4', "enter line\n(enter)"],
+               '^+m'=> \'^+j',
+               '^n' => ['g4', "history next"],
+               '+n' => ['g4', "match history"],
+               '^o' => ['g4 xbash', "enter and next"],
+               '^p' => ['g4', "history back"],
+               '+p' => ['g4', "rev match history"],
+               '^q' => [undef, \'^v', "\nQuote"],  #TODO fix partial override
+               '^r' => ['g4', "reverse history"],
+               '+r' => ['g4', "full undo\nRevert"],
+               '^+r'=> \'+r',
+               '^s' => ['g4', "search history"],
+               '^t' => ['g6', "move char forw<>ard\nTranspose char"],
+               '+t' => ['g6', "move word forw<>ard\nTranspose word"],
+               '^u' => ['g7 ring', "delete till bol"], # unix
+               '+u' => ['g6', "upcase word"],
+               '^v' => ['g8', "verbat<>im char"],
+               '^w' => ['g7 ring', "delete word"], # unix
+               '^x' => ['g9 arg mode^x', "extend<>ed"],
+               '^y' => ['g4', "yank top"],
+               '+y' => ['g4 ring', "rotate yank"],
+               '^+y'=> ["yank arg", "yank arg"],
+               '^z' => ['g8 xbash', "back<>ground"],
        },
 
        '^x' => {
                lead => "x̂",
 
        },
 
        '^x' => {
                lead => "x̂",
 
-               "\e" => 'g8 mode',
-
-               '('  => 'g8',
-               ')'  => 'g8',
-               'e'  => 'g8',
-               '^e' => 'g6 xbash linkvi',
-               '^g' => '=^g',
-               '^h' => '=^u',
-               '^r' => 'g8',
-               '^u' => '=^_',
-               '^x' => 'g2 v21', # not in v2.0
-               '^v' => 'g1 xbash',
-               '^?' => '=^x^h',
+               "\e" => ['g8 mode', "+"],
+
+               '('  => ['g8', "start macro"],
+               ')'  => ['g8', "end macro"],
+               'e'  => ['g8', "run macro\nExecute"],
+               '^e' => ['g6 xbash linkvi', "editor"],
+               '^g' => \'^g',
+               '^h' => \'^u',
+               '^r' => ['g8', "reload inputrc"],
+               '^u' => \'^_',
+               '^x' => ['g2 v21', "swap cursor\neXchange"], # not in v2.0
+               '^v' => ['g1 xbash', "shell version"],
+               '^?' => \'^x^h',
        },
 },
 }
        },
 },
 }
index 893adf319164a58f492eaf674bd31986e4bdb9d6..ce5635722e9cba3bf23647512eefd9e12ccc1274 100644 (file)
@@ -10,66 +10,6 @@ description => [
 ],
 keywords => [qw' screen terminal window manager '],
 
 ],
 keywords => [qw' screen terminal window manager '],
 
-key => {
-       'a' => "literal a",
-       'A' => "title", # title
-       '^a'=> "last",
-       'b' => "send break", # break
-       'B' => "reopen break", # pow_break
-       'c' => "new", # screen
-       'C' => "clear", # clear
-       'd' => "detach", # detach
-       'D' => "detach logout", # pow_detach
-       'f' => "flow", # flow
-       'F' => "fit",
-       '^g'=> "vbell", # vbell
-       'h' => "hard<>copy", # hardcopy
-       'H' => "log", # log
-       'i' => "prop<>erties", # info
-       'I' => "login on", #XXX
-       '^i'=> "focus", # focus
-       'k' => "kill", # kill
-       'l' => "redraw", # redisplay
-       'L' => "login", # login
-       'm' => "last msg", # lastmsg
-       'M' => "moni<>tor", # monitor
-       'n' => "next", # next
-       'N' => "number", # number
-       'O' => "login off", #XXX
-       '^o'=> "other", # other
-       'p' => "previous", # prev
-       'q' => "xon", # xon
-       'Q' => "only", # only
-       'r' => "wrap", # wrap
-       's' => 'xoff', # xoff
-       't' => "time", # time
-       'v' => "version",
-       '^v'=> "digraph", # digraph
-       'w' => "windows", # windows
-       'W' => "width", # width
-       'x' => "lock screen", # lockscreen
-       'X' => "remove", # remove
-       'z' => "suspend", # suspend
-       'Z' => "reset",
-
-       "'" => "select", # select
-       '"' => "window<>list -b", # windowlist -b
-       ':' => "colon", # colon
-       "\e"=> "copy", # copy
-       '^]'=> "paste .", # paste .
-       '|' => "split vert", # split -v
-       '{' => "history", # history
-       '}' => "history", # history
-       '=' => "remove buf<>fer", # removebuf
-       '*' => "displays", # displays
-       '.' => "dump<>termcap", # dumptermcap
-       ',' => "license", # license
-       '-' => "select -", # select -
-       '_' => "silence", # silence
-       '>' => "writebuf", # writebuf
-       '<' => "readbuf", # readbuf
-},
-
 mode => {
        '' => 'index',
 },
 mode => {
        '' => 'index',
 },
@@ -89,85 +29,85 @@ flag => {
 
 def => {
        '' => {
 
 def => {
        '' => {
-               'a' => 'g7',
-               'A' => 'g9 args', # title
-               '^a'=> 'g3',
-               'b' => 'g7', # break
-               'B' => 'g7', # pow_break
-               '^b'=> '=b',
-               'c' => 'g9', # screen
-               'C' => 'g2', # clear
-               '^c'=> '=c',
-               'd' => 'g9', # detach
-               'D' => 'g9', # pow_detach
-               '^d'=> '=d',
-               'f' => 'g4', # flow
-               'F' => 'g4',
-               '^f'=> '=f',
-               '^g'=> 'g4', # vbell
-               'h' => 'g6', # hardcopy
-               'H' => 'g5', # log
-               '^h'=> '=^p',
-               'i' => 'g1', # info
-               'I' => 'g5', #XXX
-               '^i'=> 'g2', # focus
-               'k' => 'g5', # kill
-               'K' => '=k',
-               'l' => 'g2', # redisplay
-               'L' => 'g5', # login
-               '^l'=> '=l',
-               'm' => 'g1', # lastmsg
-               'M' => 'g5', # monitor
-               '^m'=> '=m',
-               'n' => 'g3', # next
-               'N' => 'g1', # number
-               '^n'=> '=n',
-               'O' => 'g5', #XXX
-               '^o'=> 'g3', # other
-               'p' => 'g3', # prev
-               '^p'=> '=p',
-               'q' => 'g4', # xon
-               'Q' => 'g2', # only
-               '^q'=> '=q',
-               'r' => 'g4', # wrap
-               '^r'=> '=r',
-               's' => 'g4', # xoff
-               '^s'=> '=s',
-               't' => 'g1', # time
-               '^t'=> '=t',
-               'v' => 'g1',
-               '^v'=> 'g7 arg arg linkdigraphs', # digraph
-               'w' => 'g1', # windows
-               'W' => 'g4', # width
-               '^w'=> '=w',
-               'x' => 'g9', # lockscreen
-               'X' => 'g2', # remove
-               '^x'=> '=x',
-               'z' => 'g9', # suspend
-               'Z' => 'g9',
-               '^z'=> '=z',
+               'a' => ['g7', "literal a"],
+               'A' => ['g9 args', "title"], # title
+               '^a'=> ['g3', "last"],
+               'b' => ['g7', "send break"], # break
+               'B' => ['g7', "reopen break"], # pow_break
+               '^b'=> \'b',
+               'c' => ['g9', "new"], # screen
+               'C' => ['g2', "clear"], # clear
+               '^c'=> \'c',
+               'd' => ['g9', "detach"], # detach
+               'D' => ['g9', "detach logout"], # pow_detach
+               '^d'=> \'d',
+               'f' => ['g4', "flow"], # flow
+               'F' => ['g4', "fit"],
+               '^f'=> \'f',
+               '^g'=> ['g4', "vbell"], # vbell
+               'h' => ['g6', "hard<>copy"], # hardcopy
+               'H' => ['g5', "log"], # log
+               '^h'=> \'^p',
+               'i' => ['g1', "prop<>erties"], # info
+               'I' => ['g5', "login on"], #XXX
+               '^i'=> ['g2', "focus"], # focus
+               'k' => ['g5', "kill"], # kill
+               'K' => \'k',
+               'l' => ['g2', "redraw"], # redisplay
+               'L' => ['g5', "login"], # login
+               '^l'=> \'l',
+               'm' => ['g1', "last msg"], # lastmsg
+               'M' => ['g5', "moni<>tor"], # monitor
+               '^m'=> \'m',
+               'n' => ['g3', "next"], # next
+               'N' => ['g1', "number"], # number
+               '^n'=> \'n',
+               'O' => ['g5', "login off"], #XXX
+               '^o'=> ['g3', "other"], # other
+               'p' => ['g3', "previous"], # prev
+               '^p'=> \'p',
+               'q' => ['g4', "xon"], # xon
+               'Q' => ['g2', "only"], # only
+               '^q'=> \'q',
+               'r' => ['g4', "wrap"], # wrap
+               '^r'=> \'r',
+               's' => ['g4', 'xoff'], # xoff
+               '^s'=> \'s',
+               't' => ['g1', "time"], # time
+               '^t'=> \'t',
+               'v' => ['g1', "version"],
+               '^v'=> ['g7 arg arg linkdigraphs', "digraph"], # digraph
+               'w' => ['g1', "windows"], # windows
+               'W' => ['g4', "width"], # width
+               '^w'=> \'w',
+               'x' => ['g9', "lock screen"], # lockscreen
+               'X' => ['g2', "remove"], # remove
+               '^x'=> \'x',
+               'z' => ['g9', "suspend"], # suspend
+               'Z' => ['g9', "reset"],
+               '^z'=> \'z',
 
 
-               "'" => 'g3 arg', # select
-               '"' => 'g3', # windowlist -b
-               ':' => 'g4', # colon
-               "\e"=> 'g6', # copy
-               '[' => '=^[',
-               '^['=> "=\e",
-               '^]'=> 'g7', # paste .
-               ']' => '=^]',
-               '|' => 'g2', # split -v
-               '{' => 'g7', # history
-               '}' => 'g7', # history
-               '=' => 'g6', # removebuf
-               '^?'=> '=^h',
-               '*' => 'g1', # displays
-               '.' => 'g9', # dumptermcap
-               ',' => 'g1', # license
-               '-' => 'g3', # select -
-               '_' => 'g5', # silence
-               '>' => 'g6', # writebuf
-               '<' => 'g6', # readbuf
-               '^@'=> '=n',
+               "'" => ['g3 arg', "select"], # select
+               '"' => ['g3', "window<>list -b"], # windowlist -b
+               ':' => ['g4', "colon"], # colon
+               "\e"=> ['g6', "copy"], # copy
+               '[' => \'^[',
+               '^['=> \"\e",
+               '^]'=> ['g7', "paste ."], # paste .
+               ']' => \'^]',
+               '|' => ['g2', "split vert"], # split -v
+               '{' => ['g7', "history"], # history
+               '}' => ['g7', "history"], # history
+               '=' => ['g6', "remove buf<>fer"], # removebuf
+               '^?'=> \'^h',
+               '*' => ['g1', "displays"], # displays
+               '.' => ['g9', "dump<>termcap"], # dumptermcap
+               ',' => ['g1', "license"], # license
+               '-' => ['g3', "select -"], # select -
+               '_' => ['g5', "silence"], # silence
+               '>' => ['g6', "writebuf"], # writebuf
+               '<' => ['g6', "readbuf"], # readbuf
+               '^@'=> \'n',
        },
 },
 }
        },
 },
 }
index 58ac2f39d37e0b7a458c4aac0d7ceeec170a453f..1a904c6d4bfcf973256c7a2babf426e746af680b 100644 (file)
@@ -8,552 +8,13 @@ my @motions = qw(
 
 {
 title => 'vi/vim',
 
 {
 title => 'vi/vim',
-version => 1.5,
+version => 1.6,
 description => [
        "Interactive cheat sheet for vi text editors, notably Vim,",
        "describing each key in various modes.",
 ],
 keywords => [qw' vi vim nvi '],
 
 description => [
        "Interactive cheat sheet for vi text editors, notably Vim,",
        "describing each key in various modes.",
 ],
 keywords => [qw' vi vim nvi '],
 
-key => {
-
-       "\e"=> "normal mode",
-       '~' => "case toggle",
-       '!' => "filt<>er lines",
-       '@' => "play macro",
-       '#' => "rev. find word",
-       '$' => "eol",
-       '%' => "goto match",
-       '^' => '"soft" bol',
-       '&' => ":s rep<>eat",
-       '*' => "find word",
-       '(' => "begin senten<>ce",
-       ')' => "end senten<>ce",
-       '_' => '"soft" bol down',
-       '+' => "next line",
-       '`' => "goto mark",
-       '0' => '"hard" bol',
-       '^^'=> "edit alt. file",
-       '-' => "prev line",
-       '=' => "re<>ind<>ent",
-       '?' => "find rev.",
-       ';' => "repeat t/f/T/F",
-       ':' => "ex cmd line",
-       "'" => "goto mark bol",
-       '"' => "use reg<>ister",
-       '\\' => "reser<>ved",
-       '^\\' => "to mode/<>ext<>ens<>ion<>s",
-       ',' => "reverse t/T/f/F",
-       '<' => "un<>ind<>ent",
-       '.' => "repeat last cmd",
-       '>' => "ind<>ent",
-       '/' => "find",
-       '[' => "move back<>ward<>s",
-       '{' => "begin parag.",
-       ']' => "move forw<>ard",
-       '}' => "end parag.",
-       '^]'=> "go to tag",
-       '|' => "goto (1st) col",
-
-       'a' => "app<>end",
-       'A' => "app<>end to eol",
-       '^a'=> "incr<>ement\nAdd one",
-       'b' => "prev word\nBack",
-       'B' => 'prev <span style="font-variant:small-caps">word</span>',
-       '^b'=> "page up",
-       'c' => "chan<>ge",
-       'C' => "chan<>ge to eol",
-       '^c'=> "abort",
-       'd' => "del<>ete",
-       'D' => "delete to eol",
-       '^d'=> "scroll down",
-       'e' => "end word",
-       'E' => 'end <span style="font-variant:small-caps">word</span>',
-       '^e'=> "window down\nExtra line",
-       'f' => "fwd to char",
-       'F' => "back<>wd to char",
-       '^f'=> "page down\npage Forward",
-       'g' => "extra cmds",
-       'G' => "eof/<>goto ln",
-       '^g'=> ":file (info)",
-       'h' => "<left>",
-       'H' => "screen top\nHome row",
-       'i' => "insert mode",
-       'I' => "insert at bol",
-       '^i'=> "jump to newer\nIncrease position",
-       'j' => "<down>",
-       'J' => "join lines",
-       'k' => "<up>",
-       'K' => "help\nlooKup Keyword",
-       'l' => "<right>",
-       'L' => "screen bottom\nLowermost Line",
-       '^l'=> "redraw",
-       'm' => "set mark",
-       'M' => "screen mid<>dle",
-       'n' => "next find",
-       'N' => "prev find",
-       'o' => "line below\nOpen",
-       'O' => "line above",
-       '^o'=> "jump to older",
-       'p' => "paste after",
-       'P' => "paste before",
-       'q' => "rec<>ord macro\nQueue seQuence",
-       'Q' => "ex mode",
-       '^q'=> "(xon)\nQome back",
-       'r' => "repl<>ace char",
-       'R' => "repl<>ace mode",
-       '^r'=> "redo",
-       's' => "subst char",
-       'S' => "subst line",
-       '^s'=> "(xoff)\nStop",
-       't' => "till char",
-       'T' => "back till char",
-       '^t'=> "back tag", # backtrag :P
-       'u' => "undo",
-       'U' => "undo line",
-       '^u'=> "scroll up",
-       'v' => "visual mode",
-       'V' => "visual lines",
-       '^v'=> "visual block",
-       'w' => "next word",
-       'W' => 'next <span style="font-variant:small-caps">word</span>',
-       '^w'=> "win<>dow cmds",
-       'x' => "delete char",
-       'X' => "back<>space",
-       '^x'=> "subs<>tract",
-       'y' => "yank\n(copy)",
-       'Y' => "yank line",
-       '^y'=> "window up\nYield",
-       'z' => "extra cmds",
-       'Z' => "quit",
-       '^z'=> ":sus<>pend\nzzz (as in sleep)",
-
-       'g~' => "case toggl<>e",
-       'g@' => "oper<>at<>or<>func",
-       'g#' => "rev. find string",
-       'g$' => "virt<>ual eol",
-       'g^' => qq'"soft" bol v<>irt<>ual',
-       'g&' => ":s rep<>eat glob<>al<>ly\nGlobal substitute",
-       'g*' => "find string",
-       'g_' => qq'"soft" eol',
-       'g+' => "later undo",
-       'g`' => "to mark keepj<>umps",
-       'g8' => "char hex val<>ue<>s",
-       'g0' => "virtual bol",
-       'g-' => "earlier undo",
-       "g\e"=> "normal mode",
-       'g]' => "go to tselect",
-       'g^]'=> "go to tjump",
-       'g;' => "to prev change pos",
-       "g'" => "to mark keepj<>umps",
-       'g<' => "see prev cmd output",
-       'g?' => "rot13 encode",
-       'g,' => "to next change pos",
-
-       'ga' => "char value\nGet Ascii value",
-       'g^a'=> "mem usage stats",
-       'gd' => "local declar<>ation",
-       'gD' => "global declar<>ation",
-       'ge' => "back to word end",
-       'gE' => qq'back to <span style="font-variant:small-caps">word</span> end',
-       'gf' => "edit file at cur<>sor\nGoto File",
-       'gF' => "edit file + jump",
-       'gg' => "first line",
-       'g^g'=> "cur<>sor pos info",
-       'gh' => "select mode\nGet Highlighted",
-       'gH' => "select lines\nGet Highlighted",
-       'g^h'=> "select block\nGet Highlighted",
-       'gi' => "insert at last pos",
-       'gI' => "insert at soft bol",
-       'gj' => "<down> screen",
-       'gJ' => "join leave spac<>ing",
-       'gk' => "<up> screen",
-       'gm' => "cen<>ter screen",
-       'gn' => "select next find",
-       'gN' => "select prev find",
-       'go' => ":goto (byte)",
-       'gp' => "paste still",
-       'gP' => "paste before still",
-       'gq' => "for<>mat",
-       'gQ' => "ex mode manual :",
-       'gr' => "virt. repl<>ace char",
-       'gR' => "virt. repl<>ace mode",
-       'gs' => "sleep\nGo to Sleep",
-       'gt' => "next tab\nGoto Tab",
-       'gT' => "tab back",
-       'gu' => "lower<>case",
-       'gU' => "up<>per<>case",
-       'gv' => "prev<>ious highl<>ight\nprecedinG Visual",
-       'gV' => "avoid resel<>ect<>ion",
-       'gw' => "for<>mat still",
-       'gx' => "Netrw<>BrowseX",
-
-       "Z\e"=> "normal mode",
-       'ZQ' => " :q! (force)",
-       'ZZ' => " :wq (write)",
-
-       'z^' => "page above",
-       'z+' => "page below",
-       'z-' => "line at bottom bol\ndon't (-) see any further",
-       'z=' => "sug<>gest spell<>ing",
-       'z.' => "line at center bol",
-       "z\e"=> "normal mode",
-
-       'za' => "toggle fold",
-       'zA' => "toggle fold rec<>urs<>ive<>ly",
-       'zb' => "line at bot. bol",
-       'zc' => "close fold",
-       'zC' => "close folds rec<>curs<>ive<>ly",
-       'zd' => "delete fold",
-       'zD' => "delete folds rec<>urs<>ive",
-       'ze' => "cursor at right side",
-       'zE' => "elimi<>nate f<>olds",
-       'zf' => "create fold",
-       'zF' => "fold lines",
-       'zg' => "add spell<>ing\nGood word",
-       'zG' => "temp spell<>ing",
-       'zh' => "scroll <left>",
-       'zH' => "scroll <left> half scr<>een",
-       'zi' => "toggle all folds",
-       'zj' => "next fold start",
-       'zk' => "prev fold end",
-       'zl' => "scroll <right>",
-       'zL' => "scroll <right> half scr<>een",
-       'z^m'=> "line at top bol",
-       'zm' => "fold more",
-       'zM' => "close all folds",
-       'zn' => "fold none",
-       'zN' => "fold norm<>al",
-       'zo' => "open fold",
-       'zO' => "open folds rec<>urs<>ive<>ly",
-       'zr' => "reduce folding",
-       'zR' => "open all folds",
-       'zs' => "cursor at left side",
-       'zt' => "line at top",
-       'zu' => "undo spell<>ing",
-       'zv' => "unfold cursor line",
-       'zw' => "add missp<>ell<>ing\nWrong word",
-       'zW' => "temp missp<>ell<>ing",
-       'zx' => "update folds",
-       'zX' => "re<>apply f<>olds",
-       'zz' => "line at center\nZee Zenter (with a funny accent)",
-
-       "[`" => "previous lc mark",
-       '[#' => "previous open #if<>/#else",
-       '[(' => "previous open (",
-       '[/' => "start of C com<>m<>ent",
-       '[{' => "previous open {",
-       '[[' => "section back<>ward<>s",
-       "[\e"=> "normal mode",
-       '[]' => qq'<span style="font-variant:small-caps">section</span> back<>ward<>s',
-
-       '[c' => "start of change backw<>ards",
-       '[d' => "define line",
-       '[D' => "defin<>ition",
-       '[^d'=> "to defin<>it<>ion",
-       '[i' => "first occur<>renc<>e line",
-       '[I' => "first occur<>renc<>e",
-       '[^i'=> "to first occur<>renc<>e",
-       '[m' => "start of funct<>ion",
-       '[p' => "P reind<>ent<>ed",
-       '[s' => "last missp<>ell<>ing",
-       '[S' => "last bad word",
-       '[z' => "start of open fold",
-
-       "]`" => "next lc mark",
-       ']#' => "next open #endif<>/#else",
-       '])' => "next open )",
-       ']/' => "end of C com<>m<>ent",
-       '][' => qq'<span style="font-variant:small-caps">section</span> forw<>ard',
-       "]\e"=> "normal mode",
-       ']]' => "section forw<>ard",
-       ']}' => "next open }",
-
-       ']c' => "start of change forw<>ards",
-       ']d' => "next define line",
-       ']D' => "next define",
-       ']^d'=> "to next define",
-       ']i' => "next occur<>renc<>e line",
-       ']I' => "next occur<>renc<>e",
-       ']^i'=> "to occur<>renc<>e",
-       ']m' => "end of funct<>ion",
-       ']p' => "p reind<>ent<>ed",
-       ']s' => "next missp<>ell<>ing",
-       ']S' => "next bad word",
-       ']z' => "end of open fold",
-
-       '^w<' => "width decr<>ease",
-       '^w>' => "width incr<>ease",
-       '^w^' => "split, edit alt file",
-       '^w_' => "set height",
-       '^w+' => "height incr<>ease",
-       '^w-' => "height decr<>ease",
-       '^w=' => "same height",
-       "^w\e"=> "normal mode",
-       '^w]' => "split, to tag",
-       '^w}' => "pre<>view tag",
-       '^w|' => "set width",
-
-       '^wb' => "go to bot<>tom",
-       '^wc' => ":close",
-       '^w^c'=> "abort",
-       '^wd' => "split, to def<>inition",
-       '^wf' => "split, file edit",
-       '^wF' => "^wf, jump to line",
-       '^wg' => "extra cmds",
-       '^wh' => "go left",
-       '^wH' => "move far left",
-       '^wi' => "split, to decl of id<>ent<>ifier",
-       '^wj' => "go down",
-       '^wJ' => "move to bottom",
-       '^wk' => "go up",
-       '^wK' => "move to top",
-       '^wl' => "go right",
-       '^wL' => "move far right",
-       '^wn' => "open new",
-       '^wo' => ":only current",
-       '^wp' => "go to prev<>ious",
-       '^wP' => "go to pre<>view",
-       '^wq' => ":quit current",
-       '^wr' => "rotate down<>ward<>s",
-       '^wR' => "rotate up<>ward<>s",
-       '^ws' => "split horiz<>ont<>al<>ly",
-       '^wt' => "go to top",
-       '^wT' => "to tab",
-       '^wv' => "split vert<>ic<>al<>ly",
-       '^ww' => "go to next\nWrap around",
-       '^wW' => "go above<>/left",
-       '^wx' => "ex<>chan<>ge",
-       '^wz' => "close pre<>view",
-
-       "^wg\e"=> "normal mode",
-       '^wg]' => "split, :ts<>elect",
-       '^wg}' => ":ptj<>ump to tag",
-       '^wg^]'=> "split, :tj<>ump",
-       '^wgf' => "file in tab",
-       '^wgF' => "^wgf, to line<>nr",
-
-       'v!' => "external filter",
-       'v:' => "cmd on range",
-       'v<' => "un<>indent",
-       'v=' => "re<>ind<>ent",
-       'v>' => "ind<>ent",
-       'v~' => "toggle case",
-       "v\e"=> "normal mode",
-       'v^]'=> "jump to tag",
-
-       'va' => "ex<>tend area",
-       'vA' => "ap<>pend to block", # block
-       'v^a'=> "incr<>ement num<>bers",
-       'vc' => "repl<>ace area",
-       'vC' => "repl<>ace full lines", # like vS, but blocks are extended until eol
-       'v^c'=> "abort",
-       'vd' => "delete area",
-       'vD' => "delete lines",
-       'vg' => "extra cmds",
-       'v^g'=> "select mode",
-       'vi' => "extend inner a<>r<>ea",
-       'vI' => "insert to block", # block
-       'vJ' => "join lines",
-       'vK' => "help sel<>ect<>ion",
-       'vo' => "to other corner",
-       'vO' => "to other side",
-       'v^o'=> "visual once", # select
-       'vp' => "repl<>ace w/ paste",
-       'vP' => "repl<>ace w/ paste",
-       'vr' => "fill up w/ ch<>ar",
-       'vS' => "repl<>ace lines",
-       'vu' => "lower<>case",
-       'vU' => "upper<>case",
-       'vv' => "char<>wise",
-       'vV' => "line<>wise",
-       'v^v'=> "block<>wise",
-       'v^x'=> "decr<>ement num<>bers",
-       'vy' => "yank area",
-       'vY' => "yank lines",
-
-       "vg\e"=> "visual mode",
-       'vg?' => "rot13 encode",
-       'vg^a'=> "seq. incr<>ement",
-       'vg^g'=> "count region info",
-       'vgJ' => "join literal<>ly",
-       'vgq' => "for<>mat",
-       'vgw' => "for<>mat still",
-       'vg^x'=> "seq. decr<>ement",
-
-       "va'" => "quoted string",
-       'va<' => "&lt;&gt; block",
-       'va[' => "[] block",
-       "va\e"=> "visual mode",
-
-       'vab' => "() block",
-       'vaB' => "{} Block",
-       'vap' => "para<>graph",
-       'vas' => "senten<>ce",
-       'vat' => "xml tag block",
-       'vaw' => "word",
-       'vaW' => '<span style="font-variant:small-caps">word</span>',
-
-#      'c^a' => "complete", #todo
-#      'c^b' => "bol",
-#      'c^d' => "complete", #todo
-#      'c^e' => "eol",
-#      'c^j' => "execute cmd",
-#      'c^l' => "complete", #todo
-#      'c^n' => "complete", #todo
-#      'c^p' => "complete", #todo
-#      'c^r' => \'i^r', # and then some...
-#            ## "insert register",
-#      'c^y' => "selec<>tion to clip<>b<>oard",
-
-       'i^@' => "last insert",
-       'i^^' => "toggle :lmap usag<>e",
-       "i\e" => "normal mode",
-       'i^]' => "abbrev<>iate",
-       'i^_' => "toggle lang<>uage",
-
-       'i^a' => "insert prev<>ious",
-       'i^b' => "former i^_",
-       'i^c' => "abort, no abbr",
-       'i^d' => "un<>ind<>ent",
-       'i^e' => "ins char below",
-       'i^f' => "set indent<>ation",
-       'i^g' => "extra cmds",
-       'i^h' => "back<>space",
-       'i^i' => "tab",
-       'i^j' => "enter",
-       'i^k' => "di<>graph\nKey code",
-       'i^l' => "<em>im</em> leave ins mode",
-       'i^m' => "enter",
-       'i^n' => "find next keyword",
-       'i^o' => "exec<>ute cmd",
-       'i^p' => "find prev keyword",
-       'i^r' => "insert reg<>ister",
-       'i^t' => "indent",
-       'i^u' => "delete line",
-       'i^v' => "literal or ch<>ar<>cod<>e\nVerbatim or by Value",
-       'i^w' => "delete word back",
-       'i^x' => "ex<>pand mode",
-       'i^y' => "ins char above",
-       'i^z' => ":sus<>pend in <em>im</em>",
-
-       "i^g\e"=> "insert mode",
-       'i^gk' => "<up> start col<>umn",
-       'i^gj' => "<down> start col<>umn",
-       'i^gu' => "break undo seq<>uence",
-       'i^gU' => "keep undo seq<>uence",
-       # other i^g keys (even esc) are not recognized
-
-       "i^x\e" => "normal mode",
-       'i^x^]' => "tag comp<>l<>et<>e",
-       'i^x^d' => "def<>ine compl<>et<>e",
-       'i^x^e' => "window up",
-       'i^x^f' => "file comp<>l<>et<>e",
-       'i^x^i' => "ident comp<>l<>et<>e",
-       'i^x^k' => "dict comp<>l<>et<>e",
-       'i^x^l' => "line comp<>l<>et<>e",
-       'i^x^n' => "next comp<>l<>et<>e",
-       'i^x^o' => "omni comp<>l<>et<>e",
-       'i^x^p' => "prev comp<>l<>ete",
-       'i^x^s' => "spell sugg<>est",
-       'i^x^t' => "thes<>aur<>us compl<>et<>e",
-       'i^x^u' => "cus<>tom comp<>l<>et<>e",
-       'i^x^v' => "ex cmd compl<>et<>e",
-       'i^x^y' => "window down",
-
-       # plugins
-         'gc' => "(un)<>com<>ment\ncommentary or tComment plugin",
-        'vgc' => "(un)<>com<>ment\ncommentary or tComment plugin",
-         'gl' => "align to left\nlion plugin, also good for easy-align",
-        'vgl' => "align to left\nlion plugin, also good for easy-align",
-         'gL' => "align to right\nlion plugin",
-        'vgL' => "align to right\nlion plugin",
-       'i^gs' => "sur<>round\nsurround plugin",
-
-       # unimpaired
-       '[a' => "prev<>ious file\nunimpaired map for :prev",
-       ']a' => "next file\nunimpaired map for :n",
-       '[A' => "first file\nunimpaired map for :rew",
-       ']A' => "last file\nunimpaired map for :la",
-       '[b' => "prev<>ious buffer\nunimpaired map for :bp",
-       ']b' => "next buffer\nunimpaired map for :bn",
-       '[B' => "first buffer\nunimpaired map for :br",
-       ']B' => "last buffer\nunimpaired map for :bl",
-       '[e' => "exchange line above\nunimpaired plugin",
-       ']e' => "exchange line belo<>w\nunimpaired plugin",
-       '[f' => "preced<>ing file alph<>abet<>ic<>al<>ly\nunimpaired plugin",
-       ']f' => "next file alph<>abet<>ic<>al<>ly\nunimpaired plugin",
-       '[l' => "previous loc<>at<>ion\nunimpaired map for :lp",
-       ']l' => "next loc<>ation\nunimpaired map for :lne",
-       '[L' => "first loc<>ation\nunimpaired map for :lr",
-       ']L' => "last loc<>ation\nunimpaired map for :lla",
-       '[^l'=> "next file in loc<>at<>ions\nunimpaired map for :lpf",
-       ']^l'=> "file back in loc<>at<>ions\nunimpaired map for :lnf",
-       '[n' => "previous conflict<>/hunk\nunimpaired plugin",
-       ']n' => "next confl<>ict<>/hunk\nunimpaired plugin",
-       '[o' => "enable option\nunimpaired plugin",
-       ']o' => "disable option\nunimpaired plugin",
-       'yo' => "toggle option\nunimpaired plugin",
-       '[q' => "previous quickfix\nunimpaired map for :cp",
-       ']q' => "next quickfix error\nunimpaired map for :cn",
-       '[Q' => "first quickfix\nunimpaired map for :cr",
-       ']Q' => "last quickfix error\nunimpaired map for :cla",
-       '[^q'=> "quickfix file b<>ack\nunimpaired map for :cpf",
-       ']^q'=> "next file in q<>uick<>f<>ix\nunimpaired map for :cnf",
-       '[t' => "previous tag\nunimpaired map for :tp",
-       ']t' => "next tag\nunimpaired map for :tn",
-       '[T' => "first tag\nunimpaired map for :tr",
-       ']T' => "last tag\nunimpaired map for :tl",
-       '[u' => "url encode\nunimpaired plugin",
-       ']u' => "url decode\nunimpaired plugin",
-       '[x' => "xml encode\nunimpaired plugin",
-       ']x' => "xml decode\nunimpaired plugin",
-       '[y' => "escape c str<>ing\nunimpaired plugin",
-       ']y' => "unescap<>e c str<>ing\nunimpaired plugin",
-
-       (map { ("d$_" => "delete to <alias>$_") } qw( g z [ ] )),
-       'dW' => 'delete <span style="font-variant:small-caps">word</span>',
-       'db' => 'delete <left> word',
-       'dB' => 'delete <left> <span style="font-variant:small-caps">word</span>',
-       'de' => 'delete word e<>nd',
-       'dE' => 'delete <span style="font-variant:small-caps">word</span> e<>nd',
-       'df' => 'delete to char<>acter',
-       'dF' => 'delete <left> to char<>acter',
-       'dG' => 'delete to line<>/eof',
-       'dH' => 'delete to top',
-       'dj' => 'delete <down> line',
-       'dk' => 'delete <up> line',
-       'dL' => 'delete to bottom',
-       'dM' => 'delete to middle',
-       'dn' => 'delete to next res<>ult',
-       'dN' => 'delete to prev res<>ult',
-       'dt' => 'delete upto ch<>ar<>acter',
-       'dT' => 'delete <left> upto ch<>ar<>acter',
-       'dw' => 'delete word',
-       'd,' => 'delete to prev ch<>ar<>acter',
-       'd;' => 'delete to next ch<>ar<>acter',
-       'd/' => 'delete to res<>ult',
-       'd?' => 'delete <left> to res<>ult',
-       'd`' => 'delete to mark',
-       "d'" => 'delete lines to m<>ark',
-       'd*' => 'delete to find',
-       'd#' => 'delete <left> to find',
-       'd%' => 'delete to line pct',
-       'd^' => 'delete to soft bol',
-       'd0' => 'delete to bol',
-       'd|' => 'delete to col<>umn',
-       'd{' => 'delete <left> par<>agr<>aph',
-       'd}' => 'delete rest of p<>ar<>agr<>aph',
-       'd(' => 'delete <left> senten<>ce',
-       'd)' => 'delete rest of s<>en<>ten<>ce',
-       'da' => 'delete area',
-       'di' => 'delete inner',
-       'dd' => 'delete line',
-       'do' => 'diff obtain',
-       'dp' => 'diff put',
-       'ds' => 'delete surr<>oun<>d<>ing',
-},
-
 mode => {
        ''    => "normal mode",
         g    => "extended commands (g)",
 mode => {
        ''    => "normal mode",
         g    => "extended commands (g)",
@@ -591,650 +52,699 @@ flag => {
 
 def => {
        '' => {
 
 def => {
        '' => {
-               '~' => "g4 undo",
-               '!' => "g4 argm undo modec",
-               '@' => "g4 arg undo",
-               '#' => "g2 v6",
-               '$' => "g2",
-               '%' => "g2",
-               '^' => "g2",
-               '&' => "g4 undo",
-               '*' => "g2 v6",
-               '(' => 'g2',
-               ')' => 'g2',
-               '_' => "g2",
-               '+' => "g2",
-               '`' => "g2 arg",
-               '0' => "g2",
-               '^^'=> "g4",
-               '-' => "g2",
-               '=' => 'g4 argm undo',
-               '?' => "g2 arg modec",
-               ';' => "g2",
-               ':' => "g4 modec",
-               "'" => "g2 arg",
-               '"' => 'g4 arg',
-               '\\' => 'g9 arg',
-               '^\\' => "g7 arg",
-               ',' => "g2",
-               '<' => "g4 argm undo",
-               '.' => "g4 undo",
-               '>' => "g4 argm undo",
-               '/' => "g2 arg modec",
-               '[' => "g9 arg mode[",
-               '{' => "g2",
-               ']' => "g9 arg mode]",
-               '}' => "g2",
-               '^]'=> "g3",
-               '|' => "g2",
-
-               'a' => "g6 undo modei",
-               'A' => "g6 undo modei",
-               '^a'=> "g4 undo",
-               'b' => "g2",
-               'B' => "g2",
-               '^b'=> "g3",
-               'c' => "g6 argm undo modei",
-               'C' => "g6 undo modei",
-               '^c'=> "g4",
-               'd' => "g4 argm undo moded",
-               'D' => "g4 undo",
-               '^d'=> "g3",
-               'e' => "g2",
-               'E' => "g2",
-               '^e'=> "g3",
-               'f' => "g2 arg",
-               'F' => "g2 arg",
-               '^f'=> "g3",
-               'g' => "g9 arg modeg",
-               'G' => "g2",
-               '^g'=> "g1",
-               'h' => "g2",
-               'H' => "g2",
-               '^h'=> "=h",
-               'i' => "g6 undo modei",
-               'I' => "g6 undo modei",
-               '^i'=> "g2 v6",
-               'j' => "g2",
-               'J' => "g4 undo",
-               '^j'=> "=j",
-               'k' => "g2",
-               'K' => "g4",
-               'l' => "g2",
-               'L' => "g2",
-               '^l'=> "g1",
-               'm' => "g4 arg",
-               'M' => "g2",
-               '^m'=> "=+",
-               'n' => "g2",
-               'N' => "g2",
-               '^n'=> "=j",
-               'o' => "g6 undo modei",
-               'O' => "g6 undo modei",
-               '^o'=> "g2 v6",
-               'p' => "g4 undo",
-               'P' => "g4 undo",
-               '^p'=> "=k",
-               'q' => "g7 arg",
-               'Q' => "g7",
-               '^q'=> "g1", # or ^v
-               'r' => "g4 arg undo",
-               'R' => "g6 undo modei",
-               '^r'=> "g4 undo v6",
-               's' => "g6 undo modei",
-               'S' => "g6 undo modei",
-               '^s'=> "g1",
-               't' => "g2 arg",
-               'T' => "g2 arg",
-               '^t'=> "g3",
-               'u' => "g4 undo",
-               'U' => "g4 undo",
-               '^u'=> "g3",
-               'v' => "g8 modev",
-               'V' => "g8 modev",
-               '^v'=> "g8 modev v6",
-               'w' => "g2",
-               'W' => "g2",
-               '^w'=> "g9 arg mode^w",
-               'x' => "g4 undo",
-               'X' => "g4 undo",
-               '^x'=> "g4 undo",
-               'y' => "g4 argm",
-               'Y' => "g4",
-               '^y'=> "g3",
-               'z' => "g9 arg modez",
-               'Z' => "g9 arg modeZ",
-               '^z'=> "g1",
+               '~' => ["g4 undo", "case toggle"],
+               '!' => ["g4 argm undo modec", "filt<>er lines"],
+               '@' => ["g4 arg undo", "play macro"],
+               '#' => ["g2 v6", "rev. find word"],
+               '$' => ["g2", "eol"],
+               '%' => ["g2", "goto match"],
+               '^' => ["g2", '"soft" bol'],
+               '&' => ["g4 undo", ":s rep<>eat"],
+               '*' => ["g2 v6", "find word"],
+               '(' => ['g2', "begin senten<>ce"],
+               ')' => ['g2', "end senten<>ce"],
+               '_' => ["g2", '"soft" bol down'],
+               '+' => ["g2", "next line"],
+               '`' => ["g2 arg", "goto mark"],
+               '0' => ["g2", '"hard" bol'],
+               '^^'=> ["g4", "edit alt. file"],
+               '-' => ["g2", "prev line"],
+               '=' => ['g4 argm undo', "re<>ind<>ent"],
+               '?' => ["g2 arg modec", "find rev."],
+               ';' => ["g2", "repeat t/f/T/F"],
+               ':' => ["g4 modec", "ex cmd line"],
+               "'" => ["g2 arg", "goto mark bol"],
+               '"' => ['g4 arg', "use reg<>ister"],
+               '\\' => ['g9 arg', "reser<>ved"],
+               '^\\' => ["g7 arg", "to mode/<>ext<>ens<>ion<>s"],
+               ',' => ["g2", "reverse t/T/f/F"],
+               '<' => ["g4 argm undo", "un<>ind<>ent"],
+               '.' => ["g4 undo", "repeat last cmd"],
+               '>' => ["g4 argm undo", "ind<>ent"],
+               '/' => ["g2 arg modec", "find"],
+               '[' => ["g9 arg mode[", "move back<>ward<>s"],
+               '{' => ["g2", "begin parag."],
+               ']' => ["g9 arg mode]", "move forw<>ard"],
+               '}' => ["g2", "end parag."],
+               '^]'=> ["g3", "go to tag"],
+               '|' => ["g2", "goto (1st) col"],
+
+               'a' => ["g6 undo modei", "app<>end"],
+               'A' => ["g6 undo modei", "app<>end to eol"],
+               '^a'=> ["g4 undo", "incr<>ement\nAdd one"],
+               'b' => ["g2", "prev word\nBack"],
+               'B' => ["g2", 'prev <span style="font-variant:small-caps">word</span>'],
+               '^b'=> ["g3", "page up"],
+               'c' => ["g6 argm undo modei", "chan<>ge"],
+               'C' => ["g6 undo modei", "chan<>ge to eol"],
+               '^c'=> ["g4", "abort"],
+               'd' => ["g4 argm undo moded", "del<>ete"],
+               'D' => ["g4 undo", "delete to eol"],
+               '^d'=> ["g3", "scroll down"],
+               'e' => ["g2", "end word"],
+               'E' => ["g2", 'end <span style="font-variant:small-caps">word</span>'],
+               '^e'=> ["g3", "window down\nExtra line"],
+               'f' => ["g2 arg", "fwd to char"],
+               'F' => ["g2 arg", "back<>wd to char"],
+               '^f'=> ["g3", "page down\npage Forward"],
+               'g' => ["g9 arg modeg", "extra cmds"],
+               'G' => ["g2", "eof/<>goto ln"],
+               '^g'=> ["g1", ":file (info)"],
+               'h' => ["g2", "<left>"],
+               'H' => ["g2", "screen top\nHome row"],
+               '^h'=> \'h',
+               'i' => ["g6 undo modei", "insert mode"],
+               'I' => ["g6 undo modei", "insert at bol"],
+               '^i'=> ["g2 v6", "jump to newer\nIncrease position"],
+               'j' => ["g2", "<down>"],
+               'J' => ["g4 undo", "join lines"],
+               '^j'=> \'j',
+               'k' => ["g2", "<up>"],
+               'K' => ["g4", "help\nlooKup Keyword"],
+               'l' => ["g2", "<right>"],
+               'L' => ["g2", "screen bottom\nLowermost Line"],
+               '^l'=> ["g1", "redraw"],
+               'm' => ["g4 arg", "set mark"],
+               'M' => ["g2", "screen mid<>dle"],
+               '^m'=> \'+',
+               'n' => ["g2", "next find"],
+               'N' => ["g2", "prev find"],
+               '^n'=> \'j',
+               'o' => ["g6 undo modei", "line below\nOpen"],
+               'O' => ["g6 undo modei", "line above"],
+               '^o'=> ["g2 v6", "jump to older"],
+               'p' => ["g4 undo", "paste after"],
+               'P' => ["g4 undo", "paste before"],
+               '^p'=> \'k',
+               'q' => ["g7 arg", "rec<>ord macro\nQueue seQuence"],
+               'Q' => ["g7", "ex mode"],
+               '^q'=> ["g1", "(xon)\nQome back"], # or ^v
+               'r' => ["g4 arg undo", "repl<>ace char"],
+               'R' => ["g6 undo modei", "repl<>ace mode"],
+               '^r'=> ["g4 undo v6", "redo"],
+               's' => ["g6 undo modei", "subst char"],
+               'S' => ["g6 undo modei", "subst line"],
+               '^s'=> ["g1", "(xoff)\nStop"],
+               't' => ["g2 arg", "till char"],
+               'T' => ["g2 arg", "back till char"],
+               '^t'=> ["g3", "back tag"], # backtrag :P
+               'u' => ["g4 undo", "undo"],
+               'U' => ["g4 undo", "undo line"],
+               '^u'=> ["g3", "scroll up"],
+               'v' => ["g8 modev", "visual mode"],
+               'V' => ["g8 modev", "visual lines"],
+               '^v'=> ["g8 modev v6", "visual block"],
+               'w' => ["g2", "next word"],
+               'W' => ["g2", 'next <span style="font-variant:small-caps">word</span>'],
+               '^w'=> ["g9 arg mode^w", "win<>dow cmds"],
+               'x' => ["g4 undo", "delete char"],
+               'X' => ["g4 undo", "back<>space"],
+               '^x'=> ["g4 undo", "subs<>tract"],
+               'y' => ["g4 argm", "yank\n(copy)"],
+               'Y' => ["g4", "yank line"],
+               '^y'=> ["g3", "window up\nYield"],
+               'z' => ["g9 arg modez", "extra cmds"],
+               'Z' => ["g9 arg modeZ", "quit"],
+               '^z'=> ["g1", ":sus<>pend\nzzz (as in sleep)"],
        }, # normal mode
 
        g => {
                lead => "g",
 
        }, # normal mode
 
        g => {
                lead => "g",
 
-               "\e"=> "g7 mode",
-
-               '~' => "g4 argm v6",
-               '@' => "g4 v7",
-               '#' => "g2 v6",
-               '$' => "g2",
-               '^' => "g2 v6",
-               '&' => "g4",
-               '*' => "g2 v6",
-               '_' => "g2 v6",
-               '+' => "g4 v7",
-               '`' => "g2 v6 arg",
-               '8' => "g1",
-               '0' => "g2 v6",
-               '-' => "g4 v7",
-               '^['=> "g7 mode",
-               ']' => "g3",
-               '^]'=> "g3",
-               ';' => "g2",
-               "'" => "g2 v6 arg",
-               '<' => "g4 v7",
-               '?' => "g4 argm v6",
-               ',' => "g2",
-
-               'a' => "g1",
-               '^a'=> "g1",
-               'c' => 'g4 argm xcommentary',
-               'd' => "g2 v6",
-               'D' => "g2 v6",
-               'e' => "g2",
-               'E' => "g2",
-               'f' => "g4 v6",
-               'F' => "g4 v7",
-               'g' => "g2",
-               '^g'=> "g1 vim6",
-               'h' => "g8 modev",
-               'H' => "g8 modev",
-               '^h'=> "g8 modev v6",
-               'i' => "g6 undo modei",
-               'I' => "g6 undo modei",
-               'j' => "g2 v6",
-               'J' => "g4",
-               'k' => "g2 v6",
-               'l' => 'g3 argm arg xlion',
-               'L' => 'g3 argm arg xlion',
-               'm' => "g2 v6",
-               'n' => "g8 v7 modev",
-               'N' => "g8 v7 modev",
-               'o' => "g2",
-               'p' => "g4 undo",
-               'P' => "g4",
-               'q' => "g4 argm",
-               'Q' => "g7 v6",
-               'r' => "g4 arg",
-               'R' => "g6 undo modei",
-               's' => "g1 v6",
-               't' => "g3 v7",
-               'T' => "g3 v7",
-               'u' => "g4 argm v6", # XXX undo?
-               'U' => "g4 undo argm v6",
-               'v' => 'g8 modev',
-               'V' => "g4",
-               'w' => "g4 argm v7",
-               'x' => "g4 v7 ext",
+               "\e"=> ["g7 mode", "normal mode"],
+
+               '~' => ["g4 argm v6", "case toggl<>e"],
+               '@' => ["g4 v7", "oper<>at<>or<>func"],
+               '#' => ["g2 v6", "rev. find string"],
+               '$' => ["g2", "virt<>ual eol"],
+               '^' => ["g2 v6", qq'"soft" bol v<>irt<>ual'],
+               '&' => ["g4", ":s rep<>eat glob<>al<>ly\nGlobal substitute"],
+               '*' => ["g2 v6", "find string"],
+               '_' => ["g2 v6", qq'"soft" eol'],
+               '+' => ["g4 v7", "later undo"],
+               '`' => ["g2 v6 arg", "to mark keepj<>umps"],
+               '8' => ["g1", "char hex val<>ue<>s"],
+               '0' => ["g2 v6", "virtual bol"],
+               '-' => ["g4 v7", "earlier undo"],
+               '^['=> ["g7 mode"],
+               ']' => ["g3", "go to tselect"],
+               '^]'=> ["g3", "go to tjump"],
+               ';' => ["g2", "to prev change pos"],
+               "'" => ["g2 v6 arg", "to mark keepj<>umps"],
+               '<' => ["g4 v7", "see prev cmd output"],
+               '?' => ["g4 argm v6", "rot13 encode"],
+               ',' => ["g2", "to next change pos"],
+
+               'a' => ["g1", "char value\nGet Ascii value"],
+               '^a'=> ["g1", "mem usage stats"],
+               'd' => ["g2 v6", "local declar<>ation"],
+               'D' => ["g2 v6", "global declar<>ation"],
+               'e' => ["g2", "back to word end"],
+               'E' => ["g2", qq'back to <span style="font-variant:small-caps">word</span> end'],
+               'f' => ["g4 v6", "edit file at cur<>sor\nGoto File"],
+               'F' => ["g4 v7", "edit file + jump"],
+               'g' => ["g2", "first line"],
+               '^g'=> ["g1 vim6", "cur<>sor pos info"],
+               'h' => ["g8 modev", "select mode\nGet Highlighted"],
+               'H' => ["g8 modev", "select lines\nGet Highlighted"],
+               '^h'=> ["g8 modev v6", "select block\nGet Highlighted"],
+               'i' => ["g6 undo modei", "insert at last pos"],
+               'I' => ["g6 undo modei", "insert at soft bol"],
+               'j' => ["g2 v6", "<down> screen"],
+               'J' => ["g4", "join leave spac<>ing"],
+               'k' => ["g2 v6", "<up> screen"],
+               'm' => ["g2 v6", "cen<>ter screen"],
+               'n' => ["g8 v7 modev", "select next find"],
+               'N' => ["g8 v7 modev", "select prev find"],
+               'o' => ["g2", ":goto (byte)"],
+               'p' => ["g4 undo", "paste still"],
+               'P' => ["g4", "paste before still"],
+               'q' => ["g4 argm", "for<>mat"],
+               'Q' => ["g7 v6", "ex mode manual :"],
+               'r' => ["g4 arg", "virt. repl<>ace char"],
+               'R' => ["g6 undo modei", "virt. repl<>ace mode"],
+               's' => ["g1 v6", "sleep\nGo to Sleep"],
+               't' => ["g3 v7", "next tab\nGoto Tab"],
+               'T' => ["g3 v7", "tab back"],
+               'u' => ["g4 argm v6", "lower<>case"], # XXX undo?
+               'U' => ["g4 undo argm v6", "up<>per<>case"],
+               'v' => ['g8 modev', "prev<>ious highl<>ight\nprecedinG Visual"],
+               'V' => ["g4", "avoid resel<>ect<>ion"],
+               'w' => ["g4 argm v7", "for<>mat still"],
+               'x' => ["g4 v7 ext", "Netrw<>BrowseX"],
+
+               # plugins
+               'c' => ['g4 argm xcommentary', "(un)<>com<>ment\ncommentary or tComment plugin"],
+               'l' => ['g3 argm arg xlion', "align to left\nlion plugin, also good for easy-align"],
+               'L' => ['g3 argm arg xlion', "align to right\nlion plugin"],
        }, # mode g
 
        Z => {
                lead => "Z",
 
        }, # mode g
 
        Z => {
                lead => "Z",
 
-               "\e"=> "g7 mode",
-               '^['=> "=\e",
+               "\e"=> ["g7 mode", "normal mode"],
+               '^['=> \"Z\e",
 
 
-               'Q' => "g4 v6",
-               'Z' => "g4",
+               'Q' => ["g4 v6", " :q! (force)"],
+               'Z' => ["g4", " :wq (write)"],
        }, # mode Z
 
        z => {
                lead => "z",
 
        }, # mode Z
 
        z => {
                lead => "z",
 
-               "\e"=> "g7 mode",
-
-               '^' => "g3",
-               '+' => "g3",
-               '-' => "g3",
-               '=' => "g4 v7",
-               '.' => "g3",
-               '^['=> "=\e",
-
-               'a' => "g4 v6 folding",
-               'A' => "g4 v6 folding",
-               'b' => "g3",
-               'c' => "g4 v6 folding",
-               'C' => "g4 v6 folding",
-               'd' => "g4 v6 folding",
-               'D' => "g4 v6 folding",
-               'e' => "g3",
-               'E' => "g4 v6 folding",
-               'f' => "g4 argm v6 folding",
-               'F' => "g4 v6 folding",
-               'g' => "g4 v7",
-               'G' => "g4 v7",
-               'h' => "g3",
-               'H' => "g3",
-               'i' => "g4 v6 folding",
-               'j' => "g2 v6 folding",
-               'k' => "g2 v6 folding",
-               'l' => "g3",
-               'L' => "g3",
-               '^m'=> "g3",
-               'm' => "g4 v6 folding",
-               'M' => "g4 v6 folding",
-               'n' => "g4 v6 folding",
-               'N' => "g4 v6 folding",
-               'o' => "g4 v6 folding",
-               'O' => "g4 v6 folding",
-               'r' => "g4 v6 folding",
-               'R' => "g4 v6 folding",
-               's' => "g3",
-               't' => "g3",
-               'u' => "g4 arg v7",
-               'v' => "g4 v6 folding",
-               'w' => "g4 v7",
-               'W' => "g4 v7",
-               'x' => "g4 v6 folding",
-               'X' => "g4 v6 folding",
-               'z' => "g3",
+               "\e"=> ["g7 mode", "normal mode"],
+
+               '^' => ["g3", "page above"],
+               '+' => ["g3", "page below"],
+               '-' => ["g3", "line at bottom bol\ndon't (-) see any further"],
+               '=' => ["g4 v7", "sug<>gest spell<>ing"],
+               '.' => ["g3", "line at center bol"],
+               '^['=> \"z\e",
+
+               'a' => ["g4 v6 folding", "toggle fold"],
+               'A' => ["g4 v6 folding", "toggle fold rec<>urs<>ive<>ly"],
+               'b' => ["g3", "line at bot. bol"],
+               'c' => ["g4 v6 folding", "close fold"],
+               'C' => ["g4 v6 folding", "close folds rec<>curs<>ive<>ly"],
+               'd' => ["g4 v6 folding", "delete fold"],
+               'D' => ["g4 v6 folding", "delete folds rec<>urs<>ive"],
+               'e' => ["g3", "cursor at right side"],
+               'E' => ["g4 v6 folding", "elimi<>nate f<>olds"],
+               'f' => ["g4 argm v6 folding", "create fold"],
+               'F' => ["g4 v6 folding", "fold lines"],
+               'g' => ["g4 v7", "add spell<>ing\nGood word"],
+               'G' => ["g4 v7", "temp spell<>ing"],
+               'h' => ["g3", "scroll <left>"],
+               'H' => ["g3", "scroll <left> half scr<>een"],
+               'i' => ["g4 v6 folding", "toggle all folds"],
+               'j' => ["g2 v6 folding", "next fold start"],
+               'k' => ["g2 v6 folding", "prev fold end"],
+               'l' => ["g3", "scroll <right>"],
+               'L' => ["g3", "scroll <right> half scr<>een"],
+               '^m'=> ["g3", "line at top bol"],
+               'm' => ["g4 v6 folding", "fold more"],
+               'M' => ["g4 v6 folding", "close all folds"],
+               'n' => ["g4 v6 folding", "fold none"],
+               'N' => ["g4 v6 folding", "fold norm<>al"],
+               'o' => ["g4 v6 folding", "open fold"],
+               'O' => ["g4 v6 folding", "open folds rec<>urs<>ive<>ly"],
+               'r' => ["g4 v6 folding", "reduce folding"],
+               'R' => ["g4 v6 folding", "open all folds"],
+               's' => ["g3", "cursor at left side"],
+               't' => ["g3", "line at top"],
+               'u' => ["g4 arg v7", "undo spell<>ing"],
+               'v' => ["g4 v6 folding", "unfold cursor line"],
+               'w' => ["g4 v7", "add missp<>ell<>ing\nWrong word"],
+               'W' => ["g4 v7", "temp missp<>ell<>ing"],
+               'x' => ["g4 v6 folding", "update folds"],
+               'X' => ["g4 v6 folding", "re<>apply f<>olds"],
+               'z' => ["g3", "line at center\nZee Zenter (with a funny accent)"],
        }, # mode z
 
        '[' => {
                lead => "[",
 
        }, # mode z
 
        '[' => {
                lead => "[",
 
-               "\e"=> "g7 mode",
-
-               "`" => "g2 v6",
-               '#' => "g2",
-               '(' => "g2",
-               '*' => "=[/",
-               '/' => "g2",
-               "'" => "=0[`^ g2 v6",
-               '{' => "g2",
-               '[' => "g2",
-               '^['=> "=\e",
-               ']' => "g2",
-
-               'c' => "g2",
-               'd' => "g1",
-               'D' => "g4",
-               '^d'=> "g3",
-               'f' => "=gf",  # deprecated
-               'i' => 'g1',
-               'I' => 'g4',
-               '^i'=> 'g3',
-               'm' => "g2",
-               'p' => "g4",
-               'P' => "=[p",
-               's' => "g3 v7",
-               'S' => "g3 v7",
-               'z' => "g2 v6 folding",
-
-               'a' => "g3 xunimpaired",
-               'A' => "g3 xunimpaired",
-               'b' => "g3 xunimpaired",
-               'B' => "g3 xunimpaired",
-               'e' => "g4 xunimpaired",
-               'l' => "g3 xunimpaired",
-               'L' => "g3 xunimpaired",
-               '^l'=> "g3 xunimpaired",
-               '^l'=> "g3 xunimpaired",
-               'f' => "g3 xunimpaired", # overrides native alias
-               'n' => "g3 xunimpaired",
-               'o' => "g9 arg xunimpaired",
-               'q' => "g3 xunimpaired",
-               'Q' => "g3 xunimpaired",
-               '^q'=> "g3 xunimpaired",
-               't' => "g3 xunimpaired",
-               'T' => "g3 xunimpaired",
-               'u' => "g4 argm xunimpaired",
-               'x' => "g4 argm xunimpaired",
-               'y' => "g4 argm xunimpaired",
-               ' ' => "g4 xunimpaired",
+               "\e"=> ["g7 mode", "normal mode"],
+
+               '`' => ["g2 v6", "previous lc mark"],
+               '#' => ["g2", "previous open #if<>/#else"],
+               '(' => ["g2", "previous open ("],
+               '*' => \'[/',
+               '/' => ["g2", "start of C com<>m<>ent"],
+               "'" => ["g2 v6", \"0[`^"],
+               '{' => ["g2", => "previous open {"],
+               '[' => ["g2", "section back<>ward<>s"],
+               '^['=> \"[\e",
+               ']' => ["g2", qq'<span style="font-variant:small-caps">section</span> back<>ward<>s'],
+
+               'c' => ["g2", "start of change backw<>ards"],
+               'd' => ["g1", "define line"],
+               'D' => ["g4", "defin<>ition"],
+               '^d'=> ["g3", "to defin<>it<>ion"],
+               'i' => ['g1', "first occur<>renc<>e line"],
+               'I' => ['g4', "first occur<>renc<>e"],
+               '^i'=> ['g3', "to first occur<>renc<>e"],
+               'm' => ["g2", "start of funct<>ion"],
+               'p' => ["g4", "P reind<>ent<>ed"],
+               'P' => \"[p",
+               's' => ["g3 v7", "last missp<>ell<>ing"],
+               'S' => ["g3 v7", "last bad word"],
+               'z' => ["g2 v6 folding", "start of open fold"],
+
+               # unimpaired
+               'a' => ["g3 xunimpaired", "prev<>ious file\nunimpaired map for :prev"],
+               'A' => ["g3 xunimpaired", "first file\nunimpaired map for :rew"],
+               'b' => ["g3 xunimpaired", "prev<>ious buffer\nunimpaired map for :bp"],
+               'B' => ["g3 xunimpaired", "first buffer\nunimpaired map for :br"],
+               'e' => ["g4 xunimpaired", "exchange line above\nunimpaired plugin"],
+               'f' => \'gf',  # deprecated
+               'f' => ["g3 xunimpaired", "preced<>ing file alph<>abet<>ic<>al<>ly\nunimpaired plugin"], # overrides native alias
+               'l' => ["g3 xunimpaired", "previous loc<>at<>ion\nunimpaired map for :lp"],
+               'L' => ["g3 xunimpaired", "first loc<>ation\nunimpaired map for :lr"],
+               '^l'=> ["g3 xunimpaired", "next file in loc<>at<>ions\nunimpaired map for :lpf"],
+               'n' => ["g3 xunimpaired", "previous conflict<>/hunk\nunimpaired plugin"],
+               'o' => ["g9 arg xunimpaired", "enable option\nunimpaired plugin"],
+               #'p' => ["g4 xunimpaired", "linewise paste before"],
+               'q' => ["g3 xunimpaired", "previous quickfix\nunimpaired map for :cp"],
+               'Q' => ["g3 xunimpaired", "first quickfix\nunimpaired map for :cr"],
+               '^q'=> ["g3 xunimpaired", "quickfix file b<>ack\nunimpaired map for :cpf"],
+               't' => ["g3 xunimpaired", "previous tag\nunimpaired map for :tp"],
+               'T' => ["g3 xunimpaired", "first tag\nunimpaired map for :tr"],
+               'u' => ["g4 argm xunimpaired", "url encode\nunimpaired plugin"],
+               'x' => ["g4 argm xunimpaired", "xml encode\nunimpaired plugin"],
+               'y' => ["g4 argm xunimpaired", "escape c str<>ing\nunimpaired plugin"],
+               ' ' => ["g4 xunimpaired", 'prepend blank l<>in<>e<>s'],
        }, # mode [
 
        ']' => {
                lead => "]",
 
        }, # mode [
 
        ']' => {
                lead => "]",
 
-               "\e"=> "g7 mode",
-
-               "`" => "g2 v6",
-               '#' => "g2",
-               ')' => "g2",
-               '*' => "=]/",
-               "'" => '=$]`^ g2 v6',
-               '/' => "g2",
-               '[' => "g2",
-               '^['=> "=\e",
-               ']' => "g2",
-               '}' => "g2",
-
-               'c' => "g2",
-               'd' => "g1",
-               'D' => "g4",
-               '^d'=> "g3",
-               'f' => "=gf",  # deprecated
-               'i' => "g1",
-               'I' => "g4",
-               '^i'=> "g3",
-               'm' => "g2",
-               'p' => "g4",
-               'P' => "=[p",
-               's' => "g3 v7",
-               'S' => "g3 v7",
-               'z' => "g2 v6 folding",
-
-               'a' => "g3 xunimpaired",
-               'A' => "g3 xunimpaired",
-               'b' => "g3 xunimpaired",
-               'B' => "g3 xunimpaired",
-               'e' => "g4 xunimpaired",
-               'l' => "g3 xunimpaired",
-               'L' => "g3 xunimpaired",
-               '^l'=> "g3 xunimpaired",
-               '^l'=> "g3 xunimpaired",
-               'f' => "g3 xunimpaired", # overrides native alias
-               'n' => "g3 xunimpaired",
-               'o' => "g9 arg xunimpaired",
-               'q' => "g3 xunimpaired",
-               'Q' => "g3 xunimpaired",
-               '^q'=> "g3 xunimpaired",
-               't' => "g3 xunimpaired",
-               'T' => "g3 xunimpaired",
-               'u' => "g4 argm xunimpaired",
-               'x' => "g4 argm xunimpaired",
-               'y' => "g4 argm xunimpaired",
-               ' ' => "g4 xunimpaired",
+               "\e"=> ["g7 mode", "normal mode"],
+
+               '`' => ["g2 v6", "next lc mark"],
+               '#' => ["g2", "next open #endif<>/#else"],
+               ')' => ["g2", "next open )"],
+               '*' => \']/',
+               "'" => ["g2 v6", \'$]`^'],
+               '/' => ["g2", "end of C com<>m<>ent"],
+               '[' => ["g2", qq'<span style="font-variant:small-caps">section</span> forw<>ard'],
+               '^['=> \"]\e",
+               ']' => ["g2", "section forw<>ard"],
+               '}' => ["g2", "next open }"],
+
+               'c' => ["g2", "start of change forw<>ards"],
+               'd' => ["g1", "next define line"],
+               'D' => ["g4", "next define"],
+               '^d'=> ["g3", "to next define"],
+               'f' => \'gf',  # deprecated
+               'i' => ["g1", "next occur<>renc<>e line"],
+               'I' => ["g4", "next occur<>renc<>e"],
+               '^i'=> ["g3", "to occur<>renc<>e"],
+               'm' => ["g2", "end of funct<>ion"],
+               'p' => ["g4", "p reind<>ent<>ed"],
+               'P' => \'[p',
+               's' => ["g3 v7", "next missp<>ell<>ing"],
+               'S' => ["g3 v7", "next bad word"],
+               'z' => ["g2 v6 folding", "end of open fold"],
+
+               # unimpaired
+               'a' => ["g3 xunimpaired", "next file\nunimpaired map for :n"],
+               'A' => ["g3 xunimpaired", "last file\nunimpaired map for :la"],
+               'b' => ["g3 xunimpaired", "next buffer\nunimpaired map for :bn"],
+               'B' => ["g3 xunimpaired", "last buffer\nunimpaired map for :bl"],
+               'e' => ["g4 xunimpaired", "exchange line belo<>w\nunimpaired plugin"],
+               'f' => ["g3 xunimpaired", "next file alph<>abet<>ic<>al<>ly\nunimpaired plugin"], # overrides native alias
+               'l' => ["g3 xunimpaired", "next loc<>ation\nunimpaired map for :lne"],
+               'L' => ["g3 xunimpaired", "last loc<>ation\nunimpaired map for :lla"],
+               '^l'=> ["g3 xunimpaired", "file back in loc<>at<>ions\nunimpaired map for :lnf"],
+               'n' => ["g3 xunimpaired", "next confl<>ict<>/hunk\nunimpaired plugin"],
+               'o' => ["g9 arg xunimpaired", "disable option\nunimpaired plugin"],
+               'q' => ["g3 xunimpaired", "next quickfix error\nunimpaired map for :cn"],
+               'Q' => ["g3 xunimpaired", "last quickfix error\nunimpaired map for :cla"],
+               '^q'=> ["g3 xunimpaired", "next file in q<>uick<>f<>ix\nunimpaired map for :cnf"],
+               't' => ["g3 xunimpaired", "next tag\nunimpaired map for :tn"],
+               'T' => ["g3 xunimpaired", "last tag\nunimpaired map for :tl"],
+               'u' => ["g4 argm xunimpaired", "url decode\nunimpaired plugin"],
+               'x' => ["g4 argm xunimpaired", "xml decode\nunimpaired plugin"],
+               'y' => ["g4 argm xunimpaired", "unescap<>e c str<>ing\nunimpaired plugin"],
+               ' ' => ["g4 xunimpaired", 'add blank l<>in<>e<>s bel<>ow'],
        }, # mode ]
 
        '^w' => {
                lead => "ŵ",
 
        }, # mode ]
 
        '^w' => {
                lead => "ŵ",
 
-               "\e"=> "g7 mode",
-
-               '<' => "g3",
-               '>' => "g3",
-               '^' => "g4",
-               '_' => "g3",
-               '+' => "g3",
-               '-' => "g3",
-               '=' => "g3",
-               '^['=> "=\e",
-               ']' => "g3",
-               '}' => "g3",
-               '|' => "g3",
-
-               'b' => "g3",
-               'c' => "g3",
-               '^c'=> "g7 mode",
-               'd' => "g3",
-               'f' => "g4",
-               'F' => "g4 v7",
-               'g' => "g9 arg mode^wg",
-               'h' => "g3",
-               'H' => "g3",
-               'i' => "g3",
-               'j' => "g3",
-               'J' => "g3",
-               'k' => "g3",
-               'K' => "g3",
-               'l' => "g3",
-               'L' => "g3",
-               'n' => "g4",
-               'o' => "g3",
-               'p' => "g3",
-               'P' => "g3",
-               'q' => "g4",
-               'r' => "g3",
-               'R' => "g3",
-               's' => "g3",
-               'S' => "=^ws",
-               't' => "g3",
-               'T' => "g3 v7",
-               'v' => "g3",
-               'w' => "g3",
-               'W' => "g3",
-               'x' => "g3",
-               'z' => "g3",
+               "\e"=> ["g7 mode", "normal mode"],
+
+               '<' => ["g3", => "width decr<>ease"],
+               '>' => ["g3", => "width incr<>ease"],
+               '^' => ["g4", => "split, edit alt file"],
+               '_' => ["g3", => "set height"],
+               '+' => ["g3", => "height incr<>ease"],
+               '-' => ["g3", => "height decr<>ease"],
+               '=' => ["g3", => "same height"],
+               '^['=> \"^w\e",
+               ']' => ["g3", => "split, to tag"],
+               '}' => ["g3", => "pre<>view tag"],
+               '|' => ["g3", => "set width"],
+
+               'b' => ["g3", => "go to bot<>tom"],
+               'c' => ["g3", => ":close"],
+               '^c'=> ["g7 mode", "abort"],
+               'd' => ["g3", => "split, to def<>inition"],
+               'f' => ["g4", => "split, file edit"],
+               'F' => ["g4 v7", => "^wf, jump to line"],
+               'g' => ["g9 arg mode^wg", => "extra cmds"],
+               'h' => ["g3", => "go left"],
+               'H' => ["g3", => "move far left"],
+               'i' => ["g3", => "split, to decl of id<>ent<>ifier"],
+               'j' => ["g3", => "go down"],
+               'J' => ["g3", => "move to bottom"],
+               'k' => ["g3", => "go up"],
+               'K' => ["g3", => "move to top"],
+               'l' => ["g3", => "go right"],
+               'L' => ["g3", => "move far right"],
+               'n' => ["g4", => "open new"],
+               'o' => ["g3", => ":only current"],
+               'p' => ["g3", => "go to prev<>ious"],
+               'P' => ["g3", => "go to pre<>view"],
+               'q' => ["g4", => ":quit current"],
+               'r' => ["g3", => "rotate down<>ward<>s"],
+               'R' => ["g3", => "rotate up<>ward<>s"],
+               's' => ["g3", => "split horiz<>ont<>al<>ly"],
+               'S' => \'^ws',
+               't' => ["g3", => "go to top"],
+               'T' => ["g3 v7", => "to tab"],
+               'v' => ["g3", => "split vert<>ic<>al<>ly"],
+               'w' => ["g3", => "go to next\nWrap around"],
+               'W' => ["g3", => "go above<>/left"],
+               'x' => ["g3", => "ex<>chan<>ge"],
+               'z' => ["g3", => "close pre<>view"],
        }, # mode ^w
 
        '^wg' => {
                lead => "ŵg",
 
        }, # mode ^w
 
        '^wg' => {
                lead => "ŵg",
 
-               "\e"=> "g7 mode",
-               '^['=> "=\e",
-               ']' => "g3",
-               '}' => "g3",
-               '^]'=> "g3",
-               'f' => "g4 v7",
-               'F' => "g4 v7",
+               "\e"=> ["g7 mode", "normal mode"],
+               '^['=> \"^wg\e",
+               ']' => ["g3", => "split, :ts<>elect"],
+               '}' => ["g3", => ":ptj<>ump to tag"],
+               '^]'=> ["g3", "split, :tj<>ump"],
+               'f' => ["g4 v7", => "file in tab"],
+               'F' => ["g4 v7", => "^wgf, to line<>nr"],
        }, # mode ^w g
 
        v => {
        }, # mode ^w g
 
        v => {
-               "\e"=> "g7 mode",
-
-               '!' => "g4",
-               ':' => "g7 modec",
-               '<' => "g4",
-               '=' => 'g4 undo',
-               '>' => 'g4',
-               '~' => "g4 v6",
-               '^['=> "=\e",
-               '^]'=> "g3",
-               '^\\'=>'^\\',
-
-               'a' => 'g9 modeva arg v6',
-               'A' => 'g6 modei v6',
-               '^a'=> 'g4 undo v8',
-               'c' => 'g6 modei v6',
-               'C' => 'g6 modei v6',
-               '^c'=> "g7 mode",
-               'd' => "g4 v6",
-               'D' => "g4 v6",
-               'g' => "g9 arg modevg",
-               '^g'=> "g8",
-               'i' => "g9 modeva arg v6",
-               'I' => "g6 modei v6", # block
-               'J' => "g4",
-               'K' => 'g4',
-               'o' => "g2",
-               'O' => "g2",
-               '^o'=> "g8",
-               'p' => 'g4',
-               'P' => 'g4',
-               'r' => 'g4 arg',
-               'R' => "=vS",  # "might change in future"
-               's' => "=vc",
-               'S' => 'g6 modei v6',
-               'u' => "g4 v6",
-               'U' => "g4 v6",
-               'v' => "g8",
-               'V' => "g8",
-               '^v'=> "g8 v6",
-               'x' => "=vd",
-               'X' => "=vD",
-               '^x'=> 'g4 undo v8',
-               'y' => "g4",
-               'Y' => "g4",
-
-               (map { $_ => "=$_" } @motions, qw(
+               "\e"=> ["g7 mode", "normal mode"],
+
+               '!' => ["g4", "external filter"],
+               ':' => ["g7 modec", "cmd on range"],
+               '<' => ["g4", "un<>indent"],
+               '=' => ['g4 undo', "re<>ind<>ent"],
+               '>' => ['g4', "ind<>ent"],
+               '~' => ["g4 v6", "toggle case"],
+               '^['=> \"v\e",
+               '^]'=> ["g3", "jump to tag"],
+               '^\\'=>\'^\\',
+
+               'a' => ['g9 modeva arg v6', "ex<>tend area"],
+               'A' => ['g6 modei v6', "ap<>pend to block"], # block
+               '^a'=> ['g4 undo v8', "incr<>ement num<>bers"],
+               'c' => ['g6 modei v6', "repl<>ace area"],
+               'C' => ['g6 modei v6', "repl<>ace full lines"], # like vS, but blocks are extended until eol
+               '^c'=> ["g7 mode", "abort"],
+               'd' => ["g4 v6", "delete area"],
+               'D' => ["g4 v6", "delete lines"],
+               'g' => ["g9 arg modevg", "extra cmds"],
+               '^g'=> ["g8", "select mode"],
+               'i' => ["g9 modeva arg v6", "extend inner a<>r<>ea"],
+               'I' => ["g6 modei v6", "insert to block"], # block
+               'J' => ["g4", "join lines"],
+               'K' => ['g4', "help sel<>ect<>ion"],
+               'o' => ["g2", "to other corner"],
+               'O' => ["g2", "to other side"],
+               '^o'=> ["g8", "visual once"], # select
+               'p' => ['g4', "repl<>ace w/ paste"],
+               'P' => ['g4', "repl<>ace w/ paste"],
+               'r' => ['g4 arg', "fill up w/ ch<>ar"],
+               'R' => \'vS',  # "might change in future"
+               's' => \'vc',
+               'S' => ['g6 modei v6', "repl<>ace lines"],
+               'u' => ["g4 v6", "lower<>case"],
+               'U' => ["g4 v6", "upper<>case"],
+               'v' => ["g8", "char<>wise"],
+               'V' => ["g8", "line<>wise"],
+               '^v'=> ["g8 v6", "block<>wise"],
+               'x' => \'vd',
+               'X' => \'vD',
+               '^x'=> ['g4 undo v8', "decr<>ement num<>bers"],
+               'y' => ["g4", "yank area"],
+               'Y' => ["g4", "yank lines"],
+
+               (map { $_ => \$_ } @motions, qw(
                        ^b ^d ^e ^f ^i m q ^q ^s ^u ^w ^y z ^z "
                        ^b ^d ^e ^f ^i m q ^q ^s ^u ^w ^y z ^z "
-               )), # a lot like normal mode
+               )), # a lot like normal mode TODO
        }, # mode v
 
        }, # mode v
 
-       vg => {
+       'vg' => {
                lead => "g",
 
                lead => "g",
 
-               "\e"=> "g8 modev",
-
-               '^['=> "=\e",
-               '?' => "g4 v6",
-               '^a'=> 'g4 undo v8',
-               '^g' => "g1 vim6",
-               'c' => 'g4 xcommentary',
-               'J' => 'g4 v6',
-               'l' => 'g3 arg xlion',
-               'L' => 'g3 arg xlion',
-               'q' => "g4 v6",
-               'v' => "=gv",
-               'w' => 'g4 v7',
-               '^x'=> 'g4 undo v8',
+               "\e"=> ["g8 modev", "visual mode"],
+
+               '^['=> \"vg\e",
+               '?' => ["g4 v6", => "rot13 encode"],
+               '^a'=> ['g4 undo v8', "seq. incr<>ement"],
+               '^g' => ["g1 vim6", "count region info"],
+               'J' => ['g4 v6', => "join literal<>ly"],
+               'q' => ["g4 v6", => "for<>mat"],
+               'v' => \'gv',
+               'w' => ['g4 v7', => "for<>mat still"],
+               '^x'=> ['g4 undo v8', "seq. decr<>ement"],
+
+               # plugins
+               'c' => ['g4 xcommentary', => "(un)<>com<>ment\ncommentary or tComment plugin"],
+               'l' => ['g3 arg xlion', => "align to left\nlion plugin, also good for easy-align"],
+               'L' => ['g3 arg xlion', => "align to right\nlion plugin"],
        }, # mode v g
 
        va => {
        }, # mode v g
 
        va => {
-               "\e"=> "g8 modev",
-
-               '(' => "=vab",
-               ')' => "=vab",
-               '`' => "=va'",
-               "'" => 'g2 v7',
-               '"' => "=va'",
-               '<' => 'g2 v6',
-               '>' => "=va&lt;",
-               '[' => 'g2 v6',
-               '{' => "=vaB",
-               '^['=> "=\e",
-               ']' => "=va[",
-               '}' => "=vaB",
-
-               'b' => 'g2 v6',
-               'B' => 'g2 v6',
-               'p' => 'g2 v6',
-               's' => 'g2 v6',
-               't' => 'g2 v7',
-               'w' => 'g2 v6',
-               'W' => 'g2 v6',
+               "\e"=> ["g8 modev", "visual mode"],
+
+               '(' => \'vab',
+               ')' => \'vab',
+               '`' => \"va'",
+               "'" => ['g2 v7', "quoted string"],
+               '"' => \"va'",
+               '<' => ['g2 v6', => "&lt;&gt; block"],
+               '>' => \'va<',
+               '[' => ['g2 v6', => "[] block"],
+               '{' => \'vaB',
+               '^['=> \"va\e",
+               ']' => \'va[',
+               '}' => \'vaB',
+
+               'b' => ['g2 v6', => "() block"],
+               'B' => ['g2 v6', => "{} Block"],
+               'p' => ['g2 v6', => "para<>graph"],
+               's' => ['g2 v6', => "senten<>ce"],
+               't' => ['g2 v7', => "xml tag block"],
+               'w' => ['g2 v6', => "word"],
+               'W' => ['g2 v6', => '<span style="font-variant:small-caps">word</span>'],
        }, # mode v a
 
        #c => {
        #       desc => "command-line mode",
        #
        }, # mode v a
 
        #c => {
        #       desc => "command-line mode",
        #
-       #       '^_' => "=i^_",
-       #       '^^' => "=i^^",
+       #       '^_' => \"i^_",
+       #       '^^' => \"i^^",
        #       '^\\'=>'^\\',
        #       '^\\'=>'^\\',
-       #       '^a' => "", #todo
-       #       '^b' => "g3",
-       #       '^c' => "=i^c",
-       #       '^d' => "", #todo
-       #       '^e' => "g3",
-       #       '^h' => "=i^h",
-       #       '^j' => "g4",
-       #       '^k' => "=i^k",
-       #       '^l' => "", #todo
-       #       '^n' => "", #todo
-       #       '^p' => "", #todo
-       #       '^r' => "=i^r", # and then some...
-       #            ## ["g4 arg v6"],
-       #       '^q' => "=^q",
-       #       '^u' => "=i^u",
-       #       '^v' => "=i^v",
-       #       '^w' => "=i^w",
-       #       '^y' => "g4",
+       #       '^a' => ["", "complete"], #todo
+       #       '^b' => ["g3", "bol"],
+       #       '^c' => \"i^c",
+       #       '^d' => ["", "complete"], #todo
+       #       '^e' => ["g3", "eol"],
+       #       '^h' => \"i^h",
+       #       '^j' => ["g4", "execute cmd"],
+       #       '^k' => \"i^k",
+       #       '^l' => ["", "complete"], #todo
+       #       '^n' => ["", "complete"], #todo
+       #       '^p' => ["", "complete"], #todo
+       #       '^r' => \'i^r', # and then some...
+       #            ## ["g4 arg v6", "insert register"],
+       #       '^q' => \"^q",
+       #       '^u' => \"i^u",
+       #       '^v' => \"i^v",
+       #       '^w' => \"i^w",
+       #       '^y' => ["g4", "selec<>tion to clip<>b<>oard"],
        #}, # mode c
 
        i => {
        #}, # mode c
 
        i => {
-               "\e" => "g7 mode",
-
-               '^@' => "g4",
-               '^^' => "g4 v6",
-               '^['=> "=\e",
-               '^]' => "g4 v6",
-               '^_' => "g4 v6",
-               '^\\'=>'^\\',
-
-               '^a' => "g4 v6",
-               '^b' => "no v6",
-               '^c' => "g7 mode",
-               '^d' => 'g4',
-               '^e' => "g4 v6",
-               '^f' => 'g4',
-               '^g' => "g9 modei^g arg",
-               '^h' => "g4",
-               '^i' => "g4",
-               '^j' => "g4",
-               '^k' => 'g4 arg arg v6 linkdigraphs',
-               '^l' => "g7 mode v6",  # insertmode only
-               '^m' => "g4",
-               '^n' => "g2 v6",
-               '^o' => 'g4',
-               '^p' => "g2 v6",
-               '^q' => "=^q",  # or i^v
-               '^r' => 'g4 arg v6',
-               '^s' => "=^s",
-               '^t' => "g4",
-               '^u' => "g4",
-               '^v' => 'g4 linkcharset',
-               '^w' => "g4",
-               '^x' => 'g9 arg modei^x v6',
-               '^y' => "g4 v6",
-               '^z' => "g1 v6",  # insertmode only
+               "\e" => ["g7 mode", "normal mode"],
+
+               '^@' => ["g4", => "last insert"],
+               '^^' => ["g4 v6", => "toggle :lmap usag<>e"],
+               '^[' => \"i\e",
+               '^]' => ["g4 v6", => "abbrev<>iate"],
+               '^_' => ["g4 v6", => "toggle lang<>uage"],
+               '^\\'=>\'^\\',
+
+               '^a' => ["g4 v6", => "insert prev<>ious"],
+               '^b' => ["no v6", => "former i^_"],
+               '^c' => ["g7 mode", => "abort, no abbr"],
+               '^d' => ['g4', => "un<>ind<>ent"],
+               '^e' => ["g4 v6", => "ins char below"],
+               '^f' => ['g4', => "set indent<>ation"],
+               '^g' => ["g9 modei^g arg", => "extra cmds"],
+               '^h' => ["g4", => "back<>space"],
+               '^i' => ["g4", => "tab"],
+               '^j' => ["g4", => "enter"],
+               '^k' => ['g4 arg arg v6 linkdigraphs', => "di<>graph\nKey code"],
+               '^l' => ["g7 mode v6", => "<em>im</em> leave ins mode"],  # insertmode only
+               '^m' => ["g4", => "enter"],
+               '^n' => ["g2 v6", => "find next keyword"],
+               '^o' => ['g4', => "exec<>ute cmd"],
+               '^p' => ["g2 v6", => "find prev keyword"],
+               '^q' => \'^q',  # or i^v
+               '^r' => ['g4 arg v6', "insert reg<>ister"],
+               '^s' => \'^s',
+               '^t' => ["g4", => "indent"],
+               '^u' => ["g4", => "delete line"],
+               '^v' => ['g4 linkcharset', => "literal or ch<>ar<>cod<>e\nVerbatim or by Value"],
+               '^w' => ["g4", => "delete word back"],
+               '^x' => ['g9 arg modei^x v6', => "ex<>pand mode"],
+               '^y' => ["g4 v6", => "ins char above"],
+               '^z' => ["g1 v6", => ":sus<>pend in <em>im</em>"],  # insertmode only
        }, # modei
 
        'i^g' => {
                lead => "ĝ",
 
        }, # modei
 
        'i^g' => {
                lead => "ĝ",
 
-               "\e"=> 'g6 modei',
+               "\e"=> ['g6 modei', "insert mode"],
 
 
-               'k' => 'g2',
-               'j' => 'g2',
-               's' => 'g4 arg xsurround',
-               'u' => 'g4',
-               'U' => 'g4 v8',
+               'k' => ['g2', => "<up> start col<>umn"],
+               'j' => ['g2', => "<down> start col<>umn"],
+               'u' => ['g4', => "break undo seq<>uence"],
+               'U' => ['g4 v8', => "keep undo seq<>uence"],
                # other keys (even esc) are not recognized
                # other keys (even esc) are not recognized
+
+               's' => ['g4 arg xsurround', => "sur<>round\nsurround plugin"],
        }, # mode i ^g
 
        'i^x' => {
                lead => "x̂",
 
        }, # mode i ^g
 
        'i^x' => {
                lead => "x̂",
 
-               "\e" => "g7 mode", # yes, it really leaves insert mode
-
-               '^['=> "=\e",
-               '^]' => 'g4',
-               '^d' => 'g4',
-               '^e' => "g3",
-               '^f' => 'g4',
-               '^i' => 'g4',
-               '^k' => 'g4',
-               '^l' => 'g4',
-               '^n' => 'g4',
-               '^o' => 'g4 v7',
-               '^p' => 'g4',
-               '^s' => 'g4',
-                's' => "=i^x^s",
-               '^t' => 'g4',
-               '^u' => 'g4 v7',
-               '^v' => 'g4',
-               '^y' => "g3",
+               "\e" => ["g7 mode", "normal mode"], # yes, it really leaves insert mode
+
+               '^['=> \"i^x\e",
+               '^]' => ['g4', => "tag comp<>l<>et<>e"],
+               '^d' => ['g4', => "def<>ine compl<>et<>e"],
+               '^e' => ["g3", => "window up"],
+               '^f' => ['g4', => "file comp<>l<>et<>e"],
+               '^i' => ['g4', => "ident comp<>l<>et<>e"],
+               '^k' => ['g4', => "dict comp<>l<>et<>e"],
+               '^l' => ['g4', => "line comp<>l<>et<>e"],
+               '^n' => ['g4', => "next comp<>l<>et<>e"],
+               '^o' => ['g4 v7', => "omni comp<>l<>et<>e"],
+               '^p' => ['g4', => "prev comp<>l<>ete"],
+               '^s' => ['g4', => "spell sugg<>est"],
+                's' => \'i^x^s',
+               '^t' => ['g4', => "thes<>aur<>us compl<>et<>e"],
+               '^u' => ['g4 v7', => "cus<>tom comp<>l<>et<>e"],
+               '^v' => ['g4', => "ex cmd compl<>et<>e"],
+               '^y' => ["g3", => "window down"],
        }, # mode i ^x
 
        d => {
                lead => "d",
 
        }, # mode i ^x
 
        d => {
                lead => "d",
 
-               "\e"=> "g7 mode",
-               '^['=> "=\e",
-
-               (map { $_ => 'g4' } @motions),
-               (map { $_ => 'g4 arg' } qw( f F t T ` ' / ? )), # @motions with option
-               (map { $_ => "=v$_" } qw( a i )), # motions from virtual
-               (map { $_ => "=$_" } qw( g z [ ]  \\ ^\\ ^q ^s ^z )),
-
-               'd'  => 'g4',
-               'o'  => 'g5',
-               'p'  => 'g5',
-               's'  => 'g4 arg xsurround',
-
-               'l'  => '=x',
-               'h'  => '=X',
-               '^h' => '=X',
-               '^j' => '=dj',
-               '^m' => '=dj',
-               '^n' => '=dj',
-               '+'  => '=dj',
-               '^p' => '=dk',
-               '-'  => '=dk',
-               '$'  => '=D',
-               '_'  => '=dd',
+               "\e"=> ["g7 mode", "normal mode"],
+               '^['=> \"d\e",
+
+               'd'  => ['g4', 'delete line'],
+               'o'  => ['g5', 'diff obtain'],
+               'p'  => ['g5', 'diff put'],
+               's'  => ['g4 arg xsurround', 'delete surr<>oun<>d<>ing'],
+
+               (map { ($_ => [\$_, "delete to <alias>$_"]) } qw( g z [ ] )), # modes
+
+               # commands
+               (map { $_ => \$_ } qw( \\ ^\\ ^q ^s ^z )),
+               'l'  => \'x',
+               'h'  => \'X',
+               '^h' => \'X',
+               '^j' => \'dj',
+               '^m' => \'dj',
+               '^n' => \'dj',
+               '+'  => \'dj',
+               '^p' => \'dk',
+               '-'  => \'dk',
+               '$'  => \'D',
+               '_'  => \'dd',
+
+               # simple @motions
+               'W' => ['g4', 'delete <span style="font-variant:small-caps">word</span>'],
+               'b' => ['g4', 'delete <left> word'],
+               'B' => ['g4', 'delete <left> <span style="font-variant:small-caps">word</span>'],
+               'e' => ['g4', 'delete word e<>nd'],
+               'E' => ['g4', 'delete <span style="font-variant:small-caps">word</span> e<>nd'],
+               'G' => ['g4', 'delete to line<>/eof'],
+               'H' => ['g4', 'delete to top'],
+               'j' => ['g4', 'delete <down> line'],
+               'k' => ['g4', 'delete <up> line'],
+               'L' => ['g4', 'delete to bottom'],
+               'M' => ['g4', 'delete to middle'],
+               'n' => ['g4', 'delete to next res<>ult'],
+               'N' => ['g4', 'delete to prev res<>ult'],
+               'w' => ['g4', 'delete word'],
+               ',' => ['g4', 'delete to prev ch<>ar<>acter'],
+               ';' => ['g4', 'delete to next ch<>ar<>acter'],
+               '*' => ['g4', 'delete to find'],
+               '#' => ['g4', 'delete <left> to find'],
+               '%' => ['g4', 'delete to line pct'],
+               '^' => ['g4', 'delete to soft bol'],
+               '0' => ['g4', 'delete to bol'],
+               '|' => ['g4', 'delete to col<>umn'],
+               '{' => ['g4', 'delete <left> par<>agr<>aph'],
+               '}' => ['g4', 'delete rest of p<>ar<>agr<>aph'],
+               '(' => ['g4', 'delete <left> senten<>ce'],
+               ')' => ['g4', 'delete rest of s<>en<>ten<>ce'],
+
+               # @motions with option
+               'f' => ['g4 arg', 'delete to char<>acter'],
+               'F' => ['g4 arg', 'delete <left> to char<>acter'],
+               't' => ['g4 arg', 'delete upto ch<>ar<>acter'],
+               'T' => ['g4 arg', 'delete <left> upto ch<>ar<>acter'],
+               '`' => ['g4 arg', 'delete to mark'],
+               "'" => ['g4 arg', 'delete lines to m<>ark'],
+               '/' => ['g4 arg', 'delete to res<>ult'],
+               '?' => ['g4 arg', 'delete <left> to res<>ult'],
+
+               # motions from virtual
+               'a' => ['g9 modeva arg v6 alias', 'delete area'], # va
+               'i' => ['g9 modeva arg v6 alias', 'delete inner'], # vi
        }, # mode d
 
        }, # mode d
 
+       # y => { 'o' => ['g9 arg xunimpaired', "toggle option\nunimpaired plugin"] }, # TODO
+
        # TODO: mode/ (command-line)
        # XXX ex mode if you want to go completely wild
 },
        # TODO: mode/ (command-line)
        # XXX ex mode if you want to go completely wild
 },
index 5338ecd98eae620376ced63e96605da3cbe4763e..ad1a7cff5919fd87def1704025eaf25698c55088 100644 (file)
@@ -2,180 +2,13 @@ use utf8;
 # vimperator v3.16.0
 {
 title => 'Vimperator',
 # vimperator v3.16.0
 {
 title => 'Vimperator',
-version => '1.3',
+version => '1.4',
 description => [
        "Interactive cheat sheet for the Vimperator (or Pentadactyl)",
        "Firefox extension, describing the function of each key.",
 ],
 keywords => [qw'vimperator firefox pentadactyl vim browser vimfx vimium cvim'],
 
 description => [
        "Interactive cheat sheet for the Vimperator (or Pentadactyl)",
        "Firefox extension, describing the function of each key.",
 ],
 keywords => [qw'vimperator firefox pentadactyl vim browser vimfx vimium cvim'],
 
-key => {
-       '~' => "open home<>dir",
-       '@' => "play macro",
-       '^' => "left of page",
-       '$' => "right of page",
-       '#' => "rev. find word",
-       '*' => "find word",
-       '^^'=> "last tab",
-       '?' => "find rev.",
-       '/' => "find",
-       '[' => "focus forw<>ard",
-       ']' => "focus back",
-       ':' => "comm<>and line mode",
-       ';' => "extend<>ed hint<>s mode",
-       "'" => "jump to mark",
-       '|' => "toggle source",
-       '+' => "en<>large text",
-       '-' => "shrink text",
-
-       'a' => "add bookm<>ark",
-       'A' => "toggle bookm<>ark<>ed",
-       '^a'=> "incr<>em<>ent url nr",
-       'b' => "to buffer",
-       'B' => "list buffers",
-       '^b'=> "page up",
-       'c' => "caret mode",
-       '^c'=> "stop loading",
-       '^d'=> "scroll down",
-       'd' => "close tab",
-       'D' => "close tab left<>ward<>s",
-       'f' => "quick<>hint mode",
-       'F' => "f in tab",
-       '^f'=> "page down",
-       'g' => "extra cmds",
-       'G' => "last/% line",
-       '^g'=> "file name",
-       'h' => "<left>",
-       'H' => "page back",
-       'i' => "ignore key",
-       'I' => ":ignore<>keys add cmd",
-       'j' => "<down>",
-       'k' => "<up>",
-       'l' => "<right>",
-       'L' => "page forw<>ard",
-       'M' => "mark url",
-       'm' => "mark line",
-       'n' => "find next",
-       'N' => "find prev<>ious",
-       '^n'=> "next tab",
-       'o' => "open",
-       'O' => "alter url",
-       'p' => "open pasted url",
-       'P' => "p in tab",
-       'q' => "record macro",
-       'r' => "reload page",
-       'R' => "reload uncach<>e<>d",
-       't' => "tab open new",
-       'T' => "tab open curr<>ent",
-       '^v'=> "pass single",
-       '^u'=> "scroll up",
-       'u' => "restore closed tab",
-       '^x'=> "decr<>em<>ent url nr",
-       'w' => "open in win<>dow",
-       'W' => "copy to new win<>dow",
-       'y' => "copy url",
-       'Y' => "copy select<>ion",
-       'z' => "zoom",
-       'Z' => "quit",
-
-       "g\e"=> "normal mode",
-       'g0' => "first tab",
-       'g@' => "first app tab",
-       'g$' => "last tab",
-
-       'gb' => "repeat buffer cmd",
-       'gB' => "reverse gb",
-       'gf' => "view source",
-       'gF' => "source extern<>al",
-       'g^g'=> "file details",
-       'gg' => "first line",
-       'gh' => "open home<>page",
-       'gH' => "tab with home<>page",
-       'gi' => "last input field",
-       'gn' => "tabopen url mark\nGo in New tab",
-       'go' => "open url mark",
-       'gP' => "<alias>P inactive",
-       'gr' => "reader view",
-       'gt' => "switch tab",
-       'gT' => "tab back",
-       'gu' => "parent dir<>ectory",
-       'gU' => "site root",
-
-       ";\e"=> "normal mode",
-       ';;' => "focus",
-       ';#' => "copy anchor",
-       ';?' => "element details",
-       ';a' => "save as",
-       ';A' => "save media as",
-       ';b' => "open bg tab",
-       ';c' => "context menu",
-       ';f' => "frame focus",
-       ';F' => "multiple bg tabs",
-       ';i' => "image",
-       ';I' => "image in tab",
-       ';o' => "open",
-       ';O' => "open prompt",
-       ';s' => "save",
-       ';S' => "save media obj<>ect",
-       ';t' => "open in tab",
-       ';T' => "tab prompt",
-       ';v' => "view source",
-       ';V' => "edit source",
-       ';w' => "open in wind<>ow",
-       ';W' => "wind<>ow prompt",
-       ';x' => "title or alt",
-       ';y' => "copy url",
-       ';Y' => "copy text",
-
-       "]\e"=> "normal mode",
-       ']f' => "next frame<>set",
-       ']]' => "open <q>next</q>",
-
-       "[\e"=> "normal mode",
-       '[f' => "previous frame<>set",
-       '[[' => "open <q>prev</q>",
-
-       "z\e"=> "normal mode",
-       'zi' => "<alias>+\nZoom In",
-       'zm' => "en<>large more\nZoom More",
-       'zo' => "<alias>-\nZoom Out",
-       'zr' => "tinier text\nZoom Reduce",
-       'zz' => "reset text size\nZoom Zero",
-       'zI' => "zoom in",
-       'zM' => "zoom more",
-       'zO' => "zoom out",
-       'zR' => "zoom out more\nZoom Reduce",
-       'zZ' => "zoom reset\nZoom Zero",
-
-       "Z\e"=> "normal mode",
-       'ZQ' => "quit no save",
-       'ZZ' => "quit save ses<>s<>ion",
-
-       "c\e"=> "normal mode",
-       'c^' => "start of line",
-       'c$' => "end of line",
-       'c#' => "rev. find word",
-       'c*' => "find word",
-       'c?' => "find rev.",
-       'c/' => "find",
-       'c:' => "comm<>and line mode",
-
-       'cb' => "prev word\nBack",
-       'c^b'=> "page up",
-       'c^f'=> "page down",
-       'cg' => "g for first line",
-       'cG' => "last line",
-       'ch' => "<left>",
-       'c^i'=> 'extern<>al edit<>or',
-       'cj' => "<down>",
-       'ck' => "<up>",
-       'cl' => "<right>",
-       'cn' => "find next",
-       'cN' => "find prev<>ious",
-       'cv' => "select\nVisual mode",
-       'cw' => "next word",
-},
-
 mode => {
        ''  => 'normal mode',
        'g' => 'extended commands (g)',
 mode => {
        ''  => 'normal mode',
        'g' => 'extended commands (g)',
@@ -203,208 +36,209 @@ flag => {
 
 def => {
        '' => {
 
 def => {
        '' => {
-               '~' => 'g5',
-               '@' => 'g7 arg',
-               '^' => 'g2',
-               '0' => '=^',
-               '$' => 'g2',
-               '#' => 'g2',
-               '*' => 'g2',
-               '+' => 'g1',
-               '-' => 'g1',
-               '^^'=> 'g3',
-               '?' => 'g2 args',
-               '/' => 'g2 args',
-               '[' => 'g9 arg mode[',
-               ']' => 'g9 arg mode]',
-               ':' => 'g7 args',
-               ';' => 'g9 arg args mode;',
-               "'" => 'g2',
-               '`' => "='",
-               '|' => 'g5 v2 v2.2',
-
-               'a' => 'g7 args',
-               'A' => 'g7',
-               '^a'=> 'g5',
-               'b' => 'g3 args',
-               'B' => 'g1',
-               '^b'=> 'g2',
-               'c' => 'g8 modec',
-               '^c'=> 'g4',
-               '^d'=> 'g2',
-               'd' => 'g4',
-               'D' => 'g4',
-               '^i'=> '=L',
-               'i' => 'g8 arg',
-               'I' => 'g7 args',
-               '^e'=> '=j',
-               'f' => 'g5 args',
-               'F' => 'g6 args',
-               '^f'=> 'g2', # spacebar
-               'g' => 'g9 modeg arg',
-               'G' => 'g2',
-               '^g'=> 'g1',
-               'h' => 'g2',
-               'H' => 'g5',
-               'j' => 'g2',
-               'k' => 'g2',
-               'l' => 'g2',
-               'L' => 'g5',
-               'M' => 'g7 arg',
-               'm' => 'g7 arg',
-               'n' => 'g2',
-               'N' => 'g2',
-               '^n'=> 'g3',
-               'o' => 'g5',
-               'O' => 'g5',
-               '^o'=> '=H',
-               'p' => 'g5',
-               'P' => 'g6',
-               '^p'=> '=gT',
-               'q' => 'g8 arg',
-               'r' => 'g4',
-               'R' => 'g5',
-               't' => 'g6',
-               'T' => 'g6',
-               '^v'=> 'g4 arg',
-               '^u'=> 'g2',
-               'u' => 'g6',
-               'w' => 'g6',
-               'W' => 'g6',
-               '^w'=> '=d',
-               '^x'=> 'g5',
-               'y' => 'g7',
-               'Y' => 'g7',
-               '^y'=> '=k',
-               'z' => 'g1 modez arg',
-               'Z' => 'g9 modeZ arg',
+               '~' => ['g5', "open home<>dir"],
+               '@' => ['g7 arg', "play macro"],
+               '^' => ['g2', "left of page"],
+               '0' => \'^',
+               '$' => ['g2', "right of page"],
+               '#' => ['g2', "rev. find word"],
+               '*' => ['g2', "find word"],
+               '+' => ['g1', "en<>large text"],
+               '-' => ['g1', "shrink text"],
+               '^^'=> ['g3', "last tab"],
+               '?' => ['g2 args', "find rev."],
+               '/' => ['g2 args', "find"],
+               '[' => ['g9 arg mode[', "focus forw<>ard"],
+               ']' => ['g9 arg mode]', "focus back"],
+               ':' => ['g7 args', "comm<>and line mode"],
+               ';' => ['g9 arg args mode;', "extend<>ed hint<>s mode"],
+               "'" => ['g2', "jump to mark"],
+               '`' => \"'",
+               '|' => ['g5 v2 v2.2', "toggle source"],
+
+               'a' => ['g7 args', "add bookm<>ark"],
+               'A' => ['g7', "toggle bookm<>ark<>ed"],
+               '^a'=> ['g5', "incr<>em<>ent url nr"],
+               'b' => ['g3 args', "to buffer"],
+               'B' => ['g1', "list buffers"],
+               '^b'=> ['g2', "page up"],
+               'c' => ['g8 modec', "caret mode"],
+               '^c'=> ['g4', "stop loading"],
+               '^d'=> ['g2', "scroll down"],
+               'd' => ['g4', "close tab"],
+               'D' => ['g4', "close tab left<>ward<>s"],
+               '^i'=> \'L',
+               'i' => ['g8 arg', "ignore key"],
+               'I' => ['g7 args', ":ignore<>keys add cmd"],
+               '^e'=> \'j',
+               'f' => ['g5 args', "quick<>hint mode"],
+               'F' => ['g6 args', "f in tab"],
+               '^f'=> ['g2', "page down"], # spacebar
+               'g' => ['g9 modeg arg', "extra cmds"],
+               'G' => ['g2', "last/% line"],
+               '^g'=> ['g1', "file name"],
+               'h' => ['g2', "<left>"],
+               'H' => ['g5', "page back"],
+               'j' => ['g2', "<down>"],
+               'k' => ['g2', "<up>"],
+               'l' => ['g2', "<right>"],
+               'L' => ['g5', "page forw<>ard"],
+               'M' => ['g7 arg', "mark url"],
+               'm' => ['g7 arg', "mark line"],
+               'n' => ['g2', "find next"],
+               'N' => ['g2', "find prev<>ious"],
+               '^n'=> ['g3', "next tab"],
+               'o' => ['g5', "open"],
+               'O' => ['g5', "alter url"],
+               'p' => ['g5', "open pasted url"],
+               'P' => ['g6', "p in tab"],
+               '^p'=> \'gT',
+               'q' => ['g8 arg', "record macro"],
+               'r' => ['g4', "reload page"],
+               'R' => ['g5', "reload uncach<>e<>d"],
+               't' => ['g6', "tab open new"],
+               'T' => ['g6', "tab open curr<>ent"],
+               '^v'=> ['g4 arg', "pass single"],
+               '^u'=> ['g2', "scroll up"],
+               'u' => ['g6', "restore closed tab"],
+               'w' => ['g6', "open in win<>dow"],
+               'W' => ['g6', "copy to new win<>dow"],
+               '^w'=> \'d',
+               '^x'=> ['g5', "decr<>em<>ent url nr"],
+               'y' => ['g7', "copy url"],
+               'Y' => ['g7', "copy select<>ion"],
+               '^y'=> \'k',
+               'z' => ['g1 modez arg', "zoom"],
+               'Z' => ['g9 modeZ arg', "quit"],
        }, # normal mode
 
        g => {
                lead => 'g',
 
        }, # normal mode
 
        g => {
                lead => 'g',
 
-               "\e"=> 'g8 mode',
-               '0' => 'g3',
-               '@' => 'g3',
-               '$' => 'g3',
-               '^' => '=g0',
-
-               'b' => 'g3',
-               'B' => 'g3',
-               'f' => 'g5',
-               'F' => 'g6 linkvi',
-               '^g'=> 'g1',
-               'g' => 'g2',
-               'h' => 'g5',
-               'H' => 'g6',
-               'i' => 'g2',
-               'n' => 'g6 arg',
-               'o' => 'g5 arg',
-               'P' => 'g6',
-               'r' => 'g5',
-               't' => 'g3',
-               'T' => 'g3',
-               'u' => 'g5',
-               'U' => 'g5',
+               "\e"=> ['g8 mode', "normal mode"],
+               '0' => ['g3', "first tab"],
+               '@' => ['g3', "first app tab"],
+               '$' => ['g3', "last tab"],
+               '^' => \'g0',
+
+               'b' => ['g3', "repeat buffer cmd"],
+               'B' => ['g3', "reverse gb"],
+               'f' => ['g5', "view source"],
+               'F' => ['g6 linkvi', "source extern<>al"],
+               '^g'=> ['g1', "file details"],
+               'g' => ['g2', "first line"],
+               'h' => ['g5', "open home<>page"],
+               'H' => ['g6', "tab with home<>page"],
+               'i' => ['g2', "last input field"],
+               'n' => ['g6 arg', "tabopen url mark\nGo in New tab"],
+               'o' => ['g5 arg', "open url mark"],
+               'P' => ['g6', "<alias>P inactive"],
+               'r' => ['g5', "reader view"],
+               't' => ['g3', "switch tab"],
+               'T' => ['g3', "tab back"],
+               'u' => ['g5', "parent dir<>ectory"],
+               'U' => ['g5', "site root"],
        }, # mode g
 
        ';' => {
                lead => ';',
 
        }, # mode g
 
        ';' => {
                lead => ';',
 
-               "\e"=> 'g8 mode',
-               ';' => 'g2',
-               '#' => 'g7',
-               '?' => 'g1',
-               'a' => 'g7 args',
-               'A' => 'g7 args',
-               'b' => 'g6 v2',
-               'c' => 'g7 v2 v2.2',
-               'f' => 'g2 v2', # previously ';o'
-               'F' => 'g6 v2', # previously ';t'
-               'i' => 'g5 v2 v2.2',
-               'I' => 'g6 v2 v2.2',
-               'o' => 'g5',
-               'O' => 'g5 args',
-               's' => 'g7',
-               'S' => 'g7',
-               't' => 'g6',
-               'T' => 'g6 args',
-               'v' => 'g5',
-               'V' => 'g6 linkvi',
-               'w' => 'g6',
-               'W' => 'g6 args',
-               'x' => 'g1',
-               'y' => 'g7',
-               'Y' => 'g7',
+               "\e"=> ['g8 mode', "normal mode"],
+               ';' => ['g2', "focus"],
+               '#' => ['g7', "copy anchor"],
+               '?' => ['g1', "element details"],
+               'a' => ['g7 args', "save as"],
+               'A' => ['g7 args', "save media as"],
+               'b' => ['g6 v2', "open bg tab"],
+               'c' => ['g7 v2 v2.2', "context menu"],
+               'f' => ['g2 v2', "frame focus"], # previously ';o'
+               'F' => ['g6 v2', "multiple bg tabs"], # previously ';t'
+               'i' => ['g5 v2 v2.2', "image"],
+               'I' => ['g6 v2 v2.2', "image in tab"],
+               'o' => ['g5', "open"],
+               'O' => ['g5 args', "open prompt"],
+               's' => ['g7', "save"],
+               'S' => ['g7', "save media obj<>ect"],
+               't' => ['g6', "open in tab"],
+               'T' => ['g6 args', "tab prompt"],
+               'v' => ['g5', "view source"],
+               'V' => ['g6 linkvi', "edit source"],
+               'w' => ['g6', "open in wind<>ow"],
+               'W' => ['g6 args', "wind<>ow prompt"],
+               'x' => ['g1', "title or alt"],
+               'y' => ['g7', "copy url"],
+               'Y' => ['g7', "copy text"],
        }, # mode ;
 
        ']' => {
                lead => ']',
 
        }, # mode ;
 
        ']' => {
                lead => ']',
 
-               "\e"=> 'g8 mode',
-               'f' => 'g2',
-               ']' => 'g5',
+               "\e"=> ['g8 mode', "normal mode"],
+               'f' => ['g2', "next frame<>set"],
+               ']' => ['g5', "open <q>next</q>"],
        }, # mode ]
 
        '[' => {
                lead => '[',
 
        }, # mode ]
 
        '[' => {
                lead => '[',
 
-               "\e"=> 'g8 mode',
-               'f' => 'g2',
-               '[' => 'g5',
+               "\e"=> ['g8 mode', "normal mode"],
+               'f' => ['g2', "previous frame<>set"],
+               '[' => ['g5', "open <q>prev</q>"],
        }, # mode [
 
        z => {
                lead => 'z',
 
        }, # mode [
 
        z => {
                lead => 'z',
 
-               "\e"=> 'g8 mode',
-               'i' => '=+',
-               'm' => 'g1',
-               'o' => '=-',
-               'r' => 'g1',
-               'z' => 'g1',
-               'I' => 'g1',
-               'M' => 'g1',
-               'O' => 'g1',
-               'R' => 'g1',
-               'Z' => 'g1',
+               "\e"=> ['g8 mode', "normal mode"],
+               'i' => [\'+', "<alias>+\nZoom In"],
+               'm' => ['g1', "en<>large more\nZoom More"],
+               'o' => [\'-', "<alias>-\nZoom Out"],
+
+               'r' => ['g1', "tinier text\nZoom Reduce"],
+               'z' => ['g1', "reset text size\nZoom Zero"],
+               'I' => ['g1', "zoom in"],
+               'M' => ['g1', "zoom more"],
+               'O' => ['g1', "zoom out"],
+               'R' => ['g1', "zoom out more\nZoom Reduce"],
+               'Z' => ['g1', "zoom reset\nZoom Zero"],
        }, # mode z
 
        Z => {
                lead => 'Z',
 
        }, # mode z
 
        Z => {
                lead => 'Z',
 
-               "\e"=> 'g8 mode',
-               'Q' => 'g7',
-               'Z' => 'g7',
+               "\e"=> ['g8 mode', "normal mode"],
+               'Q' => ['g7', "quit no save"],
+               'Z' => ['g7', "quit save ses<>s<>ion"],
        }, # mode Z
 
        c => {
        }, # mode Z
 
        c => {
-               "\e"=> 'g8 mode',
-               '^' => 'g2',
-               '0' => '=^',
-               '$' => 'g2',
-               '#' => 'g2',
-               '*' => 'g2',
-               '?' => 'g2 args',
-               '/' => 'g2 args',
-               ':' => 'g7 args',
-
-               'b' => 'g2',
-               'B' => '=b',
-               '^b'=> 'g2',
-               'e' => '=w',
-               '^f'=> 'g2',
-               'g' => 'g9 arg',
-               'G' => 'g2',
-               'h' => 'g2',
-               '^i'=> 'g7',
-               'j' => 'g2',
-               'k' => 'g2',
-               'l' => 'g2',
-               'n' => 'g2',
-               'v' => 'g8',
-               'w' => 'g2',
-               'W' => '=w',
+               "\e"=> ['g8 mode', "normal mode"],
+               '^' => ['g2', "start of line"],
+               '0' => \'^',
+               '$' => ['g2', "end of line"],
+               '#' => ['g2', "rev. find word"],
+               '*' => ['g2', "find word"],
+               '?' => ['g2 args', "find rev."],
+               '/' => ['g2 args', "find"],
+               ':' => ['g7 args', "comm<>and line mode"],
+
+               'b' => ['g2', "prev word\nBack"],
+               'B' => \'b',
+               '^b'=> ['g2', "page up"],
+               'e' => \'w',
+               '^f'=> ['g2', "page down"],
+               'g' => ['g9 arg', "g for first line"],
+               'G' => ['g2', "last line"],
+               'h' => ['g2', "<left>"],
+               '^i'=> ['g7', 'extern<>al edit<>or'],
+               'j' => ['g2', "<down>"],
+               'k' => ['g2', "<up>"],
+               'l' => ['g2', "<right>"],
+               'n' => ['g2', "find next"],
+               'N' => ['g2', "find prev<>ious"],
+               'v' => ['g8', "select\nVisual mode"],
+               'w' => ['g2', "next word"],
+               'W' => \'w',
        }, # caret mode
 },
 }
        }, # caret mode
 },
 }
index aad7b71fb8a01fa6fd77b1ec9e3a578abe8bda06..ede329729fc5996d4b45c07844ff91b11df9fbfc 100644 (file)
@@ -1,4 +1,7 @@
 use utf8;
 use utf8;
+use strict;
+use warnings;
+no warnings 'qw';
 my @num = qw(^0 ^0 ^@ ^0 ^0 ^0 ^^ ^0 ^0 ^0 ^0);
 
 dvorak => [[
 my @num = qw(^0 ^0 ^@ ^0 ^0 ^0 ^^ ^0 ^0 ^0 ^0);
 
 dvorak => [[
diff --git a/keyspos.inc.pl b/keyspos.inc.pl
new file mode 100644 (file)
index 0000000..3e26a17
--- /dev/null
@@ -0,0 +1,56 @@
+use strict;
+use warnings;
+use utf8;
++{
+       TLDE => ["`", "~"],
+       AE01 => ['1', "!"],
+       AE02 => ['2', "\@"],
+       AE03 => ['3', "#"],
+       AE04 => ['4', "\$"],
+       AE05 => ['5', "%"],
+       AE06 => ['6', "^"],
+       AE07 => ['7', "&"],
+       AE08 => ['8', "*"],
+       AE09 => ['9', "("],
+       AE10 => ['0', ")"],
+       AE11 => ["-", "_"],
+       AE12 => ["=", "+"],
+
+       AD01 => ["q", "Q"],
+       AD02 => ["w", "W"],
+       AD03 => ["e", "E"],
+       AD04 => ["r", "R"],
+       AD05 => ["t", "T"],
+       AD06 => ["y", "Y"],
+       AD07 => ["u", "U"],
+       AD08 => ["i", "I"],
+       AD09 => ["o", "O"],
+       AD10 => ["p", "P"],
+       AD11 => ["[", "{"],
+       AD12 => ["]", "}"],
+
+       AC01 => ["a", "A"],
+       AC02 => ["s", "S"],
+       AC03 => ["d", "D"],
+       AC04 => ["f", "F"],
+       AC05 => ["g", "G"],
+       AC06 => ["h", "H"],
+       AC07 => ["j", "J"],
+       AC08 => ["k", "K"],
+       AC09 => ["l", "L"],
+       AC10 => [";", ":"],
+       AC11 => ["'", '"'],
+
+       LSGT => ["§", "±"], # mac
+       AB01 => ["z", "Z"],
+       AB02 => ["x", "X"],
+       AB03 => ["c", "C"],
+       AB04 => ["v", "V"],
+       AB05 => ["b", "B"],
+       AB06 => ["n", "N"],
+       AB07 => ["m", "M"],
+       AB08 => [",", "<"],
+       AB09 => [".", ">"],
+       AB10 => ["/", "?"],
+       BKSL => ["\\","|"],
+}
index e26cbcd4603722a25fbc935e5469eee3ca367ec4..449335b65435a91656734d81d87345aeae1a0de4 100644 (file)
@@ -252,6 +252,8 @@ my $wbr = "\N{ZERO WIDTH SPACE}";
                        [q"<code>use re 'strict'</code>", 'apply stricter syntax rules to regular expression patterns', {experimental => 're_strict'}],
                        ['<code>0x.beep+0</code>', q"hexadecimal floating point notation with binary power; <code>printf '%a'</code> to display"],
                        ['<code><s>??</s></code>', 'single match shorthand (deprecated since v5.14) requires the operator <code><em>m</em>?PATTERN?</code>'],
                        [q"<code>use re 'strict'</code>", 'apply stricter syntax rules to regular expression patterns', {experimental => 're_strict'}],
                        ['<code>0x.beep+0</code>', q"hexadecimal floating point notation with binary power; <code>printf '%a'</code> to display"],
                        ['<code><s>??</s></code>', 'single match shorthand (deprecated since v5.14) requires the operator <code><em>m</em>?PATTERN?</code>'],
+                       ['<code><s>use CGI</s></code>' => 'deprecated interface for serving http requests removed from core'
+                       .', see <a href="https://metacpan.org/pod/CGI::Alternatives" target=_blank>CGI::Alternatives</a>', {name => 'cgi'}],
                ],
                unicode => '7.0',
                release => '2015-06-01',
                ],
                unicode => '7.0',
                release => '2015-06-01',
@@ -322,6 +324,7 @@ my $wbr = "\N{ZERO WIDTH SPACE}";
                        ['<code>m(\p{nv=/.*/})</code>', 'match unicode properties by regular expressions', {experimental => 'uniprop_wildcards'}],
                        ['<code><s>my $state if 0</s></code>', 'workaround for <code><a href="#state">state</a></code> (deprecated since v5.10!) is now prohibited'],
                        [q"<code>qr'\N'</code>", 'Delimiters must be graphemes; unescaped <code>{</code> illegal; <code>\N</code> in single quotes'],
                        ['<code>m(\p{nv=/.*/})</code>', 'match unicode properties by regular expressions', {experimental => 'uniprop_wildcards'}],
                        ['<code><s>my $state if 0</s></code>', 'workaround for <code><a href="#state">state</a></code> (deprecated since v5.10!) is now prohibited'],
                        [q"<code>qr'\N'</code>", 'Delimiters must be graphemes; unescaped <code>{</code> illegal; <code>\N</code> in single quotes'],
+                       ['<code><s>use Locale::Codes</s></code>', 'removed from core, get actual lists from CPAN', {dropped => v5.30}],
                ],
                unicode => '12.1',
                release => '2019-05-22',
                ],
                unicode => '12.1',
                release => '2019-05-22',
index 2d9cb010025f52bcc9758c28a912bf1ee027976a..0ee9639da43603d99bdb4a47d090e02d595b4d9f 100644 (file)
--- a/perl.plp
+++ b/perl.plp
@@ -2,7 +2,7 @@
 
 Html({
        title => 'perl version cheat sheet',
 
 Html({
        title => 'perl version cheat sheet',
-       version => '1.5',
+       version => '1.7',
        keywords => [qw'
                perl version feature features comparison
                sheet cheat overview summary
        keywords => [qw'
                perl version feature features comparison
                sheet cheat overview summary
@@ -113,7 +113,8 @@ sub featattrs ($attr) {
                $title = 'experimental';
        }
        if (defined $attr->{dropped}) {
                $title = 'experimental';
        }
        if (defined $attr->{dropped}) {
-               return '' unless exists $get{v};
+               no warnings 'exiting';
+               next unless exists $get{v}; # skip containing feature
                $title = sprintf 'removed in %vd', $_ for $attr->{dropped} || ();
        }
        elsif ($attr->{stable}) {
                $title = sprintf 'removed in %vd', $_ for $attr->{dropped} || ();
        }
        elsif ($attr->{stable}) {
index cf22e34c75d64c3e4fa341900741fba5a4b30534..81b340886240d263439fde095a222862cf031a2d 100644 (file)
@@ -29,7 +29,7 @@ if ($source =~ s{(?<=\Q.inc.pl\E)/jsonp?$}{} and -r $source) {
 
 Html({
        title => "$source source code",
 
 Html({
        title => "$source source code",
-       version => '1.3',
+       version => '1.4',
        description => !$source ? 'Index of source files for this site.' : [
                "Source code of the $source file at this site,",
                "with syntax highlighted and references linked."
        description => !$source ? 'Index of source files for this site.' : [
                "Source code of the $source file at this site,",
                "with syntax highlighted and references linked."
@@ -123,7 +123,7 @@ else {
                        $line =~ s{ ^(['"]?) \K ($incname) (?=\1$) }{ showlink($2, "/source/$2") }xe
                                if !$type || $type eq 'Constant';
                        # link relative page locations in html output
                        $line =~ s{ ^(['"]?) \K ($incname) (?=\1$) }{ showlink($2, "/source/$2") }xe
                                if !$type || $type eq 'Constant';
                        # link relative page locations in html output
-                       $line =~ s{ ^(&quot;)\K (/\w+) (?= (?:/\w+)* \1$) }{ showlink($2, "/source$2.plp") }xe
+                       $line =~ s{ ^(&quot;)\K (/\w{2,}) (?= (?:/\w+)* \1$) }{ showlink($2, "/source$2.plp") }xe
                                if $type && $type eq 'Constant';
                        # link perl module names (Xx::Xx...)
                        $line =~ s{ ^\s* \K ([A-Z]\w+(?:::\w+)+) (?![^;\s]) }{ showlink($1, "/source/$1") }xe
                                if $type && $type eq 'Constant';
                        # link perl module names (Xx::Xx...)
                        $line =~ s{ ^\s* \K ([A-Z]\w+(?:::\w+)+) (?![^;\s]) }{ showlink($1, "/source/$1") }xe
index 5117b7690117cb12bed52963260d0d885a621195..4cddd4174231876de10f06c95ce5bfc7bd3fba50 100755 (executable)
@@ -53,7 +53,8 @@ print JSON->new->ascii->canonical->encode({
                '^u^\ in <a href="/readline">Emacs</a>,',
                '^a^v in <a href="/screen">Screen</a>.',
                'Similar but different from <a href="/digraphs/xorg">X.Org</a>.',
                '^u^\ in <a href="/readline">Emacs</a>,',
                '^a^v in <a href="/screen">Screen</a>.',
                'Similar but different from <a href="/digraphs/xorg">X.Org</a>.',
-               'Also see <a href="/unicode">common Unicode</a>.</p>',
+               'Also see <a href="/keyboard/altgr">monograph maps</a>',
+               'for more specific combinations with AltGr.</p>',
                '<p class="aside">Unofficial <span class="u-l2">proposals</span>',
                'are available as <a href="/digraphs.vim">ex commands</a>.',
        ),
                '<p class="aside">Unofficial <span class="u-l2">proposals</span>',
                'are available as <a href="/digraphs.vim">ex commands</a>.',
        ),
index be53fff65de0229be48c5796df5882c876a6c51a..64c99d9648dffaabdf9dd6e5286f82d850a4f4f3 100755 (executable)
@@ -80,7 +80,8 @@ print JSON->new->canonical->indent->encode({
                'Character mnemonics following compose key ⎄:',
                'in the X Window System (Shift+AltGr by default).',
                'Differences from <a href="/digraphs">RFC-1345</a> are indicated.',
                'Character mnemonics following compose key ⎄:',
                'in the X Window System (Shift+AltGr by default).',
                'Differences from <a href="/digraphs">RFC-1345</a> are indicated.',
-               'Also see <a href="/unicode">common Unicode</a>.',
+               'Also see <a href="/keyboard/altgr">monograph maps</a>',
+               'of alternative Xorg input modes with an AltGr modifier.</p>',
        ),
        keywords => [qw( xorg x11 x )],
        flag  => {
        ),
        keywords => [qw( xorg x11 x )],
        flag  => {
index a7049fa4a0eb8516090efe783454cfe957367e9a..5cac74d803c3a1f7f08d4157fbb4b3caaac2a700 100755 (executable)
@@ -3,10 +3,12 @@ use 5.014;
 use warnings;
 use utf8;
 use re '/msx';
 use warnings;
 use utf8;
 use re '/msx';
+use open IO => ':encoding(utf-8)', ':std';
+use charnames ();
 use JSON ();
 use Data::Dump 'pp';
 
 use JSON ();
 use Data::Dump 'pp';
 
-our $VERSION = '1.00';
+our $VERSION = '1.02';
 
 my $symname = eval {
        open my $keysymh, '<', 'data/keysymdef.json' or die $!;
 
 my $symname = eval {
        open my $keysymh, '<', 'data/keysymdef.json' or die $!;
@@ -14,59 +16,8 @@ my $symname = eval {
        return JSON->new->decode(readline $keysymh);
 } or die "Could not read keysym definitions: $@\n";
 
        return JSON->new->decode(readline $keysymh);
 } or die "Could not read keysym definitions: $@\n";
 
-my %geochar = (
-       TLDE => ["`", "~"],
-       AE01 => ['1', "!"],
-       AE02 => ['2', "\@"],
-       AE03 => ['3', "#"],
-       AE04 => ['4', "\$"],
-       AE05 => ['5', "%"],
-       AE06 => ['6', "^"],
-       AE07 => ['7', "&"],
-       AE08 => ['8', "*"],
-       AE09 => ['9', "("],
-       AE10 => ['0', ")"],
-       AE11 => ["-", "_"],
-       AE12 => ["=", "+"],
-
-       AD01 => ["q", "Q"],
-       AD02 => ["w", "W"],
-       AD03 => ["e", "E"],
-       AD04 => ["r", "R"],
-       AD05 => ["t", "T"],
-       AD06 => ["y", "Y"],
-       AD07 => ["u", "U"],
-       AD08 => ["i", "I"],
-       AD09 => ["o", "O"],
-       AD10 => ["p", "P"],
-       AD11 => ["[", "{"],
-       AD12 => ["]", "}"],
-
-       AC01 => ["a", "A"],
-       AC02 => ["s", "S"],
-       AC03 => ["d", "D"],
-       AC04 => ["f", "F"],
-       AC05 => ["g", "G"],
-       AC06 => ["h", "H"],
-       AC07 => ["j", "J"],
-       AC08 => ["k", "K"],
-       AC09 => ["l", "L"],
-       AC10 => [";", ":"],
-       AC11 => ["'", '"'],
-
-       LSGT => ["§", "±"], # mac
-       AB01 => ["z", "Z"],
-       AB02 => ["x", "X"],
-       AB03 => ["c", "C"],
-       AB04 => ["v", "V"],
-       AB05 => ["b", "B"],
-       AB06 => ["n", "N"],
-       AB07 => ["m", "M"],
-       AB08 => [",", "<"],
-       AB09 => [".", ">"],
-       AB10 => ["/", "?"],
-       BKSL => ["\\","|"],
-);
+my $geochar = do './keyspos.inc.pl'
+       or die "Could not read keyboard position names: $@\n";
 
 my %res;
 while (readline) {
 
 my %res;
 while (readline) {
@@ -81,14 +32,25 @@ while (readline) {
                elsif (defined $symname->{$chr}) {
                        $chr = $symname->{$chr};
                }
                elsif (defined $symname->{$chr}) {
                        $chr = $symname->{$chr};
                }
+               elsif ($chr eq 'NoSymbol') {
+                       next;
+               }
                else {
                        warn "unknown symbol $chr at $pos\n";
                }
                else {
                        warn "unknown symbol $chr at $pos\n";
                }
-               $res{$geochar{$pos}->[$shift] // $pos} = $chr;
+               $res{$geochar->{$pos}->[$shift] // $pos} = $chr;
                #$res{$pos}[$shift] = $symname->{$chr} // $chr; # geochar
        }
 }
                #$res{$pos}[$shift] = $symname->{$chr} // $chr; # geochar
        }
 }
-say pp \%res;
+say ppp(\%res);
+
+sub ppp {
+       local $_ = pp(@_);
+       s/(?<=") \\x \{? ([0-9A-F]{2,6}) \}?/chr hex $1/eg; # unescape glyphs
+       s/(\p{Mn})/sprintf '\N{%s}', charnames::viacode(ord $1)/eg; # named accents
+       return $_;
+}
+
 
 __END__
 
 
 __END__
 
index cbffc0beb45e3313321c00dac0a42c8e40f5c857..0b4a7344ea6b83a5e207b97248d40fb84fb04653 100755 (executable)
@@ -2,7 +2,7 @@
 use 5.014;
 use warnings;
 
 use 5.014;
 use warnings;
 
-our $VERSION = '1.03';
+our $VERSION = '1.04';
 
 use File::stat;
 use Time::Piece;
 
 use File::stat;
 use Time::Piece;
@@ -18,9 +18,11 @@ my @pages = (
        )],
        [qw(
                apl less screen digits sc/bw sc/hots termcol/legacy mplayer
        )],
        [qw(
                apl less screen digits sc/bw sc/hots termcol/legacy mplayer
+               digraphs/xorg
                keyboard/altgr/macos-abc keyboard/altgr/msx keyboard/altgr/ukext
                keyboard/altgr/eurkey keyboard/altgr/apl keyboard/altgr/spacecadet
                keyboard/altgr/macos-abc keyboard/altgr/msx keyboard/altgr/ukext
                keyboard/altgr/eurkey keyboard/altgr/apl keyboard/altgr/spacecadet
-               keyboard/altgr/ipa
+               keyboard/altgr/ipa keyboard/altgr/boyeg keyboard/altgr/drix
+               keyboard/altgr/symbolics keyboard/altgr/msx-graph
        )],
        [qw( chars/table/html sample source plan )],
 );
        )],
        [qw( chars/table/html sample source plan )],
 );
diff --git a/tools/mkxkbsymbols b/tools/mkxkbsymbols
new file mode 100755 (executable)
index 0000000..52aa8a9
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/env perl
+use 5.014;
+use warnings;
+use utf8;
+
+use JSON ();
+
+our $VERSION = '1.01';
+
+my $map = shift if @ARGV and $ARGV[0] =~ /^-+m/;
+
+my $info = eval {
+       local $/;
+       return JSON->new->utf8->decode(readline);
+} or die "Could not read keyboard layout data: $@\n";
+
+my $geochar = do './keyspos.inc.pl'
+       or die "Could not read keyboard position names: $@\n";
+
+if (($info->{moderows} // '') =~ /4/) {
+       push @{$_}, map {"+$_"} @{$_} for values %{$geochar};
+}
+if ($map) {
+       unshift @{$_}, '', '' for values %{$geochar};
+}
+
+my ($name) = $ARGV =~ m{.*/([^.]+)};
+my $len = (grep { defined $_->[4] } values %{$geochar}) ?
+       'EIGHT' : 'FOUR';
+
+printf <<".";
+default partial alphanumeric_keys
+xkb_symbols "$name" {
+       name[Group1] = "$info->{title}";
+       key.type[Group1] = "${len}_LEVEL_SEMIALPHABETIC";
+.
+
+for my $k (sort keys %{$geochar}) {
+       printf "\tkey <%s> {[%s]};\n", $k, join(', ',
+               map { !$_ ? 'NoSymbol' : sprintf 'U%04X', ord }
+               map { $info->{key}->{$_} } @{ $geochar->{$k} }
+       );
+}
+
+say '};';
+
+=head1 NAME
+
+mkxkbsymbols - Export keyboard layout metadata as Xorg symbols
+
+=head1 SYNOPSIS
+
+    tools/mkxkbsymbols data/keyboard/altgr/$NAME.eng.json >$NAME
+    setxkbmap -print $NAME | xkbcomp -w0 -I.. - $DISPLAY
+
+=head1 DESCRIPTION
+
+Converts site includes (back) to I<xkb_symbols> configurations
+compatible with C<xkbcomp> so it can be used in Xorg.
+
+=head1 AUTHOR
+
+Mischa POSLAWSKY <perl@shiar.org>
+
+=head1 LICENSE
+
+Licensed under the GNU Affero General Public License version 3.
+
index d1875ef12e4a92ca0848e09b8c8339aee65aa12d..2342d751fec2b2d3f6cd9ceb4fc4bbe573676d9f 100644 (file)
@@ -130,7 +130,8 @@ block => {
        shades   => [qw{. ░ . ▒ . ▓ }],
        fill4    => [qw{. ▘ ▀ ▝ . ▌ █ ▐ . ▖ ▄ ▗ }],
        fill4i   => [qw{. ▛ ▚ ▟ . ▙ ▞ ▜ }],
        shades   => [qw{. ░ . ▒ . ▓ }],
        fill4    => [qw{. ▘ ▀ ▝ . ▌ █ ▐ . ▖ ▄ ▗ }],
        fill4i   => [qw{. ▛ ▚ ▟ . ▙ ▞ ▜ }],
-       fill8    => [qw{. ▁ ▂ ▃ ▄ ▅ ▆ ▇ ▔ . ▏ ▎ ▍ ▌ ▋ ▊ ▉ ▕ }],
+       fill8    => [qw{. ▁ ▂ ▃ ▄ ▅ ▆ ▇ . ▏ ▎ ▍ ▌ ▋ ▊ ▉ }],
+       fill8r   => [qw{. ▔ 🮂 🮃 ▀ 🮄 🮅 🮆 . ▕ 🮇 🮈 ▐ 🮉 🮊 🮋 }],
        colour   => [qw{. 🟫 🟥 🟧 🟨 🟩 🟦 🟪}],
 },
 
        colour   => [qw{. 🟫 🟥 🟧 🟨 🟩 🟦 🟪}],
 },