host vim sheet page primarily at sheet.shiar.net/vim
authorMischa POSLAWSKY <perl@shiar.org>
Mon, 5 Jan 2009 19:13:46 +0000 (19:13 +0000)
committerMischa POSLAWSKY <perl@shiar.org>
Tue, 6 Jan 2009 22:39:02 +0000 (22:39 +0000)
With the increasing number of other pages, sheet.shiar.nl makes more
sense than the previous vi(m).shiar.net.  The root still redirects to
the vim page for now (until there's enough to offer to support a proper
index).

digraphs.plp
digraphs.vim.plp
index.plp
unicode.plp
vim.plp [new file with mode: 0644]

index cec6406e3caf6a96178ef829ce525869a6f944a0..be33d63fe57546e26ca562a067620e618966dfd0 100644 (file)
@@ -118,7 +118,7 @@ print "</table>\n";
 </div>
 
 <p id="footer">
-       <a href="http://vi.shiar.net/digraphs">vi.<strong>shiar.net</strong>/digraphs</a>
+       <a href="http://sheet.shiar.nl/digraphs">sheet.shiar.nl<strong>/digraphs</strong></a>
        <a href="git://dev.shiar.net/vi-cheat"><:= "v$VERSION" :></a>
        created by Shiar •
        <a title="Licensed under the GNU Affero General Public License, version 3"
index d21a5f66e5715e04904da3a05f9860d77a1cfc9b..6123fea187d8a3e2be0275fe48e7577d89968ce1 100644 (file)
@@ -6,7 +6,7 @@ use open IO => ':utf8';
 our $VERSION = '1.0';
 
 $header{content_type} = 'text/plain; charset=us-ascii';
