Prevent inflation of emojiworks, similar to meta rows elsewhere.
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/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,$<)
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 $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;
- $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);
}
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 $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*)//;
- 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';
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',
},
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;
);
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";
- $info{def}->{$lead}{$lead} = 'g1 mode'; # back
+ $info{def}->{$lead}{$lead} = ['g1 mode']; # back
}
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);
- $info{key}{$lead.$k} = join "\n", $glyph, $title;
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
: $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} = {%{{
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;
}
}
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 {
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;
}
Html({
title => "$mode digraph cheat sheet",
- version => '1.3',
+ version => '1.5',
description => $di->{description} // [
"Complete table of digraph characters from",
($di->{title} // $mode) . ".",
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(
- '<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,
),
);
Html({
title => 'cheat sheets',
canonical => '/',
- version => '1.17',
+ version => '1.18',
description => [
"Cheat sheets summarising various software programs and standards.",
],
<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>
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 $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'];
+{
--- /dev/null
+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'],
+ },
+}
--- /dev/null
+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 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'],
+ },
+}
']' => "}",
'^' => "\N{COMBINING MACRON}",
'_' => "\xB1",
- '`' => "\xA3",
+ '`' => \'l',
'A' => "\x{2190}",
'a' => "\xE6",
'B' => "\x{20bf}",
'd' => "\x{394}",
'D' => "\x{2192}",
'e' => "\x{20AC}",
- 'E' => "\x{20AC}",
+ 'E' => \'e',
'f' => "\x{192}",
'F' => "\x{191}",
#'g' => "g",
'x' => "\xD7",
'X' => "\xF7",
'y' => "\xA5",
- 'Y' => "\xA5",
+ 'Y' => \'y',
'z' => "\xA7",
'Z' => "\xB6",
'{' => "\xAB",
';' => "\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',
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' :
# greek
'm' => {
'a' => 'α',
- 'b' => 'β', # v
+ 'b' => 'β',
'g' => 'γ',
'd' => 'δ',
'e' => 'ε',
'f' => 'φ',
'c' => 'χ',
'w' => 'ψ',
- 'q' => 'ω', # u
+ 'q' => 'ω',
+
+ # aliases
+ 'v' => \'mb',
+ 'V' => \'mB',
+ 'u' => \'mq',
+ 'U' => \'mQ',
# suþscript
'1' => '¹',
},
);
+# uppercase greek
+$rows{m}{uc $_} //= uc $rows{m}{$_} for keys %{ $rows{m} };
+
+{
%{ kbmodes(\%rows) },
mode => {
'M' => '√ maths prefix ⌥M',
$presymbol => "$rows{''}{$presymbol} symbol prefix ⌥$presymbol",
},
- version => '1.1',
+ version => '1.2',
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',
--- /dev/null
+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* [3-9] \d{2,}/x) {
+ # move root ^ctrl or +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
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",
- version => '1.2',
+ version => '1.3',
description => [
"Overview of alternate keyboard modes,",
"offering extended Unicode characters if a modifier key",
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 )],
- data => ['keyboard/altgr/index.inc.plp', @incs],
+ data => ["$dirbase/index.inc.plp", "$indexfile.inc.pl"],
raw => <<'.',
<style>
.keys.cmp {
.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;
}
:>
<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;
-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>},
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 %{$_} } map { $_->{inventory}{''} } @{$idx}{@incs}
+);
+for my $inc (@incs) {
+ my $table = $idx->{$inc};
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) {
- 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" />};
}
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 "<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 {
- $keys->{flag}{$_}[0] || 'extra' # legend label of each class
+ $table->{flag}{$_}[0] || 'extra' # legend label of each class
} reverse split / /, $g)
- for $inventory{$g};
+ for $table->{inventory}{$mode}{$g};
}
say '</span>';
}
print "\t<td class=ni>";
- print join ' ', map { $caticon{$_} // () } split m{/}, $keys->{category};
+ print join ' ', map { $caticon{$_} // () }
+ split m{/}, $table->{category} // '';
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>';
}
}
--- /dev/null
+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',
+}
%{ 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',
'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' => '-',
- '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' => 'ø',
- 'P' => "\N{SINGLE LOW-9 QUOTATION MARK}", #XXX
+ 'P' => ',',
'p' => "\N{COMBINING COMMA BELOW}",
'Q' => 'Œ',
'q' => 'œ',
'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' => '¥',
'5' => '§',
'%' => '†',
'6' => "\N{COMBINING CIRCUMFLEX ACCENT}",
- '^' => "\N{MODIFIER LETTER CIRCUMFLEX ACCENT}", #XXX
+ '^' => "\N{MODIFIER LETTER CIRCUMFLEX ACCENT}",
'7' => '¶',
'&' => '‡',
'8' => '•',
'%' => 'Ƽ',
'5' => 'ƽ',
'^' => 'Ƅ',
- '6' => 'ƅ', #XXX
+ '6' => 'ƅ',
'7' => '⁊',
'*' => 'Ȣ',
'8' => 'ȣ',
'W' => 'Ƿ',
'w' => 'ƿ',
'E' => 'Ǝ',
- 'e' => 'ǝ', #XXX ə
+ 'e' => 'ǝ',
'R' => 'Ʀ',
- 'r' => 'ʀ', #XXX
+ 'r' => 'ʀ',
'k' => 'ĸ',
- 'Y' => 'Ɜ',
- 'y' => 'ɜ',
+ 'Y' => 'Ȝ',
+ 'y' => 'ȝ',
'U' => 'Ʊ',
'u' => 'ʊ',
'A' => 'Ə',
'H' => 'Ƕ',
'h' => 'ƕ',
'J' => 'Ƞ',
- 'j' => 'ƞ', #XXX ɳ
+ 'j' => 'ƞ',
'K' => 'Ǩ',
'Z' => 'Ʒ',
'z' => 'ʒ',
'C' => 'Ɔ',
'c' => 'ɔ',
'v' => 'ʌ',
- 'N' => 'Ŋ', #XXX
+ 'N' => 'Ŋ',
'n' => 'ŋ',
'M' => 'Ɯ',
'm' => 'ɯ',
- '"' => '″', #XXX ʺ
- "'" => '′', #XXX ʹ
+ '"' => 'ʺ',
+ "'" => 'ʹ',
},
'>' => {
'q' => 'ʠ',
- 'R' => 'Ʈ', #XXX mirrored?
+ 'R' => 'Ʈ', # mirrored preview
'r' => 'ʈ',
'T' => 'Ƭ',
't' => 'ƭ',
':' => '№ 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',
- "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',
--- /dev/null
+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.",
+ ],
+}
use warnings;
use Shiar_Sheet::KeyboardChars 'kbchars';
-my %rows = (
+our %rows = (
'A' => 'Å',
'a' => 'å',
'B' => 'ı',
'J' => 'Ô',
'j' => '∆',
'K' => '',
- 'k' => '°',
+ 'k' => '˚', # really
'L' => 'Ò',
'l' => '¬',
'M' => 'Â',
'X' => "\N{OGONEK}",
'x' => '≈',
'Y' => 'Á',
- 'y' => '¥',
+ 'y' => '¥', # terminal substitutes \
'Z' => "\N{CEDILLA}",
'z' => 'Ω',
'[' => "\N{LEFT DOUBLE QUOTATION MARK}",
+{
%{ kbchars(\%rows) },
- version => '1.3',
+ version => '1.4',
title => 'US option',
category => '2/latin/macos',
intro => join("\n",
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'];
-$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 },
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).",
+ '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>.",
),
);
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'];
+{
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'];
-$groups->{def}{''}{$_} .= ' ext' for keys %shift; # mark aliases
+{
%{ $groups },
);
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'];
);
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) {
- $groups->{def}->{''}->{$key} =~ s/g6/g5/ if $chr =~ /\A\p{Greek}/;
+ $groups->{def}{''}{$key}[0] =~ s/g6/g5/ if $chr =~ /\A\p{Greek}/;
}
+{
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 "
- '2' => "\N{COMBINING DIAERESIS}",
'#' => '⅓', # uk £
'3' => '³',
'$' => '¼',
- '4' => '€',
'%' => '⅜',
- '5' => '½',
+ '5' => \'@',
'^' => '⅝',
- '6' => "\N{COMBINING CIRCUMFLEX ACCENT}",
'&' => '⅞',
- '7' => '{',
'*' => '™',
- '8' => '[',
'(' => '±',
- '9' => ']',
')' => '°',
- '0' => '}',
'_' => '¿',
- '-' => '\\',
'+' => "\N{COMBINING OGONEK}",
'=' => "\N{COMBINING CEDILLA}",
'Q' => 'Ω',
- 'q' => '@',
- 'W' => 'Ẃ',
- 'w' => 'ẃ',
- 'E' => 'É',
- 'e' => 'é',
'R' => '®',
'r' => '¶',
'T' => 'Ŧ',
't' => 'ŧ',
- 'Y' => 'Ý',
- 'y' => 'ý',
- 'U' => 'Ú',
- 'u' => 'ú',
- 'I' => 'Í',
- 'i' => 'í',
- 'O' => 'Ó',
- 'o' => 'ó',
'P' => 'Þ',
'p' => 'þ',
'{' => "\N{COMBINING RING ABOVE}",
- '}' => "\N{COMBINING MACRON}",
- 'A' => 'Á',
- 'a' => 'á',
+ '}' => "\N{COMBINING MACRON}", # originally |
+ '[' => \'2',
+ ']' => \'\\',
'S' => '§',
's' => 'ß',
'D' => 'Ð',
'h' => 'ħ',
'J' => "\N{COMBINING HORN}",
'j' => "\N{COMBINING HOOK ABOVE}",
- 'K' => '&',
'k' => 'ĸ',
'L' => 'Ł',
'l' => 'ł',
':' => "\N{COMBINING DOUBLE ACUTE ACCENT}",
- ';' => "\N{COMBINING ACUTE ACCENT}",
+ ';' => \"'",
'"' => "\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' => '«',
- 'X' => '>',
+ 'X' => '›',
'x' => '»',
- 'C' => 'Ç',
- 'c' => 'ç',
'V' => '‘',
'v' => '“',
'B' => '’',
'?' => "\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',
- version => '1.0',
+ version => '1.1',
intro => join("\n",
- "A Chrome OS extension",
+ "A Chrome OS extension and Xorg option",
"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",
--- /dev/null
+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>'],
+ },
+}
--- /dev/null
+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",
+ ],
+}
);
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)'];
+{
--- /dev/null
+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.",
+ ],
+}
--- /dev/null
+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'],
+ },
+}
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)',
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
- "\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' => "='",
- # '^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"],
},
},
}
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",
},
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"],
},
},
}
use utf8;
my $legacy = do 'keyboard/mplayer.eng.inc.pl' or die $@;
+$legacy->{def}{''}{$_}[0] =~ s/ ext\b// for '1'..'8';
{
title => 'mpv',
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} },
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,
- '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,
- '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'],
},
},
}
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 = (
- "\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
);
{
],
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)',
'' => {
%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,
- '|' => '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',
- 'U' => 'g4',
- 'y' => 'g7',
+ 'V' => ['g1', "preview mailcap filter"],
+ 'U' => ['g4', "encode attach<>m<>ent"],
+ 'y' => ['g7', "send"],
+ # ^xe
}, # 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
'/~' => {
- "\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
},
}
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',
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' => {
- "\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' => {
- "\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'],
},
},
}
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",
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',
- '+~' => '=+&', # 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̂",
- "\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',
},
},
}
],
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',
},
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',
},
},
}
{
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 '],
-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<' => "<> 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)",
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",
- "\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",
- "\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",
- "\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 => "[",
- "\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 => "]",
- "\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 => "ŵ",
- "\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",
- "\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 => {
- "\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 "
- )), # a lot like normal mode
+ )), # a lot like normal mode TODO
}, # mode v
- vg => {
+ 'vg' => {
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 => {
- "\e"=> "g8 modev",
-
- '(' => "=vab",
- ')' => "=vab",
- '`' => "=va'",
- "'" => 'g2 v7',
- '"' => "=va'",
- '<' => 'g2 v6',
- '>' => "=va<",
- '[' => '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', => "<> 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",
#
- # '^_' => "=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 => {
- "\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 => "ĝ",
- "\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
+
+ 's' => ['g4 arg xsurround', => "sur<>round\nsurround plugin"],
}, # 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",
- "\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
+ # y => { 'o' => ['g9 arg xunimpaired', "toggle option\nunimpaired plugin"] }, # TODO
+
# TODO: mode/ (command-line)
# XXX ex mode if you want to go completely wild
},
# 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'],
-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)',
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',
- "\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 => ';',
- "\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 => ']',
- "\e"=> 'g8 mode',
- 'f' => 'g2',
- ']' => 'g5',
+ "\e"=> ['g8 mode', "normal mode"],
+ 'f' => ['g2', "next frame<>set"],
+ ']' => ['g5', "open <q>next</q>"],
}, # 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',
- "\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',
- "\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 => {
- "\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
},
}
use utf8;
+use strict;
+use warnings;
+no warnings 'qw';
my @num = qw(^0 ^0 ^@ ^0 ^0 ^0 ^^ ^0 ^0 ^0 ^0);
dvorak => [[
--- /dev/null
+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 => ["\\","|"],
+}
[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',
['<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',
Html({
title => 'perl version cheat sheet',
- version => '1.5',
+ version => '1.7',
keywords => [qw'
perl version feature features comparison
sheet cheat overview summary
$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}) {
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."
$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 (/\w+) (?= (?:/\w+)* \1$) }{ showlink($2, "/source$2.plp") }xe
+ $line =~ s{ ^(")\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
'^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>.',
),
'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 => {
use warnings;
use utf8;
use re '/msx';
+use open IO => ':encoding(utf-8)', ':std';
+use charnames ();
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 $!;
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) {
elsif (defined $symname->{$chr}) {
$chr = $symname->{$chr};
}
+ elsif ($chr eq 'NoSymbol') {
+ next;
+ }
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
}
}
-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__
use 5.014;
use warnings;
-our $VERSION = '1.03';
+our $VERSION = '1.04';
use File::stat;
use Time::Piece;
)],
[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/ipa
+ keyboard/altgr/ipa keyboard/altgr/boyeg keyboard/altgr/drix
+ keyboard/altgr/symbolics keyboard/altgr/msx-graph
)],
[qw( chars/table/html sample source plan )],
);
--- /dev/null
+#!/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.
+
shades => [qw{. ░ . ▒ . ▓ }],
fill4 => [qw{. ▘ ▀ ▝ . ▌ █ ▐ . ▖ ▄ ▗ }],
fill4i => [qw{. ▛ ▚ ▟ . ▙ ▞ ▜ }],
- fill8 => [qw{. ▁ ▂ ▃ ▄ ▅ ▆ ▇ ▔ . ▏ ▎ ▍ ▌ ▋ ▊ ▉ ▕ }],
+ fill8 => [qw{. ▁ ▂ ▃ ▄ ▅ ▆ ▇ . ▏ ▎ ▍ ▌ ▋ ▊ ▉ }],
+ fill8r => [qw{. ▔ 🮂 🮃 ▀ 🮄 🮅 🮆 . ▕ 🮇 🮈 ▐ 🮉 🮊 🮋 }],
colour => [qw{. 🟫 🟥 🟧 🟨 🟩 🟦 🟪}],
},