vim keyboard page (initial commit)
authorMischa POSLAWSKY <perl@shiar.org>
Sat, 24 Feb 2007 23:10:56 +0000 (00:10 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Sat, 24 Feb 2007 23:10:56 +0000 (00:10 +0100)
base.css [new file with mode: 0644]
circus.css [new file with mode: 0644]
dark.css [new file with mode: 0644]
index.plp [new file with mode: 0644]
mono.css [new file with mode: 0644]
vim-cheat.html [new file with mode: 0644]
vim-cheat.tar.gz [new file with mode: 0644]
vim-cmds.inc.pl [new file with mode: 0644]
vim-keys.inc.pl [new file with mode: 0644]

diff --git a/base.css b/base.css
new file mode 100644 (file)
index 0000000..40d0cb1
--- /dev/null
+++ b/base.css
@@ -0,0 +1,209 @@
+body {
+       background: #FFF;
+       color: #000;
+       font-size: 90%;
+}
+a, a:visited {
+       color: #000;
+       text-decoration: underline;
+}
+a:active, a:hover {
+       color: #00F;
+       text-decoration: none;
+}
+h1, h2 {
+       text-align: center;
+       font-size: 200%;
+       margin: 0;
+}
+h2 {
+       font-size: 125%;
+       margin-bottom: -4ex;
+}
+
+/* "keyboard" (list of keys) */
+
+ul {
+       margin: 0;
+       padding: 0;
+       list-style: none;
+}
+li.row1 {margin-left: 7em} /* row offsets relative to ~6em key width */
+li.row2 {margin-left: 8em}
+li.row3 {margin-left: 10em} /* should actually align to next key on row0 */
+       /* ...however rows>=1 are shifted a bit, to make space */
+
+li.row {
+       clear: both; /* start new row block (keyboard row) */
+       padding-top: 1ex;
+}
+li.row > ul > li {
+       clear: both; /* start new row (screen row) */
+} /* css2 selectors ignored by msie<=6 */
+li.row ul ul {
+       clear: both;
+} /* css1 alternative as well (doesn't match in gecko for some reason) */
+
+h3      {display: none} /* semantic details (non-css/js) */
+li.mode {display: none} /* initially hidden (only show interactively (js)) */
+
+/* individual keys */
+
+dl.legend dt,
+ul.keys li {
+       float: left;
+       width: 6.2em;
+       line-height: 2.25ex; /* a little terser (seems to be gecko's default anyway) */
+       height: 4.5ex; /* 2 lines */
+       overflow: hidden;
+       margin: 0 2px -1px;
+       text-align: center;
+       border: 1px solid #000;
+       border-radius: 4px;
+       -moz-border-radius: 4px;
+}
+ul.keys li b {
+       float: left;
+       font-size: 200%;
+       line-height: 2.5ex; /* inherits otherwise */
+       padding-left: 2px;
+}
+ul.keys.omni li {
+       width: 8.5em;
+}
+
+/* fine tuning of special occurrences */
+
+ul.keys li b[title] { /* mnemonic hover */
+       cursor: help;
+}
+ul.keys li[onclick]:hover { /* link */
+       cursor: pointer;
+}
+ul.keys.ctrl li b,
+ul.keys.lead li b { /* char with ctrl or leading key */
+       font-size: 100%; /* space is too limited for 2+ double-sized chars */
+       line-height: 5ex; /* keep double height though */
+}
+ul.keys.ctrl li b small { /* meta key indicator */
+       font-size: 70%;
+       font-weight: normal; /* nice and subtle */
+}
+
+/* key type colorization */
+
+.pm {background: #BFB}   /* motion */
+.po {background: #DFA}   /* window */
+.co {background: #FFA}   /* command */
+.ci {background: #BFE}   /* info */
+.mi {background: #FCA}   /* insert mode */
+.mo {background: #FCC}   /* mode */
+.mv {background: #ECE}   /* visual mode */
+.me {background: #CCF}   /* key mode */
+
+.mi[onclick]:hover {background: #F97}
+.mo[onclick]:hover {background: #F88}
+.me[onclick]:hover {background: #99F}
+.mv[onclick]:hover {background: #D9D}
+
+.no {
+       background: #EEE;
+}
+ul.keys li.ni {
+       border: 0;
+       padding: 1px; /* same size as borderlessless keys */
+}
+
+dl.legend dt.vim,
+ul.keys li.vim {
+       border-style: dashed;
+       -moz-border-radius: 0; /* incompatible with border-style */
+}
+dl.legend dt.vim7,
+ul.keys li.vim7 {
+       border-style: dotted;
+       -moz-border-radius: 0;
+}
+
+/* footer */
+
+hr {
+       clear: both;
+       visibility: hidden;
+       height: 2ex;
+       margin: 0;
+}
+
+p.footer {
+       margin: 0;
+       text-align: center;
+}
+
+/* l/r help columns */
+
+.help {
+       display: table;
+       width: 100%;
+}
+.help > * {
+       display: table-cell;
+       width: 20%;
+}
+
+.left dl.legend {
+       margin-left: 6.2em;
+}
+.left dl.legend dt {
+       margin-left: -6.2em; /* msie<=6 multiply this by two for some reason */
+       float: left;
+       clear: left;
+}
+.left dl.legend dd {
+       float: left; /* align next to dt (except msie<=7 does just the opposite) */
+}
+.right dl.legend {
+       margin-right: 6.2em;
+}
+.right dl.legend dt {
+       margin-right: -6.2em;
+       float: right;
+       clear: right;
+}
+.right dl.legend dd {
+       float: right;
+}
+.right {
+       text-align: right;
+}
+
+/* help/legend */
+
+dl.legend dt {
+       margin: 0 0 1px; /* distinct keys */
+       height: auto; /* not key-height */
+       padding: 2px 0;
+}
+dl.legend dd {
+       margin: 3px 0.4em 0; /* align text (add dt border+padding height) */
+}
+
+dl.legend-options dt {
+       background: #CCC;
+}
+
+ul.legend-set {
+       clear: right;
+       padding-top: 1ex;
+}
+ul.legend-set li {
+       margin: 6px 0; /* similar to dl legends */
+}
+
+/* printing hints */
+
+@page {size: landscape}
+
+@media print {
+       ul.legend-set {display: none}
+}
+
diff --git a/circus.css b/circus.css
new file mode 100644 (file)
index 0000000..84acc95
--- /dev/null
@@ -0,0 +1,14 @@
+.pm {background: #8F8} /* motion */
+.po {background: #CF8} /* window */
+.co {background: #FF8} /* command */
+.ci {background: #8FD} /* info */
+.mi {background: #FB8} /* insert mode */
+.mo {background: #F77} /* mode */
+.mv {background: #E8E} /* visual mode */
+.me {background: #99F} /* key mode */
+
+/* hovers todo */
+.mo[onclick]:hover {
+       background: #FCC;
+}
+
diff --git a/dark.css b/dark.css
new file mode 100644 (file)
index 0000000..6f1feb4
--- /dev/null
+++ b/dark.css
@@ -0,0 +1,30 @@
+body {
+       background: #000;
+       color: #CCC;
+}
+a, a:visited {
+       color: #BBB;
+}
+
+dl.legend dt,
+ul.keys li {
+       border-color: #888;
+}
+dl.legend-options dt {background: #333}
+
+.pm {background: #040} /* motion */
+.po {background: #340} /* window */
+.ci {background: #044} /* info */
+.co {background: #440} /* command */
+.mi {background: #530} /* ins */
+.mo {background: #500} /* state */
+.mv {background: #503} /* visual */
+.me {background: #205} /* mode */
+
+.mi[onclick]:hover,
+.mo[onclick]:hover,
+.mv[onclick]:hover,
+.me[onclick]:hover {
+       color: #000; /* on default (light) background hover */
+} /* mode link */
+
diff --git a/index.plp b/index.plp
new file mode 100644 (file)
index 0000000..096a35f
--- /dev/null
+++ b/index.plp
@@ -0,0 +1,261 @@
+<:
+use utf8;
+use strict;
+use warnings;
+no  warnings "qw";  # you know what you doing
+no  warnings "uninitialized";  # save some useless checks for more legible code
+
+# 2006-03-29 ~20:00 started work
+# 2006-03-30  11:58 html version
+# 2006-05-20  03:44 perl version
+# 2007-02-07  07:34 cleaned up
+
+# TODO:
+# - use js to detect optimal key size
+# - style for .undo (maybe just some css3-only shadow)
+# - fix mode switching in konq (used to work)
+#   only when <wbr>s present?! use browser sniffing to force ?ascii=0 :(
+# - safari loading bug?
+# - good case for gzip compression
+# - link to source tarball
+# - default stylesheet selectable
+# - catch and execute pressed keys
+# - ghosting option documented and default
+# - option to follow aliases (default on?)
+# - custom row combinations (eg for comparing different modes)
+
+our $ascii = 0;
+if (exists $get{ascii}) {
+       $ascii = $get{ascii} ne "0";  # manual override
+} elsif (defined $ENV{HTTP_ACCEPT_CHARSET}) {
+       $ascii = 1;
+       for (split ",", $ENV{HTTP_ACCEPT_CHARSET}) {
+               $ascii = 0, last if $_ eq "*" or m/utf-?8/i;
+       }
+}
+
+my $charset = $ascii ? "us-ascii" : "utf-8";
+my $ctype = "text/html; charset=$charset";
+$header{content_type} = $ctype;
+
+:><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+
+<head>
+<title>vi cheat sheet</title>
+<meta http-equiv="content-type" content="<:= $ctype :>">
+<link rel="stylesheet" type="text/css" media="all" href="base.css">
+<!--[if lte IE 6]><style> .help dl.legend dt {margin:0 0 1px} </style><![endif]-->
+<!--[if lte IE 7]><style> .help dl.legend dd {float:none} </style><![endif]--><:
+       my %styles = map {$_ => $_} qw(dark circus mono);
+       our $style = exists $get{style} && $styles{$get{style}} || "light";
+       printf(qq{\n<link rel="%s" type="text/css" media="all" href="%s" title="%s">},
+               $_ eq $style ? "stylesheet" : "alternate stylesheet", "$_.css", $_
+       ) for keys %styles;
+
+       our $showkeys = exists $get{keys} && $get{keys} ne "0";
+       print "\n<style> .no {visibility:hidden} </style>" unless $showkeys;
+       print "\n<style> .no, .alias {opacity:.5} </style>"
+               if $showkeys and $get{keys} eq "ghost";
+:>
+
+<script><!--
+function setmode(classname) {
+       // set style for each #rows>li>ul>li to display:none unless it matches classname
+       var showclass = classname ? ' '+classname+'(?!\\w)' : '^$';
+       var parentskip = /^keys/;
+       var row = document.getElementById('rows').firstChild;
+       do {
+               if (row.tagName == 'LI' && row.firstChild.tagName == 'UL'
+               && !row.firstChild.className.match(parentskip)) {
+                       var el = row.firstChild.firstChild;
+                       if (el) do {
+                               if (el.tagName == 'LI') {
+                                       el.style.display = el.className.match(showclass) ? 'block' : 'none';
+                               }
+                       } while (el = el.nextSibling);
+               }
+       } while (row = row.nextSibling);
+
+       // update H2 to reflect the first part of a currently active (but hidden) H3
+       var h3s = document.getElementsByTagName('H3');
+       for (var i = 0; i < h3s.length; i++) {
+               if (h3s[i].parentNode.style.display != 'block') continue;
+               document.getElementsByTagName('H2')[0].innerHTML = h3s[i].firstChild.data;
+       }
+} // setmode
+//--></script>
+
+<body>
+
+<h1>vi/vim cheat sheet</h1>
+
+<h2>normal mode (default)</h2>
+
+<ul id="rows">
+
+<li class="row">
+       <ul class="keys omni">
+       <li class="mo" onclick="setmode()"><b>Esc</b> normal mode
+               <!-- not as static anymore, but never bothered; just see ^[ -->
+       </ul>
+</li>
+
+<:
+our %sign = (
+       arg    => $ascii ? "." : "·",  # described as 'dot'
+       motion => $ascii ? "|" : "↕",
+       alias  => $ascii ? "see: " : "»",
+       up     => $ascii ? "up"    : "▲",
+       right  => $ascii ? "right" : "▶",
+       down   => $ascii ? "down"  : "▼",
+       left   => $ascii ? "left"  : "◀",
+       sep    => $ascii ? "*"     : "•",
+       _      => exists $get{ascii} && !$ascii ? "\x{200b}" : "<wbr>",
+               # use the correct ZWNJ only when unicode is forced on
+               # default to use unofficial html for best support
+);
+
+my %keys = do "vim-cmds.inc.pl";
+
+my @casedesc = qw(ctrl shift);
+my @rowdesc = qw(numeric top home bottom);
+my %keyrows = do "vim-keys.inc.pl";
+
+sub keyunalias {
+       my ($key, %tree) = @_;
+       $key =~ s/(\S*?)(\^?\S)($|\s.*)/$2/;
+       my $mode = $1;
+       return [] unless defined $keys{$mode}{$key};
+       return $keys{$mode}{$key} if ref $keys{$mode}{$key};
+       return if $tree{$key}++;  # endless loop failsafe
+       return keyunalias($keys{$mode}{$key}, %tree);
+}
+
+sub escapeclass {
+       local $_ = shift;
+       s/\^/_c/g;
+       s/\[/_sbo/g;
+       s/\]/_sbc/g;
+       s/^$/_/;
+       return $_;
+}
+
+our $map = defined $keyrows{$get{map}} ? $get{map} : "qwerty";
+my $keyrows = $keyrows{$map};
+
+for (my $row = 0; $row <= $#$keyrows; $row++) {
+       my $keyrow = $keyrows->[$row];
+       print qq{<li class="row row$row"><ul>\n};
+       while (my ($mode, $modekeys) = each %keys) {
+               for (my $case = 0; $case <= $#$keyrow; $case++) {
+                       my $keycase = $keyrow->[$case];
+                         @$keycase or next;
+
+                       printf(qq{\t<li%s><h3>%s</h3>\n}, # XXX insert &nbsp; here to fix msie<=6
+                               $mode eq '' ? '' : sprintf(
+                                       ' class="%s"', "mode mode" . escapeclass($mode)
+                               ),
+                               sprintf('%s<small>: %s</small>',
+                                       $modekeys->{desc} || "mode $mode",
+                                       "$rowdesc[$row] row $casedesc[$case]"
+                               )
+                       );
+                       my $modeclass = "keys";
+                          $modeclass .= " lead" if defined $modekeys->{lead};  # leading command key shown
+                          $modeclass .= " $casedesc[$case]" if defined $casedesc[$case];
+                       print qq{\t\t<ul class="$modeclass">\n};
+
+                       for my $key (@$keycase) {
+                               my $keyinfo = $modekeys->{$key};
+                               $keyinfo = [ $sign{alias}.$keyinfo, keyunalias($keyinfo)->[1] . " alias" ]
+                                       if defined $keyinfo and not ref $keyinfo;  # alias
+                               my ($desc, $flags, $mnem) = @$keyinfo if defined $keyinfo;
+                               defined $desc or $flags = $key eq '^0' ? "ni" : "no";
+
+                               my $keytxt = $modekeys->{lead} . Entity($key) if $key ne '^0';
+                                  $keytxt .= $sign{arg} while $flags =~ s/ ?\barg\b//;  # argument
+                                  $keytxt .= "<small>$sign{motion}</small>" if $flags =~ s/ ?\bargm\b//;  # motion argument
+                                  $keytxt =~ s{\^(?=.)}{<small>^</small>};  # element around ctrl-identifier
+                               my $onclick = $flags =~ s/ ?\bmode(\S*)// && defined $keys{$1} && sprintf(
+                                       ' onclick="setmode(%s)"',
+                                       $1 eq '' ? '' : sprintf("'mode%s'", escapeclass($1))
+                               );
+                               my $keyhint = defined($mnem) && qq{ title="$mnem"};
+
+                               print qq{\t\t<li class="$flags"$onclick><b$keyhint>$keytxt</b>};
+                               print ' ', $desc if defined $desc;
+                               print "\n";
+                       } # key
+
+                       print qq{\t\t</ul>\n};
+               } # case
+
+       } # mode
+       print qq{\t</ul>\n};
+} # row
+
+:>
+</ul>
+
+<hr>
+
+<div class="help">
+       <div class="left">
+               <dl class="legend legend-types">
+               <dt class="ci">info
+                       <dd>Info command: shows/does something without altering anything.
+               <dt class="pm">motion
+                       <dd>Moves the cursor, or defines the range for an operator (<:= $sign{motion} :>).
+               <dt class="po">positioning
+                       <dd>Other movement (jumps, window (re)positioning).
+               <dt class="co">command
+                       <dd>Direct action command.
+               <dt class="mi">ins mode
+                       <dd>Enters Insert or Replace mode.
+               <dt class="mo">mode
+                       <dd>Enters a different mode.
+               <dt class="mv">vis mode
+                       <dd>Enters Visual or Select mode.
+               <dt class="me">key cmd
+                       <dd>Additional key commands (click for overview).
+               </dl>
+       </div>
+
+       <div class="right">
+               <dl class="legend legend-options">
+               <dt>key<:= $sign{arg} :>
+                       <dd>Commands with a dot need a char argument afterwards.
+               <dt>key<:= $sign{motion} :>
+                       <dd>Requires a motion afterwards, operates between cursor and destination.
+               <dt class="vim">vim
+                       <dd>Not in original Vi (assessment incomplete).
+               <dt class="vim7">vim7
+                       <dd>New in vim version 7.x.
+               </dl>
+
+               <ul class="legend legend-set">
+               <li>keyboard <strong>map</strong> is
+                       <:= $get{map} ? "set to " : "" :><em><:= $map :></em>
+               <li><strong>ascii</strong> mode is
+                       <:= exists $get{ascii} ? "forced " : "" :><em><:=
+                               $ascii ? "on" : "off" :></em>
+               <li><strong>keys</strong> are
+                       <em><:= $showkeys ? "always shown" : "hidden if unassigned" :></em><:=
+                               exists $get{keys} ? "" : " by default" :>
+               <li>default <strong>style</strong> is
+                       <:= defined $get{style} ? "set to " : "" :><em><:= $style :></em>
+               </ul>
+       </div>
+</div>
+
+<p class="footer">
+       <a href="vim-cheat.tar.gz">http://<:= $ENV{SERVER_NAME} :>/vim-cheat</a>
+       created by Shiar <:= $sign{sep} :> last update <:
+               use Time::Format qw(time_format);
+               print time_format("yyyy-mm-dd", (stat "vim-cmds.inc.pl")[9]);
+       :>
+</p>
+
+</html>
diff --git a/mono.css b/mono.css
new file mode 100644 (file)
index 0000000..5e6168b
--- /dev/null
+++ b/mono.css
@@ -0,0 +1,17 @@
+dl.legend-options dt {background: #EEE}
+
+.pm {background: #FFF}   /* motion */
+.po {background: #DDD}   /* window */
+.co {background: #AAA}   /* command */
+.ci {background: #777}   /* info */
+.mi {background: #888; color: #FFF}   /* insert mode */
+.mv {background: #444; color: #FFF}   /* visual mode */
+.mo {background: #000; color: #FFF}   /* mode */
+.me {background: #000; color: #AAA}   /* key mode */
+
+ul.keys li[onclick]:hover {
+       background: #888;
+       color: #000;
+       border-color: #444;
+}
+
diff --git a/vim-cheat.html b/vim-cheat.html
new file mode 100644 (file)
index 0000000..9b3330d
--- /dev/null
@@ -0,0 +1,706 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+
+<head>
+<meta http-equiv="content-type" content="text/html; charset=utf-8">
+<title>vi/vim cheat sheet</title>
+<style>
+body {
+       font-size: 90%;
+}
+h1 {
+       text-align: center;
+       margin-bottom: -2ex;
+}
+
+ul {
+       margin: 0;
+       padding: 0;
+}
+li {
+       list-style: none;
+}
+li.row {
+       clear: both;
+       padding-top: 1ex;
+}
+li.row2 {margin-left: 7em}
+li.row3 {margin-left: 8em}
+li.row4 {margin-left: 10em}
+
+ul.keys {
+       clear: both;
+}
+dl.legend dt,
+ul.keys li {
+       float: left;
+       width: 6.1em;
+       height: 4.5ex;
+       overflow: hidden;
+       margin: 0 2px -1px;
+       text-align: center;
+       border: 1px solid #000;
+       -moz-border-radius: 4px;
+}
+ul.keep.keys li {
+       width: 8.5em;
+}
+ul.keys li b {
+       float: left;
+       font-size: 200%;
+       padding-left: 2px;
+}
+ul.keys li b[title] {
+       cursor: help;
+}
+
+ul.keys.ctrl li b,
+ul.keys.lead li b {
+       font-size: 100%;
+       line-height: 5ex;
+}
+ul.keys.ctrl li b small {
+/* todo: small.ctrl */
+       font-size: 70%;
+       font-weight: normal;
+}
+ul.keys li b small small {
+       font-weight: normal;
+}
+ul.keys.lead {
+       display: none; /* initially hidden */
+}
+
+.mv {
+       background: #8F8;
+} /* motion */
+.co {
+       background: #FF8;
+} /* command */
+.op {
+       background: #FB8;
+} /* operator */
+.mo {
+       background: #BBF;
+} /* mode */
+.mo[onclick]:hover {
+       background: #88F;
+       cursor: pointer;
+}
+.mv[onclick]:hover {
+       background: #5F5;
+       cursor: pointer;
+}
+.ins b {
+       color: #F00;
+} /* insert mode */
+.no {
+       visibility: hidden;
+} /* not assigned */
+ul.keys li.vim {
+       border-color: #800;
+}
+ul.keys li.vim7 {
+       border-color: #F00;
+}
+
+div.help {
+       clear: both;
+       padding-top: 2ex;
+}
+dl.legend dt {
+       clear: left;
+       height: auto;
+}
+dl.legend dd {
+       float: left;
+       margin: 0;
+}
+</style>
+
+<script><!--
+function setmode(classname) {
+       var classmatch = classname ? 'keys '+classname : 'keys(?! lead)';
+       var uls = document.getElementById('rows').getElementsByTagName('ul');
+       for (var i = 0; i < uls.length; i++) {
+               var ulclass = uls[i].className;
+               if (!ulclass.match(/^keys/)) continue;
+               uls[i].style.display = ulclass.match(classmatch) ? 'block' : 'none';
+       }
+} // setmode
+//--></script>
+
+<body>
+
+<h1>vi/vim cheat sheet</h1>
+
+<ul id="rows">
+<li class="row">
+       <ul class="keep keys">
+               <li class="mo" onclick="setmode()"><b>Esc</b> normal mode
+       </ul>
+</li>
+
+<li class="row row1">
+       <ul class="keys leadz lead shift">
+               <li class="no"><b><small>z</small>~</b>
+               <li class="no"><b><small>z</small>!</b>
+               <li class="no"><b><small>z</small>@</b>
+               <li class="no"><b><small>z</small>#</b>
+               <li class="no"><b><small>z</small>$</b>
+               <li class="no"><b><small>z</small>%</b>
+               <li class="mv"><b><small>z</small>^</b> page above
+               <li class="no"><b><small>z</small>&</b>
+               <li class="no"><b><small>z</small>*</b>
+               <li class="no"><b><small>z</small>(</b>
+               <li class="no"><b><small>z</small>)</b>
+               <li class="no"><b><small>z</small>_</b>
+               <li class="mv"><b><small>z</small>+</b> page below
+       </ul>
+       <ul class="keys leadz lead">
+               <li class="no"><b><small>z</small>`</b>
+               <li class=""><b><small>z</small>1</b> 
+               <li class=""><b><small>z</small>2</b> 
+               <li class=""><b><small>z</small>3</b> 
+               <li class=""><b><small>z</small>4</b> 
+               <li class=""><b><small>z</small>5</b> 
+               <li class=""><b><small>z</small>6</b> 
+               <li class=""><b><small>z</small>7</b> 
+               <li class=""><b><small>z</small>8</b> 
+               <li class=""><b><small>z</small>9</b> 
+               <li class=""><b><small>z</small>0</b> 
+               <li class="mv"><b><small>z</small>-</b> line at bottom
+               <li class="co vim7"><b><small>z</small>=</b> spelling suggest<wbr>ions
+       </ul>
+       <ul class="keys leadg lead shift">
+               <li class="op"><b><small>g</small>~</b> toggle case
+               <li class="no"><b><small>g</small>!</b>
+               <li class="co vim7"><b><small>g</small>@</b> operator<wbr>func
+               <li class="mv"><b><small>g</small>#</b> rev. find string
+               <li class="mv"><b><small>g</small>$</b> virt<wbr>ual eol
+               <li class="no"><b><small>g</small>%</b>
+               <li class="mv"><b><small>g</small>^</b> "soft" bol v<wbr>irt<wbr>ual
+               <li class="co"><b title="Global substitute"><small>g</small>&</b> repeat :s global<wbr>ly
+               <li class="mv"><b><small>g</small>*</b> find string
+               <li class="no"><b><small>g</small>(</b>
+               <li class="no"><b><small>g</small>)</b>
+               <li class="mv"><b><small>g</small>_</b> "soft" eol
+               <li class="co vim7"><b><small>g</small>+</b> forward undo branch
+       </ul>
+       <ul class="keys leadg lead">
+               <li class="mv vim"><b><small>g</small>`·</b> to mark keepj<wbr>umps
+               <li class="no"><b><small>g</small>1</b>
+               <li class="no"><b><small>g</small>2</b>
+               <li class="no"><b><small>g</small>3</b>
+               <li class="no"><b><small>g</small>4</b>
+               <li class="no"><b><small>g</small>5</b>
+               <li class="no"><b><small>g</small>6</b>
+               <li class="no"><b><small>g</small>7</b>
+               <li class="co"><b><small>g</small>8</b> char hex val<wbr>ue<wbr>s
+               <li class="no"><b><small>g</small>9</b>
+               <li class="mv"><b><small>g</small>0</b> virtual bol
+               <li class="co vim7"><b><small>g</small>-</b> backward undo branch
+               <li class="no"><b><small>g</small>=</b>
+       </ul>
+       <ul class="keys shift">
+               <li class="co"><b>~</b> toggle case
+               <li class="op"><b>!</b> external filter
+               <li class="co"><b>@·</b> play macro
+               <li class="mv"><b>#</b> rev. find word
+               <li class="mv"><b>$</b> eol
+               <li class="mv"><b>%</b> goto match
+               <li class="mv"><b>^</b> "soft" bol
+               <li class="co"><b>&</b> repeat :s
+               <li class="mv"><b>*</b> find word
+               <li class="mv"><b>(</b> begin sentence
+               <li class="mv"><b>)</b> end sentence
+               <li class="mv"><b>_</b> "soft" bol down
+               <li class="mv"><b>+</b> next line
+       </ul>
+       <ul class="keys">
+               <li class="mv"><b>`·</b> goto mark
+               <li class=""><b>1</b>
+               <li class=""><b>2</b>
+               <li class=""><b>3</b>
+               <li class=""><b>4</b>
+               <li class=""><b>5</b>
+               <li class=""><b>6</b>
+               <li class=""><b>7</b>
+               <li class=""><b>8</b>
+               <li class=""><b>9</b>
+               <li class="mv"><b>0</b> "hard" bol
+               <li class="mv"><b>-</b> prev line
+               <li class="op"><b>=</b> auto format
+       </ul>
+
+<li class="row row2">
+       <ul class="keys leadcw lead shift">
+               <li class=""><b><small><small>c-</small>w</small>Q</b> 
+               <li class=""><b><small><small>c-</small>w</small>W</b> 
+               <li class=""><b><small><small>c-</small>w</small>E</b> 
+               <li class=""><b><small><small>c-</small>w</small>R</b> 
+               <li class=""><b><small><small>c-</small>w</small>T</b> 
+               <li class=""><b><small><small>c-</small>w</small>Y</b> 
+               <li class=""><b><small><small>c-</small>w</small>U</b> 
+               <li class=""><b><small><small>c-</small>w</small>I</b> 
+               <li class=""><b><small><small>c-</small>w</small>O</b> 
+               <li class=""><b><small><small>c-</small>w</small>P</b> 
+               <li class=""><b><small><small>c-</small>w</small>{</b> 
+               <li class=""><b><small><small>c-</small>w</small>}</b> 
+       </ul>
+       <ul class="keys leadcw lead">
+               <li class=""><b><small><small>c-</small>w</small>q</b> 
+               <li class=""><b><small><small>c-</small>w</small>w</b> 
+               <li class=""><b><small><small>c-</small>w</small>e</b> 
+               <li class=""><b><small><small>c-</small>w</small>r</b> 
+               <li class=""><b><small><small>c-</small>w</small>t</b> 
+               <li class=""><b><small><small>c-</small>w</small>y</b> 
+               <li class=""><b><small><small>c-</small>w</small>u</b> 
+               <li class=""><b><small><small>c-</small>w</small>i</b> 
+               <li class=""><b><small><small>c-</small>w</small>o</b> 
+               <li class=""><b><small><small>c-</small>w</small>p</b> 
+               <li class=""><b><small><small>c-</small>w</small>[</b> 
+               <li class=""><b><small><small>c-</small>w</small>]</b> 
+       </ul>
+       <ul class="keys leadZ lead shift">
+               <li class="co"><b><small>Z</small>Q</b> :q!
+               <li class="no"><b><small>Z</small>W</b>
+               <li class="no"><b><small>Z</small>E</b>
+               <li class="no"><b><small>Z</small>R</b>
+               <li class="no"><b><small>Z</small>T</b>
+               <li class="no"><b><small>Z</small>Y</b>
+               <li class="no"><b><small>Z</small>U</b>
+               <li class="no"><b><small>Z</small>I</b>
+               <li class="no"><b><small>Z</small>O</b>
+               <li class="no"><b><small>Z</small>P</b>
+               <li class="no"><b><small>Z</small>{</b>
+               <li class="no"><b><small>Z</small>}</b>
+       </ul>
+       <ul class="keys leadz lead shift">
+               <li class="no"><b><small>z</small>Q</b>
+               <li class="co vim7"><b><small>z</small>W</b> temp misspell<wbr>ing
+               <li class="co"><b><small>z</small>E</b> eliminate folds
+               <li class="co"><b><small>z</small>R</b> open all folds
+               <li class="no"><b><small>z</small>T</b>
+               <li class="no"><b><small>z</small>Y</b>
+               <li class="no"><b><small>z</small>U</b>
+               <li class="no"><b><small>z</small>I</b>
+               <li class="co"><b><small>z</small>O</b> open folds rec<wbr>urs<wbr>ive<wbr>ly
+               <li class="no"><b><small>z</small>P</b>
+               <li class="no"><b><small>z</small>{</b>
+               <li class="no"><b><small>z</small>}</b>
+       </ul>
+       <ul class="keys leadz lead">
+               <li class="no"><b><small>z</small>q</b>
+               <li class="co vim7"><b title="Wrong word"><small>z</small>w</b> add misspell<wbr>ing
+               <li class="mv"><b><small>z</small>e</b> cursor at right side
+               <li class="co"><b><small>z</small>r</b> reduce folding
+               <li class="mv"><b><small>z</small>t</b> line at top
+               <li class="no"><b><small>z</small>y</b>
+               <li class="no"><b><small>z</small>u</b>
+               <li class="co"><b><small>z</small>i</b> toggle all folds
+               <li class="co"><b><small>z</small>o</b> open fold
+               <li class="no"><b><small>z</small>p</b>
+               <li class="no"><b><small>z</small>[</b>
+               <li class="no"><b><small>z</small>]</b>
+       </ul>
+       <ul class="keys leadg lead ctrl">
+               <li class="no"><b><small>g<small>c-</small></small>q</b>
+               <li class="no"><b><small>g<small>c-</small></small>w</b>
+               <li class="no"><b><small>g<small>c-</small></small>e</b>
+               <li class="no"><b><small>g<small>c-</small></small>r</b>
+               <li class="no"><b><small>g<small>c-</small></small>t</b>
+               <li class="no"><b><small>g<small>c-</small></small>y</b>
+               <li class="no"><b><small>g<small>c-</small></small>u</b>
+               <li class="no"><b><small>g<small>c-</small></small>i</b>
+               <li class="no"><b><small>g<small>c-</small></small>o</b>
+               <li class="no"><b><small>g<small>c-</small></small>p</b>
+               <li class="no"><b><small>g<small>c-</small></small>[</b>
+               <li class="mv"><b><small>g<small>c-</small></small>]</b> go to tjump
+       </ul>
+       <ul class="keys leadg lead shift">
+               <li class="co"><b><small>g</small>Q</b> ex mode manual :
+               <li class="no"><b><small>g</small>W</b>
+               <li class="mv"><b><small>g</small>E</b> back to <span style="font-variant:small-caps">word</span> end
+               <li class="co ins"><b><small>g</small>R</b> replace mode v<wbr>ir<wbr>t<wbr>ual
+               <li class="no"><b><small>g</small>T</b>
+               <li class="no"><b><small>g</small>Y</b>
+               <li class="op"><b><small>g</small>U</b> upper<wbr>case
+               <li class="op ins"><b><small>g</small>I</b> insert at soft bol
+               <li class="no"><b><small>g</small>O</b>
+               <li class="co"><b><small>g</small>P</b> paste before no move
+               <li class="no"><b><small>g</small>{</b>
+               <li class="no"><b><small>g</small>}</b>
+       </ul>
+       <ul class="keys leadg lead">
+               <li class="op"><b><small>g</small>q</b> format
+               <li class="op"><b><small>g</small>w</b> format no move
+               <li class="mv"><b><small>g</small>e</b> back to word end
+               <li class="co"><b><small>g</small>r·</b> replace char vir.
+               <li class="no"><b><small>g</small>t</b>
+               <li class="no"><b><small>g</small>y</b>
+               <li class="op"><b><small>g</small>u</b> lower<wbr>case
+               <li class="op ins"><b><small>g</small>i</b> insert at last pos
+               <li class="mv"><b><small>g</small>o</b> :goto (byte)
+               <li class="co"><b><small>g</small>p</b> paste no move
+               <li class="no"><b><small>g</small>[</b>
+               <li class="mv"><b><small>g</small>]</b> go to tselect
+       </ul>
+       <ul class="keys ctrl">
+               <li class="co"><b><small>c-</small>q</b> [ctrl-v]
+               <li class="mo" onclick="setmode('leadcw')"><b><small>c-</small>w</b> window cmds
+               <li class="mv"><b title="Extra line"><small>c-</small>e</b> window down
+               <li class="co"><b><small>c-</small>r</b> redo
+               <li class="mv"><b><small>c-</small>t</b> previous tag
+               <li class="mv"><b><small>c-</small>y</b> window up
+               <li class="mv"><b><small>c-</small>u</b> scroll up
+               <li class="mv"><b><small>c-</small>i</b> jump to newer
+               <li class="mv"><b><small>c-</small>o</b> jump to older
+               <li class="mv"><b><small>c-</small>p</b> [k]
+               <li class="no"><b><small>c-</small>[</b>
+               <li class="mv"><b><small>c-</small>]</b> go to tag
+       </ul>
+       <ul class="keys shift">
+               <li class="co"><b>Q</b> ex mode
+               <li class="mv"><b>W</b> next <span style="font-variant:small-caps">word</span>
+               <li class="mv"><b>E</b> end <span style="font-variant:small-caps">word</span>
+               <li class="co ins"><b>R</b> replace mode
+               <li class="mv"><b>T</b> back 'til
+               <li class="co"><b>Y</b> yank line
+               <li class="co"><b>U</b> undo line
+               <li class="co ins"><b>I</b> insert at bol
+               <li class="co ins"><b>O</b> open above
+               <li class="co"><b>P</b> paste before
+               <li class="mv"><b>{</b> begin parag.
+               <li class="mv"><b>}</b> end parag.
+       </ul>
+       <ul class="keys">
+               <li class="co"><b>q·</b> record macro
+               <li class="mv"><b>w</b> next word
+               <li class="mv"><b>e</b> end word
+               <li class="co"><b>r·</b> replace char
+               <li class="mv"><b>t·</b> 'til
+               <li class="op"><b>y</b> yank
+               <li class="co"><b>u</b> undo
+               <li class="co ins"><b>i</b> insert mode
+               <li class="co ins"><b>o</b> open below
+               <li class="co"><b>p</b> paste after
+               <li class="mv" onclick="setmode('leadsbo')"><b>[·</b> move back<wbr>ward<wbr>s
+               <li class="mv" onclick="setmode('leadsbc')"><b>]·</b> move forw<wbr>ard
+       </ul>
+
+<li class="row row3">
+       <ul class="keys leadZ lead shift">
+               <li class="no"><b><small>Z</small>A</b>
+               <li class="no"><b><small>Z</small>S</b>
+               <li class="no"><b><small>Z</small>D</b>
+               <li class="no"><b><small>Z</small>F</b>
+               <li class="no"><b><small>Z</small>G</b>
+               <li class="no"><b><small>Z</small>H</b>
+               <li class="no"><b><small>Z</small>J</b>
+               <li class="no"><b><small>Z</small>K</b>
+               <li class="no"><b><small>Z</small>L</b>
+               <li class="no"><b><small>Z</small>:</b>
+               <li class="no"><b><small>Z</small>"</b>
+               <li class="no"><b><small>Z</small>|</b>
+       </ul>
+       <ul class="keys leadz lead shift">
+               <li class="co"><b><small>z</small>A</b> toggle fold rec<wbr>urs<wbr>ive<wbr>ly
+               <li class="no"><b><small>z</small>S</b>
+               <li class="co"><b><small>z</small>D</b> delete folds rec<wbr>urs<wbr>ive
+               <li class="co"><b><small>z</small>F</b> fold lines
+               <li class="co vim7"><b><small>z</small>G</b> ignore spell<wbr>ing
+               <li class="mv"><b><small>z</small>H</b> scroll ▶ half scr<wbr>een
+               <li class="no"><b><small>z</small>J</b>
+               <li class="no"><b><small>z</small>K</b>
+               <li class="mv"><b><small>z</small>L</b> scroll ◀ half scr<wbr>een
+               <li class="no"><b><small>z</small>:</b>
+               <li class="no"><b><small>z</small>"</b>
+               <li class="no"><b><small>z</small>|</b>
+       </ul>
+       <ul class="keys leadz lead">
+               <li class="co"><b><small>z</small>a</b> toggle fold
+               <li class="mv"><b><small>z</small>s</b> cursor at left side
+               <li class="co"><b><small>z</small>d</b> delete fold
+               <li class="op"><b><small>z</small>f</b> create fold
+               <li class="co vim7"><b title="Good word"><small>z</small>g</b> correct spell<wbr>ing
+               <li class="mv"><b><small>z</small>h</b> scroll ▶
+               <li class="mv"><b><small>z</small>j</b> next fold start
+               <li class="mv"><b><small>z</small>k</b> prev fold end
+               <li class="mv"><b><small>z</small>l</b> scroll ◀
+               <li class="no"><b><small>z</small>;</b>
+               <li class="no"><b><small>z</small>'</b>
+               <li class="no"><b><small>z</small>\</b>
+       </ul>
+       <ul class="keys leadcw lead shift">
+               <li class=""><b><small><small>c-</small>w</small>A</b> 
+               <li class=""><b><small><small>c-</small>w</small>S</b> 
+               <li class=""><b><small><small>c-</small>w</small>D</b> 
+               <li class=""><b><small><small>c-</small>w</small>F</b> 
+               <li class=""><b><small><small>c-</small>w</small>G</b> 
+               <li class=""><b><small><small>c-</small>w</small>H</b> 
+               <li class=""><b><small><small>c-</small>w</small>J</b> 
+               <li class=""><b><small><small>c-</small>w</small>K</b> 
+               <li class=""><b><small><small>c-</small>w</small>L</b> 
+               <li class=""><b><small><small>c-</small>w</small>:</b> 
+               <li class=""><b><small><small>c-</small>w</small>"</b> 
+               <li class=""><b><small><small>c-</small>w</small>|</b> 
+       </ul>
+       <ul class="keys leadcw lead">
+               <li class=""><b><small><small>c-</small>w</small>a</b> 
+               <li class=""><b><small><small>c-</small>w</small>s</b> 
+               <li class=""><b><small><small>c-</small>w</small>d</b> 
+               <li class=""><b><small><small>c-</small>w</small>f</b> 
+               <li class=""><b><small><small>c-</small>w</small>g</b> 
+               <li class=""><b><small><small>c-</small>w</small>h</b> 
+               <li class=""><b><small><small>c-</small>w</small>j</b> 
+               <li class=""><b><small><small>c-</small>w</small>k</b> 
+               <li class=""><b><small><small>c-</small>w</small>l</b> 
+               <li class=""><b><small><small>c-</small>w</small>;</b> 
+               <li class=""><b><small><small>c-</small>w</small>'</b> 
+               <li class=""><b><small><small>c-</small>w</small>\</b> 
+       </ul>
+       <ul class="keys leadg lead ctrl">
+               <li class="co"><b><small>g<small>c-</small></small>a</b> mem usage stats
+               <li class="no"><b><small>g<small>c-</small></small>s</b>
+               <li class="no"><b><small>g<small>c-</small></small>d</b>
+               <li class="no"><b><small>g<small>c-</small></small>f</b>
+               <li class="co"><b><small>g<small>c-</small></small>g</b> cursor pos info
+               <li class="co"><b title="Get Highlighted"><small>g<small>c-</small></small>h</b> select block
+               <li class="no"><b><small>g<small>c-</small></small>j</b>
+               <li class="no"><b><small>g<small>c-</small></small>k</b>
+               <li class="no"><b><small>g<small>c-</small></small>l</b>
+               <li class="no"><b><small>g<small>c-</small></small>;</b>
+               <li class="no"><b><small>g<small>c-</small></small>'</b>
+               <li class="no"><b><small>g<small>c-</small></small>\</b>
+       </ul>
+       <ul class="keys leadg lead shift">
+               <li class="no"><b><small>g</small>A</b>
+               <li class="no"><b><small>g</small>S</b>
+               <li class="mv"><b><small>g</small>D</b> global declar<wbr>ation
+               <li class="co vim7"><b><small>g</small>F</b> edit file + jump
+               <li class="no"><b><small>g</small>G</b>
+               <li class="co"><b title="Get Highlighted"><small>g</small>H</b> select lines
+               <li class="co"><b><small>g</small>J</b> join leave spac<wbr>ing
+               <li class="no"><b><small>g</small>K</b>
+               <li class="no"><b><small>g</small>L</b>
+               <li class="no"><b><small>g</small>:</b>
+               <li class="no"><b><small>g</small>"</b>
+               <li class="no"><b><small>g</small>|</b>
+       </ul>
+       <ul class="keys leadg lead">
+               <li class="co"><b title="Get Ascii value"><small>g</small>a</b> char value
+               <li class="co"><b title="Go to Sleep"><small>g</small>s</b> sleep
+               <li class="mv"><b><small>g</small>d</b> local declar<wbr>ation
+               <li class="co vim"><b title="Goto File"><small>g</small>f</b> edit file at cur<wbr>sor
+               <li class="mv"><b><small>g</small>g</b> first line
+               <li class="co"><b title="Get Highlighted"><small>g</small>h</b> select mode
+               <li class="mv"><b><small>g</small>j</b> display line down
+               <li class="mv"><b><small>g</small>k</b> display line up
+               <li class="no"><b><small>g</small>l</b>
+               <li class="mv"><b><small>g</small>;</b> to prev change pos
+               <li class="mv vim"><b><small>g</small>'·</b> to mark keepj<wbr>umps
+               <li class="no"><b><small>g</small>\</b>
+       </ul>
+       <ul class="keys ctrl">
+               <li class="co"><b><small>c-</small>a</b> incr<wbr>ement
+               <li class="co"><b><small>c-</small>s</b> (xoff)
+               <li class="mv"><b><small>c-</small>d</b> scroll down
+               <li class="mv"><b><small>c-</small>f</b> page down
+               <li class="co"><b><small>c-</small>g</b> :file (info)
+               <li class="mv"><b><small>c-</small>h</b> [h]
+               <li class="mv"><b><small>c-</small>j</b> [j]
+               <li class="no"><b><small>c-</small>k</b>
+               <li class="co"><b><small>c-</small>l</b> redraw
+               <li class="no"><b><small>c-</small>;</b>
+               <li class="no"><b><small>c-</small>'</b>
+               <li class="no"><b><small>c-</small>\</b>
+       </ul>
+       <ul class="keys shift">
+               <li class="co ins"><b>A</b> append to eol
+               <li class="co ins"><b>S</b> subst line
+               <li class="co"><b>D</b> delete to eol
+               <li class="mv"><b>F·</b> "back" fwd
+               <li class="mv"><b>G</b> eof/<wbr>goto ln
+               <li class="mv"><b>H</b> screen top
+               <li class="co"><b>J</b> join lines
+               <li class="co"><b>K</b> help
+               <li class="mv"><b>L</b> screen bottom
+               <li class="co"><b>:</b> ex cmd line
+               <li class=""><b>"·</b> use register
+               <li class="mv"><b>|</b> bol/<wbr>goto col
+       </ul>
+       <ul class="keys">
+               <li class="co ins"><b>a</b> append
+               <li class="co ins"><b>s</b> subst char
+               <li class="op"><b>d</b> delete
+               <li class="mv"><b>f·</b> fwd to char
+               <li class="mo" onclick="setmode('leadg')"><b>g·</b> extra cmds
+               <li class="mv"><b>h</b> ◀
+               <li class="mv"><b>j</b> ▼
+               <li class="mv"><b>k</b> ▲
+               <li class="mv"><b>l</b> ▶
+               <li class="mv"><b>;</b> repeat t/T/f/F
+               <li class="mv"><b>'·</b> goto mark bol
+               <li class="mo"><b>\·</b> not used
+       </ul>
+
+<li class="row row4">
+       <ul class="keys leadcw lead ctrl">
+               <li class=""><b><small><small>c-</small>wc-</small>z</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>x</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>c</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>v</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>b</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>n</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>m</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>,</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>.</b> 
+               <li class=""><b><small><small>c-</small>wc-</small>/</b> 
+       </ul>
+       <ul class="keys leadcw lead shift">
+               <li class=""><b><small><small>c-</small>w</small>Z</b> 
+               <li class=""><b><small><small>c-</small>w</small>X</b> 
+               <li class=""><b><small><small>c-</small>w</small>C</b> 
+               <li class=""><b><small><small>c-</small>w</small>V</b> 
+               <li class=""><b><small><small>c-</small>w</small>B</b> 
+               <li class=""><b><small><small>c-</small>w</small>N</b> 
+               <li class=""><b><small><small>c-</small>w</small>M</b> 
+               <li class=""><b><small><small>c-</small>w</small>&lt;</b> 
+               <li class=""><b><small><small>c-</small>w</small>&gt;</b> 
+               <li class=""><b><small><small>c-</small>w</small>?</b> 
+       </ul>
+       <ul class="keys leadcw lead">
+               <li class="co"><b><small><small>c-</small>w</small>z</b> close preview
+               <li class="co"><b><small><small>c-</small>w</small>x</b> exchange window
+               <li class="co"><b><small><small>c-</small>w</small>c</b> :close window
+               <li class="co"><b><small><small>c-</small>w</small>v</b> split vertical<wbr>ly
+               <li class="mv"><b><small><small>c-</small>w</small>b</b> bottom window
+               <li class="co"><b><small><small>c-</small>w</small>n</b> open new
+               <li class="no"><b><small><small>c-</small>w</small>m</b>
+               <li class="no"><b><small><small>c-</small>w</small>,</b>
+               <li class="no"><b><small><small>c-</small>w</small>.</b>
+               <li class="no"><b><small><small>c-</small>w</small>/</b>
+       </ul>
+       <ul class="keys leadZ lead shift">
+               <li class="co"><b><small>Z</small>Z</b> :wq
+               <li class="no"><b><small>Z</small>X</b>
+               <li class="no"><b><small>Z</small>C</b>
+               <li class="no"><b><small>Z</small>V</b>
+               <li class="no"><b><small>Z</small>B</b>
+               <li class="no"><b><small>Z</small>N</b>
+               <li class="no"><b><small>Z</small>M</b>
+               <li class="no"><b><small>Z</small>&lt;</b>
+               <li class="no"><b><small>Z</small>&gt;</b>
+               <li class="no"><b><small>Z</small>?</b>
+       </ul>
+       <ul class="keys leadz lead shift">
+               <li class="no"><b><small>z</small>Z</b>
+               <li class="co"><b><small>z</small>X</b> reapply folds
+               <li class="co"><b><small>z</small>C</b> close folds rec<wbr>curs<wbr>ive<wbr>ly
+               <li class="no"><b><small>z</small>V</b>
+               <li class="no"><b><small>z</small>B</b>
+               <li class="co"><b><small>z</small>N</b> fold normal
+               <li class="co"><b><small>z</small>M</b> close all folds
+               <li class="no"><b><small>z</small>&lt;</b>
+               <li class="no"><b><small>z</small>&gt;</b>
+               <li class="no"><b><small>z</small>?</b>
+       </ul>
+       <ul class="keys leadz lead">
+               <li class="mv"><b><small>z</small>z</b> line at center
+               <li class="co"><b><small>z</small>x</b> update folds
+               <li class="co"><b><small>z</small>c</b> close fold
+               <li class="co"><b><small>z</small>v</b> unfold cursor line
+               <li class="mv"><b><small>z</small>b</b> line at bot. bol
+               <li class="co"><b><small>z</small>n</b> fold none
+               <li class="co"><b><small>z</small>m</b> fold more
+               <li class="no"><b><small>z</small>,</b>
+               <li class="mv"><b><small>z</small>.</b> line at center bol
+               <li class="no"><b><small>z</small>/</b>
+       </ul>
+       <ul class="keys leadg lead ctrl">
+               <li class="no"><b><small>g<small>c-</small></small>z</b>
+               <li class="no"><b><small>g<small>c-</small></small>x</b>
+               <li class="no"><b><small>g<small>c-</small></small>c</b>
+               <li class="no"><b><small>g<small>c-</small></small>v</b>
+               <li class="no"><b><small>g<small>c-</small></small>b</b>
+               <li class="no"><b><small>g<small>c-</small></small>n</b>
+               <li class="no"><b><small>g<small>c-</small></small>m</b>
+               <li class="no"><b><small>g<small>c-</small></small>,</b>
+               <li class="no"><b><small>g<small>c-</small></small>.</b>
+               <li class="no"><b><small>g<small>c-</small></small>/</b>
+       </ul>
+       <ul class="keys leadg lead shift">
+               <li class="no"><b><small>g</small>Z</b>
+               <li class="no"><b><small>g</small>X</b>
+               <li class="no"><b><small>g</small>C</b>
+               <li class="co"><b><small>g</small>V</b> avoid reselect<wbr>ion
+               <li class="no"><b><small>g</small>B</b>
+               <li class="no"><b><small>g</small>N</b>
+               <li class="no"><b><small>g</small>M</b>
+               <li class="co vim7"><b><small>g</small>&lt;</b> see prev cmd output
+               <li class="no"><b><small>g</small>&gt;</b>
+               <li class="op"><b><small>g</small>?</b> rot13 encode
+       </ul>
+       <ul class="keys leadg lead">
+               <li class="no"><b><small>g</small>z</b>
+               <li class="no"><b><small>g</small>x</b>
+               <li class="no"><b><small>g</small>c</b>
+               <li class="co"><b><small>g</small>v</b> previous visual mode
+               <li class="no"><b><small>g</small>b</b>
+               <li class="no"><b><small>g</small>n</b>
+               <li class="mv"><b><small>g</small>m</b> g0 right half scr<wbr>een
+               <li class="mv"><b><small>g</small>,</b> to next change pos
+               <li class="no"><b><small>g</small>.</b>
+               <li class="no"><b><small>g</small>/</b>
+       </ul>
+       <ul class="keys ctrl">
+               <li class="co"><b><small>c-</small>z</b> :sus<wbr>pend
+               <li class="co"><b><small>c-</small>x</b> subs<wbr>tract
+               <li class="co"><b><small>c-</small>c</b> abort
+               <li class="co"><b><small>c-</small>v</b> visual block
+               <li class="mv"><b><small>c-</small>b</b> page up
+               <li class="mv"><b><small>c-</small>n</b> [j]
+               <li class="co"><b><small>c-</small>m</b> [+]
+               <li class="no"><b><small>c-</small>,</b>
+               <li class="no"><b><small>c-</small>.</b>
+               <li class="no"><b><small>c-</small>/</b>
+       </ul>
+       <ul class="keys shift">
+               <li class="mo" onclick="setmode('leadZ')"><b>Z·</b> quit
+               <li class="co"><b>X</b> back­<wbr>space
+               <li class="co ins"><b>C</b> change to eol
+               <li class="co"><b>V</b> visual lines
+               <li class="mv"><b>B</b> prev <span style="font-variant:small-caps">word</span>
+               <li class="mv"><b>N</b> prev find
+               <li class="mv"><b>M</b> screen mid'l
+               <li class="op"><b>&lt;</b> un­<wbr>indent
+               <li class="op"><b>&gt;</b> ident
+               <li class="mv"><b>?·</b> find rev.
+       </ul>
+       <ul class="keys">
+               <li class="mo" onclick="setmode('leadz')"><b>z·</b> extra cmds
+               <li class="co"><b>x</b> delete char
+               <li class="op ins"><b>c</b> change
+               <li class="co"><b>v</b> visual mode
+               <li class="mv"><b>b</b> prev word
+               <li class="mv"><b>n</b> next find
+               <li class="co"><b>m·</b> set mark
+               <li class="mv"><b>,</b> reverse t/T/f/F
+               <li class="co"><b>.</b> repeat cmd
+               <li class="mv"><b>/·</b> find
+       </ul>
+
+</ul>
+
+<div class="help">
+       <dl class="legend">
+       <dt class="mv">motion   <dd>Moves the cursor, or defines the range for an operator.
+       <dt class="co">command  <dd>Direct action command, if <span class="ins"><b>red</b></span>, it enters insert mode.
+       <dt class="op">operator <dd>Requires a motion afterwards, operates between cursor and destination.
+       <dt class="mo">mode
+       <dt>q· <dd>Commands with a dot need a char argument afterwards.
+       </dl>
+</div>
+
+</html>
diff --git a/vim-cheat.tar.gz b/vim-cheat.tar.gz
new file mode 100644 (file)
index 0000000..0e6e7b4
Binary files /dev/null and b/vim-cheat.tar.gz differ
diff --git a/vim-cmds.inc.pl b/vim-cmds.inc.pl
new file mode 100644 (file)
index 0000000..bc05a94
--- /dev/null
@@ -0,0 +1,523 @@
+use utf8;
+
+'' => {
+       desc => "normal mode",
+
+       '~' => ["toggle case", "co undo"],
+       '!' => ["extern$sign{_}al filter", "co argm undo modec"],
+       '@' => ["play macro", "co arg undo"],
+       '#' => ["rev. find word", "pm vim"],
+       '$' => ["eol", "pm"],
+       '%' => ["goto match", "pm"],
+       '^' => ['"soft" bol', "pm"],
+       '&' => ["repeat :s", "co undo"],
+       '*' => ["find word", "pm vim"],
+       '(' => ["begin sentence", "pm"],
+       ')' => ["end sentence", "pm"],
+       '_' => ['"soft" bol down', "pm"],
+       '+' => ["next line", "pm"],
+       '`' => ["goto mark", "pm arg"],
+       '0' => ['"hard" bol', "pm"],
+       '^^'=> ["edit alt. file", "co"],
+       '-' => ["prev line", "pm"],
+       '=' => ["auto form$sign{_}at", "co argm undo"],
+       '?' => ["find rev.", "pm arg modec"],
+       ';' => ["repeat t/T/f/F", "pm"],
+       ':' => ["ex cmd line", "co modec"],
+       "'" => ["goto mark bol", "pm arg"],
+       '"' => ["use register", "co arg"],
+       '\\' => ["not used", "me arg"],
+       '^\\' => ["to mode/$sign{_}ext$sign{_}ens$sign{_}ion$sign{_}s", "mo arg"],
+       ',' => ["reverse t/T/f/F", "pm"],
+       '<' => ["un­$sign{_}indent", "co argm undo"],
+       '.' => ["repeat cmd", "co undo"],
+       '>' => ["ident", "co argm undo"],
+       '/' => ["find", "pm arg modec"],
+       '[' => ["move back$sign{_}ward$sign{_}s", "me arg mode["],
+       '{' => ["begin parag.", "pm"],
+       ']' => ["move forw$sign{_}ard", "me arg mode]"],
+       '}' => ["end parag.", "pm"],
+       '^]'=> ["go to tag", "po"],
+       '|' => ["bol/$sign{_}goto col", "pm"],
+
+       'a' => ["append", "mi undo modei"],
+       'A' => ["append to eol", "mi undo modei"],
+       '^a'=> ["incr$sign{_}ement", "co undo", "Add one"],
+       'b' => ["prev word", "pm", "Back"],
+       'B' => ['prev <span style="font-variant:small-caps">word</span>', "pm"],
+       '^b'=> ["page up", "pm"],
+       'c' => ["change", "mi argm undo modei"],
+       'C' => ["change to eol", "mi undo modei"],
+       '^c'=> ["abort", "co"],
+       'd' => ["delete", "co argm undo"],
+       'D' => ["delete to eol", "co undo"],
+       '^d'=> ["scroll down", "po"],
+       'e' => ["end word", "pm"],
+       'E' => ['end <span style="font-variant:small-caps">word</span>', "pm"],
+       '^e'=> ["window down", "po", "Extra line"],
+       'f' => ["fwd to char", "pm arg"],
+       'F' => ['backwd to char', "pm arg"],
+       '^f'=> ["page down", "pm", "page Forward"],
+       'g' => ["extra cmds", "me arg modeg"],
+       'G' => ["eof/$sign{_}goto ln", "pm"],
+       '^g'=> [":file (info)", "ci"],
+       'h' => [$sign{left}, "pm"],
+       'H' => ["screen top", "pm"],
+       '^h'=> "h",
+       'i' => ["insert mode", "mi undo modei"],
+       'I' => ["insert at bol", "mi undo modei"],
+       '^i'=> ["jump to newer", "pm"],
+       'j' => [$sign{down}, "pm"],
+       'J' => ["join lines", "co undo"],
+       '^j'=> "j",
+       'k' => [$sign{up}, "pm"],
+       'K' => ["help", "co", "looKup Keyword"],
+       'l' => [$sign{right}, "pm"],
+       'L' => ["screen bottom", "pm", "Lowermost Line"],
+       '^l'=> ["redraw", "ci"],
+       'm' => ["set mark", "co arg"],
+       'M' => ["screen mid'l", "pm"],
+       '^m'=> "+",
+       'n' => ["next find", "pm"],
+       'N' => ["prev find", "pm"],
+       '^n'=> "j",
+       'o' => ["open below", "mi undo modei"],
+       'O' => ["open above", "mi undo modei"],
+       '^o'=> ["jump to older", "pm"],
+       'p' => ["paste after", "co undo"],
+       'P' => ["paste before", "co undo"],
+       '^p'=> "k",
+       'q' => ["record macro", "mo arg", "Queue seQuence"],
+       'Q' => ["ex mode", "mo"],
+       '^q'=> ["(xon)", "ci"], # or ^v
+       'r' => ["replace char", "co arg undo"],
+       'R' => ["replace mode", "mi undo modei"],
+       '^r'=> ["redo", "co undo"],
+       's' => ["subst char", "mi undo modei"],
+       'S' => ["subst line", "mi undo modei"],
+       '^s'=> ["(xoff)", "ci"],
+       't' => ["till char", "pm arg"],
+       'T' => ["back till char", "pm"],
+       '^t'=> ["previous tag", "po"],
+       'u' => ["undo", "co undo"],
+       'U' => ["undo line", "co undo"],
+       '^u'=> ["scroll up", "po"],
+       'v' => ["visual mode", "mv modev"],
+       'V' => ["visual lines", "mv modev"],
+       '^v'=> ["visual block", "mv modev"],
+       'w' => ["next word", "pm"],
+       'W' => ['next <span style="font-variant:small-caps">word</span>', "pm"],
+       '^w'=> ["window cmds", "me arg mode^w"],
+       'x' => ["delete char", "co undo"],
+       'X' => ["back­$sign{_}space", "co undo"],
+       '^x'=> ["subs$sign{_}tract", "co undo"],
+       'y' => ["yank", "co argm"],
+       'Y' => ["yank line", "co"],
+       '^y'=> ["window up", "po"],
+       'z' => ["extra cmds", "me arg modez"],
+       'Z' => ["quit", "me arg modeZ"],
+       '^z'=> [":sus$sign{_}pend", "ci"],
+}, # normal mode
+
+g => {
+       desc => "extended commands (g)",
+       lead => "g",
+
+       '~' => ["toggle case", "co argm vim"],
+       '@' => ["operat$sign{_}or$sign{_}func", "co vim7"],
+       '#' => ["rev. find string", "pm vim"],
+       '$' => ["virt$sign{_}ual eol", "pm"],
+       '^' => [qq'"soft" bol v$sign{_}irt$sign{_}ual', "pm vim"],
+       '&' => ["repeat :s global$sign{_}ly", "co", "Global substitute"],
+       '*' => ["find string", "pm vim"],
+       '_' => [qq'"soft" eol', "pm vim"],
+       '+' => ["later undo", "co vim7"],
+       '`' => ["to mark keepj$sign{_}umps", "pm vim arg"],
+       '8' => ["char hex val$sign{_}ue$sign{_}s", "ci"],
+       '0' => ["virtual bol", "pm vim"],
+       '-' => ["earlier undo", "co vim7"],
+       '^['=> ["esc", "mo mode"],
+       ']' => ["go to tselect", "po"],
+       '^]'=> ["go to tjump", "po"],
+       ';' => ["to prev change pos", "pm"],
+       "'" => ["to mark keepj$sign{_}umps", "pm vim arg"],
+       '<' => ["see prev cmd output", "co vim7"],
+       '?' => ["rot13 encode", "co argm vim"],
+       ',' => ["to next change pos", "pm"],
+
+       'a' => ["char value", "ci", "Get Ascii value"],
+       '^a'=> ["mem usage stats", "ci"],
+       'd' => ["local declar$sign{_}ation", "pm vim"],
+       'D' => ["global declar$sign{_}ation", "pm vim"],
+       'e' => ["back to word end", "pm"],
+       'E' => [qq'back to <span style="font-variant:small-caps">word</span> end', "pm"],
+       'f' => ["edit file at cur$sign{_}sor", "co vim", "Goto File"],
+       'F' => ["edit file + jump", "co vim7"],
+       'g' => ["first line", "pm"],
+       '^g'=> ["cursor pos info", "ci"],
+       'h' => ["select mode", "mv modev", "Get Highlighted"],
+       'H' => ["select lines", "mv modev", "Get Highlighted"],
+       '^h'=> ["select block", "mv modev", "Get Highlighted"],
+       'i' => ["insert at last pos", "mi undo modei"],
+       'I' => ["insert at soft bol", "mi undo modei"],
+       'j' => ["display line down", "pm vim"],
+       'J' => ["join leave spac$sign{_}ing", "co"],
+       'k' => ["display line up", "pm vim"],
+       'm' => ["g0 right half scr$sign{_}een", "pm vim"],
+       'o' => [":goto (byte)", "pm"],
+       'p' => ["paste no move", "co undo"],
+       'P' => ["paste before no move", "co"],
+       'q' => ["format", "co argm"],
+       'Q' => ["ex mode manual :", "mo vim"],
+       'r' => ["replace char vir.", "co arg"],
+       'R' => ["replace mode v$sign{_}ir$sign{_}t$sign{_}ual", "mi undo modei"],
+       's' => ["sleep", "ci", "Go to Sleep"],
+       't' => ["next tab", "po vim7", "Goto Tab"],
+       'T' => ["previous tab", "po vim7"],
+       'u' => ["lower$sign{_}case", "co argm vim"], # XXX undo?
+       'U' => ["upper$sign{_}case", "co undo argm vim"],
+       'v' => ["previous visual mode", "mv modev", "precedinG Visual"],
+       'V' => ["avoid reselect$sign{_}ion", "co"],
+       'w' => ["format remain cursor", "co argm vim7"],
+       'x' => ["Netrw$sign{_}BrowseX", "co vim7"],
+}, # mode g
+
+Z => {
+       desc => "additional commands (z)",
+       lead => "Z",
+
+       '^['=> ["esc", "mo mode"],
+
+       'Q' => [" :q!", "co vim"],
+       'Z' => [" :wq", "co"],
+}, # mode Z
+
+z => {
+       desc => "quit commands",
+       lead => "z",
+
+       '^' => ["page above", "po"],
+       '+' => ["page below", "po"],
+       '-' => ["line at bottom bol", "po", "don't (-) see any further"],
+       '=' => ["spelling suggest$sign{_}ions", "co vim7"],
+       '.' => ["line at center bol", "po"],
+       '^['=> ["esc", "mo mode"],
+
+       'a' => ["toggle fold", "co vim folding"],
+       'A' => ["toggle fold rec$sign{_}urs$sign{_}ive$sign{_}ly", "co vim folding"],
+       'b' => ["line at bot. bol", "po"],
+       'c' => ["close fold", "co vim folding"],
+       'C' => ["close folds rec$sign{_}curs$sign{_}ive$sign{_}ly", "co vim folding"],
+       'd' => ["delete fold", "co vim folding"],
+       'D' => ["delete folds rec$sign{_}urs$sign{_}ive", "co vim folding"],
+       'e' => ["cursor at right side", "po"],
+       'E' => ["eliminate folds", "co vim folding"],
+       'f' => ["create fold", "co argm vim folding"],
+       'F' => ["fold lines", "co vim folding"],
+       'g' => ["correct spelling", "co vim7", "Good word"],
+       'G' => ["add spelling", "co vim7"],
+       'h' => ["scroll $sign{right}", "po"],
+       'H' => ["scroll $sign{right} half scr$sign{_}een", "po"],
+       'i' => ["toggle all folds", "co vim folding"],
+       'j' => ["next fold start", "pm vim folding"],
+       'k' => ["prev fold end", "pm vim folding"],
+       'l' => ["scroll $sign{left}", "po"],
+       'L' => ["scroll $sign{left} half scr$sign{_}een", "po"],
+       '^m'=> ["line at top bol", "po"],
+       'm' => ["fold more", "co vim folding"],
+       'M' => ["close all folds", "co vim folding"],
+       'n' => ["fold none", "co vim folding"],
+       'N' => ["fold normal", "co vim folding"],
+       'o' => ["open fold", "co vim folding"],
+       'O' => ["open folds rec$sign{_}urs$sign{_}ive$sign{_}ly", "co vim folding"],
+       'r' => ["reduce folding", "co vim folding"],
+       'R' => ["open all folds", "co vim folding"],
+       's' => ["cursor at left side", "po"],
+       't' => ["line at top", "po"],
+       'u' => ["undo spelling", "co arg vim7"],
+       'v' => ["unfold cursor line", "co vim folding"],
+       'w' => ["add misspell$sign{_}ing", "co vim7", "Wrong word"],
+       'W' => ["temp misspell$sign{_}ing", "co vim7"],
+       'x' => ["update folds", "co vim folding"],
+       'X' => ["reapply folds", "co vim folding"],
+       'z' => ["line at center", "po", "Zee Zenter (with an accent)"],
+}, # mode z
+
+'[' => {
+       desc => "backward search commands ([)",
+       lead => "[",
+
+       "`" => ["previous lc mark", "pm vim"],
+       '#' => ["previous open #if$sign{_}/#else", "pm"],
+       '(' => ["previous open (", "pm"],
+       '*' => "[/",
+       '/' => ["start of C comm$sign{_}ent", "pm"],
+       "'" => "[` ^", # vim
+       '{' => ["previous open {", "pm"],
+       '[' => ["section back$sign{_}ward$sign{_}s", "pm"],
+       '^['=> ["esc", "mo mode"],
+       ']' => [qq'<span style="font-variant:small-caps">section</span> back$sign{_}ward$sign{_}s', "pm"],
+
+       'c' => ["start of change backw$sign{_}ards", "pm"],
+       'd' => ["list define", "co"],
+       'D' => ["list defines", "co"],
+       '^d'=> ["first #define", "po"],
+       'f' => "gf",  # deprecated
+       'i' => ["list line", "co"],
+       'I' => ["list lines", "co"],
+       '^i'=> ["first occur$sign{_}renc$sign{_}e", "po"],
+       'm' => ["start of funct$sign{_}ion", "pm"],
+       'p' => ["P but reindent", "co"],
+       'P' => ["[p", "co"],
+       's' => ["last mis$sign{_}spell$sign{_}ing", "po vim7"],
+       'S' => ["last bad word", "po vim7"],
+       'z' => ["start of open fold", "pm vim folding"],
+}, # mode [
+
+']' => {
+       desc => "forward search commands (])",
+       lead => "]",
+
+       "`" => ["next lc mark", "pm vim"],
+       '#' => ["next open #endif$sign{_}/#else", "pm"],
+       ')' => ["next open )", "pm"],
+       '*' => "]/",
+       "'" => "]` ^", # vim
+       '/' => ["end of C comm$sign{_}ent", "pm"],
+       '[' => [qq'<span style="font-variant:small-caps">section</span> forw$sign{_}ard', "pm"],
+       '^['=> ["esc", "mo mode"],
+       ']' => ["section forw$sign{_}ard", "pm"],
+       '}' => ["next open }", "pm"],
+
+       'c' => ["start of change forw$sign{_}ards", "pm"],
+       'd' => ["list define", "co"],
+       'D' => ["list defines", "co"],
+       '^d'=> ["first #define", "po"],
+       'f' => "gf",  # deprecated
+       'i' => ["list line", "co"],
+       'I' => ["list lines", "co"],
+       '^i'=> ["first occur$sign{_}renc$sign{_}e", "po"],
+       'm' => ["end of funct$sign{_}ion", "pm"],
+       'p' => ["p but reindent", "co"],
+       'P' => "[p",
+       's' => ["next mis$sign{_}spell$sign{_}ing", "po vim7"],
+       'S' => ["next bad word", "po vim7"],
+       'z' => ["end of open fold", "pm vim folding"],
+}, # mode ]
+
+'^w' => {
+       desc => "window commands (ctrl-w)",
+       lead => $ascii ? "'w"  : "ŵ",
+
+       '<' => ["decrease width", "po"],
+       '>' => ["increase width", "po"],
+       '^' => ["split, edit alt file", "co"],
+       '_' => ["set height", "po"],
+       '+' => ["increase height", "po"],
+       '-' => ["decrease height", "po"],
+       '=' => ["same height", "po"],
+       '^['=> ["esc", "mo mode"],
+       ']' => ["split, to tag", "po"],
+       '}' => ["tag in preview", "po"],
+       '|' => ["set width", "po"],
+
+       'b' => ["go to bottom", "po"],
+       'c' => [":close", "po"],
+       '^c'=> ["abort", "mo mode"],
+       'd' => ["split, to def$sign{_}inition", "po"],
+       'f' => ["split, edit file", "co"],
+       'F' => ["^wf, jump to line", "co vim7"],
+       'g' => ["extra cmds", "me arg mode^wg"],
+       'h' => ["go left", "po"],
+       'H' => ["move far left", "po"],
+       'i' => ["split, to decl of id$sign{_}ent$sign{_}ifier", "po"],
+       'j' => ["go down", "po"],
+       'J' => ["move to bottom", "po"],
+       'k' => ["go up", "po"],
+       'K' => ["move to top", "po"],
+       'l' => ["go right", "po"],
+       'L' => ["move far right", "po"],
+       'n' => ["open new", "co"],
+       'o' => [":only current", "po"],
+       'p' => ["go to previous", "po"],
+       'P' => ["go to preview", "po"],
+       'q' => [":quit current", "co"],
+       'r' => ["rotate down$sign{_}ward$sign{_}s", "po"],
+       'R' => ["rotate up$sign{_}ward$sign{_}s", "po"],
+       's' => ["split horiz$sign{_}ont$sign{_}al$sign{_}ly", "po"],
+       'S' => "^ws",
+       't' => ["go to top", "po"],
+       'v' => ["split vertical$sign{_}ly", "po"],
+       'w' => ["go to next", "po", "Wrap around"],
+       'W' => ["go above$sign{_}/left", "po"],
+       'x' => ["ex$sign{_}change", "po"],
+       'z' => ["close preview", "po"],
+}, # mode ^w
+
+'^wg' => {
+       desc => "extended window commands (ctrl-w g)",
+       lead => $ascii ? "'wg" : "ŵg",
+
+       '^['=> ["esc", "mo mode"],
+       ']' => ["split, :tselect", "po"],
+       '}' => [":ptjump to tag", "po"],
+       '^]'=> ["split, :tjump", "po"],
+       'f' => ["edit file in tab", "co vim7"],
+       'F' => ["^wgf, to line$sign{_}nr", "co vim7"],
+}, # mode ^w g
+
+v => {
+       desc => "visual mode",
+
+       '!' => ["external filter", "co"],
+       ':' => ["cmd on range", "mo modec"],
+       '<' => ["un$sign{_}indent", "co"],
+       '=' => ["equalprg filter", "co"],
+       '>' => ["indent", "co"],
+       '~' => ["toggle case", "co vim"],
+       '^['=> ["esc", "mo mode"],
+       '^]'=> ["jump to tag", "po"],
+
+       'a' => ["extend area", "me arg"], # XXX mode
+       'A' => ["append to block", "mi modei"], # block
+       'c' => ["replace area", "mi modei vim"],
+       'C' => ["replace lines", "mi modei vim"],
+       '^c'=> ["abort", "mo mode"],
+       'd' => ["delete area", "co vim"],
+       'D' => ["delete lines", "co vim"],
+       'g' => ["extra cmds", "me arg modevg"],
+       '^g'=> ["select mode", "mv"],
+       '^h'=> ["delete area", "co"], # select mode only
+       'i' => ["extend area", "me arg"],
+       'I' => ["insert to block", "mi modei"], # block
+       'J' => ["join lines", "co"],
+       'K' => ["keyword$sign{_}prg", "co"],
+       'o' => ["to other corner", "pm"],
+       'O' => ["to other side", "pm"],
+       '^o'=> ["visual once", "mv"], # select
+       'p' => ["replace w/ paste", "co"],
+       'P' => ["replace w/ paste", "co"],
+       '^q'=> "^q",
+       'r' => ["replace chars", "co arg"],
+       'R' => "vS",  # "might change in future"
+       '^s'=> "^s",
+       's' => "vc",
+       'S' => ["replace full lines", "mi modei vim"],
+       'u' => ["lower$sign{_}case", "co vim"],
+       'U' => ["upper$sign{_}case", "co vim"],
+       'v' => ["char$sign{_}wise", "mv"],
+       'V' => ["line$sign{_}wise", "mv"],
+       '^v'=> ["block$sign{_}wise", "mv"],
+       'x' => "vd",
+       'X' => "vD",
+       'y' => ["yank area", "co"],
+       'Y' => ["yank lines", "co"],
+
+       map {$_ => $_} qw(
+               b B ^b ^d e E ^e f F ^f G h H ^i j ^j k l L m M ^m
+               n N ^n ^p q ^s t T ^u w W ^w ^y z ^z
+               ` # $ % ^ * ( 0 ) [ { ] } ; / ? + - _ |
+       ) # a lot like normal mode
+}, # mode v
+
+vg => {
+       desc => "extended visual commands (v g)",
+       lead => "g",
+
+       '^['=> ["esc", "mv modev"],
+       '?' => ["rot13 encode", "co vim"],
+       'J' => ["join leave spacing", "co vim"],
+       'q' => ["format", "co vim"],
+       'v' => ["previous highl$sign{_}ight", "co"],
+       'w' => ["format remain cursor", "co vim7"],
+}, # mode v g
+
+#c => {
+#      desc => "command-line mode",
+#
+#      '^_' => 'i^_',
+#      '^^' => 'i^^',
+##     '^\\'=> ["cmd", "me arg"],
+#      '^a' => ["complete", ""], #todo
+#      '^b' => ["bol", "po"],
+#      '^c' => 'i^c',
+#      '^d' => ["complete", ""], #todo
+#      '^e' => ["eol", "po"],
+#      '^h' => 'i^h',
+#      '^j' => ["execute cmd", "co"],
+#      '^k' => 'i^k',
+#      '^l' => ["complete", ""], #todo
+#      '^n' => ["complete", ""], #todo
+#      '^p' => ["complete", ""], #todo
+#      '^r' => 'i^r', # and then some...
+#           ## ["insert register", "co arg vim"],
+#      '^q' => '^q',
+#      '^u' => 'i^u',
+#      '^v' => 'i^v',
+#      '^w' => 'i^w',
+#      '^y' => ["selec$sign{_}tion to clip$sign{_}b$sign{_}oard", "co"],
+#}, # mode c
+
+i => {
+       desc => "insert mode",
+
+       '^@' => ["last insert", "co"],
+       '^^' => ["toggle :lmap usag$sign{_}e", "co vim"],
+       '^[' => ["esc", "mo mode"],
+       '^]' => ["abbrev$sign{_}iate", "co vim"],
+       '^_' => ["change lang$sign{_}uage", "co vim"],
+       '^\\'=> ["switch mode", "mo arg"],
+
+       '^a' => ["insert prev$sign{_}ious", "co vim"],
+       '^b' => ["former i^_", "co"],
+       '^c' => ["abort, no abbr", "mo mode"],
+       '^d' => ["un$sign{_}indent", "co"],
+       '^e' => ["ins char below", "co vim"],
+       '^f' => ["cinkeys: re-indent", "co"],
+       '^g' => ["start column", "pm arg"], #todo
+       '^h' => ["back$sign{_}space", "co"],
+       '^i' => ["tab", "co"],
+       '^j' => ["enter", "co"],
+       '^k' => ["di$sign{_}graph", "co arg arg vim", "Key code"],
+       '^l' => ["<em>im</em> leave ins mode", "mo mode vim"],  # insertmode only
+       '^m' => ["enter", "co"],
+       '^n' => ["find next keyword", "pm vim"],
+       '^o' => ["execute cmd", "co"],
+       '^p' => ["find prev keyword", "pm vim"],
+       '^q' => "^q",  # or i^v
+       '^r' => ["insert register", "co arg vim"],
+       '^s' => "^s",
+       '^t' => ["indent", "co"],
+       '^u' => ["delete line", "co"],
+       '^v' => ["literal or char$sign{_}cod$sign{_}e", "co", "Verbatim or by Value"],
+       '^w' => ["delete word back", "co"],
+       '^x' => ["expand mode", "me arg modei^x vim"],
+       '^y' => ["ins char above", "co vim"],
+       '^z' => [":sus$sign{_}pend in <em>im</em>", "ci vim"],  # insertmode only
+}, # modei
+
+'i^x' => {
+       desc => "insert completion commands (i ctrl-x)",
+       lead => $ascii ? "'x"  : "x̂",
+
+       '^[' => ["esc", "mo mode"],
+       '^]' => ["complet$sign{_}e tags", "co"],
+       '^d' => ["complet$sign{_}e def$sign{_}ines", "co"],
+       '^e' => ["window up", "po"],
+       '^f' => ["complet$sign{_}e file$sign{_}name$sign{_}s", "co"],
+       '^i' => ["complet$sign{_}e idents", "co"],
+       '^k' => ["complet$sign{_}e dict", "co"],
+       '^l' => ["complet$sign{_}e lines", "co"],
+       '^n' => ["next complet$sign{_}e", "co"],
+       '^o' => ["omni complet$sign{_}e", "co vim7"],
+       '^p' => ["previou$sign{_}s compl$sign{_}ete", "co"],
+       '^s' => ["spell suggest", "co"],
+        's' => 'i^x^s',
+       '^t' => ["complet$sign{_}e thes$sign{_}aur$sign{_}us", "co"],
+       '^u' => ["complet$sign{_}e$sign{_}func", "co vim7"],
+       '^v' => ["complet$sign{_}e ex cmd", "co"],
+       '^y' => ["window down", "po"],
+}, # mode i ^x
+
+# XXX ex mode if you want to go completely wild
+
diff --git a/vim-keys.inc.pl b/vim-keys.inc.pl
new file mode 100644 (file)
index 0000000..c3c2907
--- /dev/null
@@ -0,0 +1,94 @@
+use utf8;
+my @num = qw(^0 ^0 ^@ ^0 ^0 ^0 ^^ ^0 ^0 ^0 ^0);
+
+dvorak => [[
+       [@num, qw/                           ^[ ^] /],
+       [qw/ ~  !  @  #  $  %  ^  &  *  (  )  {  } /],
+       [qw/ `  1  2  3  4  5  6  7  8  9  0  [  ] /],
+], [
+       [qw/^0 ^0 ^0 ^p ^y ^f ^g ^c ^r ^l ^? ^0 /],
+       [qw/ "  <  >  P  Y  F  G  C  R  L  ?  + /],
+       [qw( '  ,  .  p  y  f  g  c  r  l  /  = )],
+], [
+       [qw/^a ^o ^e ^u ^i ^d ^h ^t ^n ^s ^_ ^\\ /],
+       [qw/ A  O  E  U  I  D  H  T  N  S  _   | /],
+       [qw/ a  o  e  u  i  d  h  t  n  s  -  \\ /],
+], [
+       [qw/^0 ^q ^j ^k ^x ^b ^m ^w ^v ^z /],
+       [qw/ :  Q  J  K  X  B  M  W  V  Z /],
+       [qw/ ;  q  j  k  x  b  m  w  v  z /],
+]],
+
+qwerty => [[
+       [@num, qw/                           ^_ ^0 /],
+       [qw/ ~  !  @  #  $  %  ^  &  *  (  )  _  + /],
+       [qw/ `  1  2  3  4  5  6  7  8  9  0  -  = /],
+], [
+       [qw/^q ^w ^e ^r ^t ^y ^u ^i ^o ^p ^[ ^] /],
+       [qw/ Q  W  E  R  T  Y  U  I  O  P  {  } /],
+       [qw/ q  w  e  r  t  y  u  i  o  p  [  ] /],
+], [
+       [qw/^a ^s ^d ^f ^g ^h ^j ^k ^l ^0 ^0 ^\\ /],
+       [qw/ A  S  D  F  G  H  J  K  L  :  "   | /],
+       [qw/ a  s  d  f  g  h  j  k  l  ;  '  \\ /],
+], [
+       [qw(^z ^x ^c ^v ^b ^n ^m ^0 ^0 ^? )],
+       [qw( Z  X  C  V  B  N  M  <  >  ? )],
+       [qw( z  x  c  v  b  n  m  ,  .  / )],
+]],
+
+qwertz => [[
+       [qw/^^ ^0 ^0 ^0 ^0 ^0 ^0  {  [  ]  } \\ ^0 /],
+       [qw{ °  !  "  §  $  %  &  /  (  )  =  ?  ` }],
+       [qw/ ^  1  2  3  4  5  6  7  8  9  0  ß  ´ /],
+], [
+       [qw/ @ ^w ^e ^r ^t ^z ^u ^i ^o ^p ^0  ~ /],
+       #    ^ show altgr-Q instead
+       [qw/ Q  W  E  R  T  Z  U  I  O  P  Ü  * /],
+       [qw/ q  w  e  r  t  z  u  i  o  p  ü  + /],
+], [
+       [qw/^a ^s ^d ^f ^g ^h ^j ^k ^l ^0 ^0 ^0 /],
+       [qw/ A  S  D  F  G  H  J  K  L  Ö  Ä  ' /],
+       [qw/ a  s  d  f  g  h  j  k  l  ö  ä  # /],
+], [
+       [qw/^y ^x ^c ^v ^b ^n ^m ^0 ^0 ^_  | /],
+       [qw/ Y  X  C  V  B  N  M  ;  :  _  > /],
+       [qw/ y  x  c  v  b  n  m  ,  .  -  < /],
+]],
+
+arensito => [[
+       [@num, qw/                           ^[ ^] /],
+       [qw/ ~  !  @  #  $  %  ^  &  *  (  )  {  } /],
+       [qw/ `  1  2  3  4  5  6  7  8  9  0  [  ] /],
+], [
+       [qw(^q ^l ^0 ^p ^0 ^0 ^f ^u ^d ^k ^? ^0 )],
+       [qw( Q  L  "  P  <  >  F  U  D  K  ?  + )],
+       [qw( q  l  '  p  ,  .  f  u  d  k  /  = )],
+], [
+       [qw/^a ^r ^e ^n ^b ^g ^s ^i ^t ^o ^_ ^\\ /],
+       [qw/ A  R  E  N  B  G  S  I  T  O  _   | /],
+       [qw/ a  r  e  n  b  g  s  i  t  o  -  \\ /],
+], [
+       [qw/^z ^w ^0 ^h ^j ^v ^c ^y ^m ^x /],
+       [qw/ Z  W  :  H  J  V  C  Y  M  X /],
+       [qw/ z  w  ;  h  j  v  c  y  m  x /],
+]],
+
+abc => [[
+       [@num, qw/                           ^_ ^0 /],
+       [qw/ ~  !  @  #  $  %  ^  &  *  (  )  _  + /],
+       [qw/ `  1  2  3  4  5  6  7  8  9  0  -  = /],
+], [
+       [qw/^a ^b ^c ^d ^e ^f ^g ^h ^i ^j ^[ ^] /],
+       [qw/ A  B  C  D  E  F  G  H  I  J  {  } /],
+       [qw/ a  b  c  d  e  f  g  h  i  j  [  ] /],
+], [
+       [qw/^k ^l ^m ^n ^o ^p ^q ^r ^s ^0 ^0 ^\\ /],
+       [qw/ K  L  M  N  O  P  Q  R  S  :  "   | /],
+       [qw/ k  l  m  n  o  p  q  r  s  ;  '  \\ /],
+], [
+       [qw'^t ^u ^v ^w ^x ^y ^z ^0 ^0 ^? '],
+       [qw' T  U  V  W  X  Y  Z  <  >  ? '],
+       [qw' t  u  v  w  x  y  z  ,  .  / '],
+]],
+