-print '" vim digraph proposals <http://vi.shiar.net/digraphs>', "\n";
+print '" vim digraph proposals <http://sheet.shiar.nl/digraphs>', "\n";
 PLP_END { print "\n" };
 
 open my $include, '<', 'shiar.inc.txt' or do {
index 4cffec69440b77adb9a19059773c467268b3dee1..789607b297084b949f5fbf54ae6f71729c9eaab8 100644 (file)
--- a/index.plp
+++ b/index.plp
@@ -1,266 +1,8 @@
 <:
-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
-
-our $VERSION = '1.1';
-
-our $ascii = 0;
-if (exists $get{ascii}) {
-       $ascii = $get{ascii} ne '0';  # manual override
-} elsif (defined $ENV{HTTP_ACCEPT_CHARSET}) {
-       $ascii = 1;
-       for (split q{,}, $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 terse);
-       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>
-
+$header{Status}   = '302 Go right ahead';
+$header{Location} = '/vim';
+:><html>
 <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 $_;
-}
-
-my %keytrans = qw(
-       ^@ NUL ^a SOH ^b STX ^c ETX  ^d EOT ^e ENQ ^f ACK ^g BEL
-       ^h BS  ^i tab ^j LF  ^k VT   ^l FF  ^m CR  ^n SO  ^o SI
-       ^p DLE ^q DC1 ^r DC2 ^s DC3  ^t DC4 ^u NAK ^v SYN ^w ETB
-       ^x CAN ^y EM  ^z SUB ^[ ESC  ^\ FS  ^] GS  ^^ RS  ^_ US
-       ^? DEL
-);
-
-sub print_key {
-       my ($mode, $key, $keyinfo) = @_;
-
-       $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';
-
-#      $key = $keytrans{$key} if defined $keytrans{$key};
-       my $keytxt = $mode . 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(q{'mode%s'}, escapeclass($1))
-       );
-       $onclick .= sprintf(q{ onclick="document.location='%s'"}, $1)
-               if $flags =~ s/ ?\blink(\S*)//;
-       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";
-}
-
-our $map = defined $keyrows{$get{map}} ? $get{map} : 'qwerty';
-my $keyrows = $keyrows{$map};
-my @moderows = $get{static} ? split(/\s+/, $get{static}) : sort keys %keys;
-
-for (my $row = 0; $row <= $#$keyrows; $row++) {
-       my $keyrow = $keyrows->[$row];
-       my @caserows = 0 .. $#$keyrow;
-
-       print qq{<li class="row row$row"><ul>\n};
-       for my $modefull (@moderows) {
-               my $mode = $modefull;
-               my @showcase = $mode =~ s/(\d+)(?:-(\d+))?$//
-                       ? (map {3 - $_} split //, $row == 0 && $2 || $1) : @caserows;
-               my $modekeys = $keys{$mode};
-
-               for my $case (@showcase) {
-                       my $keycase = $keyrow->[$case] or next;
-                         @$keycase or next;
-
-                       printf "\t<li%s>", $mode ne '' && sprintf(
-                               ' class="%s"', ($get{static} ? '' : 'mode ') . 'mode' . escapeclass($mode)
-                       );
-                       printf("<h3>%s<small>: %s</small></h3>\n", # XXX insert &nbsp; here to fix msie<=6
-                                       $modekeys->{desc} || "mode $mode",
-                                       "$rowdesc[$row] row $casedesc[$case]"
-                       );
-                       my $caseclass = 'keys';
-                          $caseclass .= ' lead' if defined $modekeys->{lead};  # leading command key shown
-                          $caseclass .= " $casedesc[$case]" if defined $casedesc[$case];
-                       print qq{\t\t<ul class="$caseclass">\n};
-                       print_key($modekeys->{lead}, $_, $modekeys->{$_}) for @$keycase;
-                       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="http://vi.shiar.net/">vi.<strong>shiar.net</strong></a>
-       <a href="git://dev.shiar.net/vi-cheat"><:= "v$VERSION" :></a>
-       created by Shiar <:= $sign{sep} :>
-       <a title="Licensed under the GNU Affero General Public License, version 3"
-          href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">AGPLv3</a> <:= $sign{sep} :>
-       last update <:
-               use Time::Format qw(time_format);
-               print time_format('yyyy-mm-dd', (stat 'vim-cmds.inc.pl')[9]);
-       :>
-</p>
-
+<p>Mainly just the <a href="/vim">Vim sheet</a> so far...</p>
+</body>
 </html>
index da5b6e8c9f1c2ece098f1484611d9bb816e8cb9f..fc9461ee5047f940caa0db7b1436371e50714726 100644 (file)
@@ -280,7 +280,7 @@ print_glyph_tables(
 </div>
 
 <p id="footer">
-       <a href="http://vi.shiar.net/unicode">vi.<strong>shiar.net</strong>/unicode</a>
+       <a href="http://sheet.shiar.nl/unicode">sheet.shiar.nl<strong>/unicode</strong></a>
        <a href="git://dev.shiar.net/vi-cheat"><:= "v$VERSION" :></a>
        created by Shiar •
        <a title="Licensed under the GNU Affero General Public License, version 3"
diff --git a/vim.plp b/vim.plp
new file mode 100644 (file)
index 0000000..df3cca5
--- /dev/null
+++ b/vim.plp
@@ -0,0 +1,266 @@
+<:
+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
+
+our $VERSION = '1.1';
+
+our $ascii = 0;
+if (exists $get{ascii}) {
+       $ascii = $get{ascii} ne '0';  # manual override
+} elsif (defined $ENV{HTTP_ACCEPT_CHARSET}) {
+       $ascii = 1;
+       for (split q{,}, $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 terse);
+       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 $_;
+}
+
+my %keytrans = qw(
+       ^@ NUL ^a SOH ^b STX ^c ETX  ^d EOT ^e ENQ ^f ACK ^g BEL
+       ^h BS  ^i tab ^j LF  ^k VT   ^l FF  ^m CR  ^n SO  ^o SI
+       ^p DLE ^q DC1 ^r DC2 ^s DC3  ^t DC4 ^u NAK ^v SYN ^w ETB
+       ^x CAN ^y EM  ^z SUB ^[ ESC  ^\ FS  ^] GS  ^^ RS  ^_ US
+       ^? DEL
+);
+
+sub print_key {
+       my ($mode, $key, $keyinfo) = @_;
+
+       $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';
+
+#      $key = $keytrans{$key} if defined $keytrans{$key};
+       my $keytxt = $mode . 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(q{'mode%s'}, escapeclass($1))
+       );
+       $onclick .= sprintf(q{ onclick="document.location='%s'"}, $1)
+               if $flags =~ s/ ?\blink(\S*)//;
+       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";
+}
+
+our $map = defined $keyrows{$get{map}} ? $get{map} : 'qwerty';
+my $keyrows = $keyrows{$map};
+my @moderows = $get{static} ? split(/\s+/, $get{static}) : sort keys %keys;
+
+for (my $row = 0; $row <= $#$keyrows; $row++) {
+       my $keyrow = $keyrows->[$row];
+       my @caserows = 0 .. $#$keyrow;
+
+       print qq{<li class="row row$row"><ul>\n};
+       for my $modefull (@moderows) {
+               my $mode = $modefull;
+               my @showcase = $mode =~ s/(\d+)(?:-(\d+))?$//
+                       ? (map {3 - $_} split //, $row == 0 && $2 || $1) : @caserows;
+               my $modekeys = $keys{$mode};
+
+               for my $case (@showcase) {
+                       my $keycase = $keyrow->[$case] or next;
+                         @$keycase or next;
+
+                       printf "\t<li%s>", $mode ne '' && sprintf(
+                               ' class="%s"', ($get{static} ? '' : 'mode ') . 'mode' . escapeclass($mode)
+                       );
+                       printf("<h3>%s<small>: %s</small></h3>\n", # XXX insert &nbsp; here to fix msie<=6
+                                       $modekeys->{desc} || "mode $mode",
+                                       "$rowdesc[$row] row $casedesc[$case]"
+                       );
+                       my $caseclass = 'keys';
+                          $caseclass .= ' lead' if defined $modekeys->{lead};  # leading command key shown
+                          $caseclass .= " $casedesc[$case]" if defined $casedesc[$case];
+                       print qq{\t\t<ul class="$caseclass">\n};
+                       print_key($modekeys->{lead}, $_, $modekeys->{$_}) for @$keycase;
+                       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="http://sheet.shiar.nl/vim">sheet.shiar.nl<strong>/vim</strong></a>
+       <a href="git://dev.shiar.net/vi-cheat"><:= "v$VERSION" :></a>
+       created by Shiar <:= $sign{sep} :>
+       <a title="Licensed under the GNU Affero General Public License, version 3"
+          href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">AGPLv3</a> <:= $sign{sep} :>
+       last update <:
+               use Time::Format qw(time_format);
+               print time_format('yyyy-mm-dd', (stat 'vim-cmds.inc.pl')[9]);
+       :>
+</p>
+
+</html>