keyboard: replace all similar pages
[sheet.git] / vi.eng.inc.pl
1 use utf8;
2
3 my @motions = qw(
4         g z [ ]
5         b B e E f F G ^h h H j ^j k l L M ^m n N ^n ^p t T w W
6         0 ` ' # $ % ^ * ( ) { } ; / ? + - _ | ,
7 );
8
9 {
10 title => 'vi/vim',
11 version => 1.5,
12 description => [
13         "Interactive cheat sheet for vi text editors, notably Vim,",
14         "describing each key in various modes.",
15 ],
16 keywords => [qw' vi vim nvi '],
17
18 key => {
19
20         "\e"=> "normal mode",
21         '~' => "case toggle",
22         '!' => "filt<>er lines",
23         '@' => "play macro",
24         '#' => "rev. find word",
25         '$' => "eol",
26         '%' => "goto match",
27         '^' => '"soft" bol',
28         '&' => ":s rep<>eat",
29         '*' => "find word",
30         '(' => "begin senten<>ce",
31         ')' => "end senten<>ce",
32         '_' => '"soft" bol down',
33         '+' => "next line",
34         '`' => "goto mark",
35         '0' => '"hard" bol',
36         '^^'=> "edit alt. file",
37         '-' => "prev line",
38         '=' => "re<>ind<>ent",
39         '?' => "find rev.",
40         ';' => "repeat t/f/T/F",
41         ':' => "ex cmd line",
42         "'" => "goto mark bol",
43         '"' => "use reg<>ister",
44         '\\' => "reser<>ved",
45         '^\\' => "to mode/<>ext<>ens<>ion<>s",
46         ',' => "reverse t/T/f/F",
47         '<' => "un<>ind<>ent",
48         '.' => "repeat last cmd",
49         '>' => "ind<>ent",
50         '/' => "find",
51         '[' => "move back<>ward<>s",
52         '{' => "begin parag.",
53         ']' => "move forw<>ard",
54         '}' => "end parag.",
55         '^]'=> "go to tag",
56         '|' => "goto (1st) col",
57
58         'a' => "app<>end",
59         'A' => "app<>end to eol",
60         '^a'=> "incr<>ement\nAdd one",
61         'b' => "prev word\nBack",
62         'B' => 'prev <span style="font-variant:small-caps">word</span>',
63         '^b'=> "page up",
64         'c' => "chan<>ge",
65         'C' => "chan<>ge to eol",
66         '^c'=> "abort",
67         'd' => "del<>ete",
68         'D' => "delete to eol",
69         '^d'=> "scroll down",
70         'e' => "end word",
71         'E' => 'end <span style="font-variant:small-caps">word</span>',
72         '^e'=> "window down\nExtra line",
73         'f' => "fwd to char",
74         'F' => "back<>wd to char",
75         '^f'=> "page down\npage Forward",
76         'g' => "extra cmds",
77         'G' => "eof/<>goto ln",
78         '^g'=> ":file (info)",
79         'h' => "<left>",
80         'H' => "screen top\nHome row",
81         'i' => "insert mode",
82         'I' => "insert at bol",
83         '^i'=> "jump to newer\nIncrease position",
84         'j' => "<down>",
85         'J' => "join lines",
86         'k' => "<up>",
87         'K' => "help\nlooKup Keyword",
88         'l' => "<right>",
89         'L' => "screen bottom\nLowermost Line",
90         '^l'=> "redraw",
91         'm' => "set mark",
92         'M' => "screen mid<>dle",
93         'n' => "next find",
94         'N' => "prev find",
95         'o' => "line below\nOpen",
96         'O' => "line above",
97         '^o'=> "jump to older",
98         'p' => "paste after",
99         'P' => "paste before",
100         'q' => "rec<>ord macro\nQueue seQuence",
101         'Q' => "ex mode",
102         '^q'=> "(xon)\nQome back",
103         'r' => "repl<>ace char",
104         'R' => "repl<>ace mode",
105         '^r'=> "redo",
106         's' => "subst char",
107         'S' => "subst line",
108         '^s'=> "(xoff)\nStop",
109         't' => "till char",
110         'T' => "back till char",
111         '^t'=> "back tag", # backtrag :P
112         'u' => "undo",
113         'U' => "undo line",
114         '^u'=> "scroll up",
115         'v' => "visual mode",
116         'V' => "visual lines",
117         '^v'=> "visual block",
118         'w' => "next word",
119         'W' => 'next <span style="font-variant:small-caps">word</span>',
120         '^w'=> "win<>dow cmds",
121         'x' => "delete char",
122         'X' => "back<>space",
123         '^x'=> "subs<>tract",
124         'y' => "yank\n(copy)",
125         'Y' => "yank line",
126         '^y'=> "window up\nYield",
127         'z' => "extra cmds",
128         'Z' => "quit",
129         '^z'=> ":sus<>pend\nzzz (as in sleep)",
130
131         'g~' => "case toggl<>e",
132         'g@' => "oper<>at<>or<>func",
133         'g#' => "rev. find string",
134         'g$' => "virt<>ual eol",
135         'g^' => qq'"soft" bol v<>irt<>ual',
136         'g&' => ":s rep<>eat glob<>al<>ly\nGlobal substitute",
137         'g*' => "find string",
138         'g_' => qq'"soft" eol',
139         'g+' => "later undo",
140         'g`' => "to mark keepj<>umps",
141         'g8' => "char hex val<>ue<>s",
142         'g0' => "virtual bol",
143         'g-' => "earlier undo",
144         "g\e"=> "normal mode",
145         'g]' => "go to tselect",
146         'g^]'=> "go to tjump",
147         'g;' => "to prev change pos",
148         "g'" => "to mark keepj<>umps",
149         'g<' => "see prev cmd output",
150         'g?' => "rot13 encode",
151         'g,' => "to next change pos",
152
153         'ga' => "char value\nGet Ascii value",
154         'g^a'=> "mem usage stats",
155         'gd' => "local declar<>ation",
156         'gD' => "global declar<>ation",
157         'ge' => "back to word end",
158         'gE' => qq'back to <span style="font-variant:small-caps">word</span> end',
159         'gf' => "edit file at cur<>sor\nGoto File",
160         'gF' => "edit file + jump",
161         'gg' => "first line",
162         'g^g'=> "cur<>sor pos info",
163         'gh' => "select mode\nGet Highlighted",
164         'gH' => "select lines\nGet Highlighted",
165         'g^h'=> "select block\nGet Highlighted",
166         'gi' => "insert at last pos",
167         'gI' => "insert at soft bol",
168         'gj' => "<down> screen",
169         'gJ' => "join leave spac<>ing",
170         'gk' => "<up> screen",
171         'gm' => "cen<>ter screen",
172         'gn' => "select next find",
173         'gN' => "select prev find",
174         'go' => ":goto (byte)",
175         'gp' => "paste still",
176         'gP' => "paste before still",
177         'gq' => "for<>mat",
178         'gQ' => "ex mode manual :",
179         'gr' => "virt. repl<>ace char",
180         'gR' => "virt. repl<>ace mode",
181         'gs' => "sleep\nGo to Sleep",
182         'gt' => "next tab\nGoto Tab",
183         'gT' => "tab back",
184         'gu' => "lower<>case",
185         'gU' => "up<>per<>case",
186         'gv' => "prev<>ious highl<>ight\nprecedinG Visual",
187         'gV' => "avoid resel<>ect<>ion",
188         'gw' => "for<>mat still",
189         'gx' => "Netrw<>BrowseX",
190
191         "Z\e"=> "normal mode",
192         'ZQ' => " :q! (force)",
193         'ZZ' => " :wq (write)",
194
195         'z^' => "page above",
196         'z+' => "page below",
197         'z-' => "line at bottom bol\ndon't (-) see any further",
198         'z=' => "sug<>gest spell<>ing",
199         'z.' => "line at center bol",
200         "z\e"=> "normal mode",
201
202         'za' => "toggle fold",
203         'zA' => "toggle fold rec<>urs<>ive<>ly",
204         'zb' => "line at bot. bol",
205         'zc' => "close fold",
206         'zC' => "close folds rec<>curs<>ive<>ly",
207         'zd' => "delete fold",
208         'zD' => "delete folds rec<>urs<>ive",
209         'ze' => "cursor at right side",
210         'zE' => "elimi<>nate f<>olds",
211         'zf' => "create fold",
212         'zF' => "fold lines",
213         'zg' => "add spell<>ing\nGood word",
214         'zG' => "temp spell<>ing",
215         'zh' => "scroll <left>",
216         'zH' => "scroll <left> half scr<>een",
217         'zi' => "toggle all folds",
218         'zj' => "next fold start",
219         'zk' => "prev fold end",
220         'zl' => "scroll <right>",
221         'zL' => "scroll <right> half scr<>een",
222         'z^m'=> "line at top bol",
223         'zm' => "fold more",
224         'zM' => "close all folds",
225         'zn' => "fold none",
226         'zN' => "fold norm<>al",
227         'zo' => "open fold",
228         'zO' => "open folds rec<>urs<>ive<>ly",
229         'zr' => "reduce folding",
230         'zR' => "open all folds",
231         'zs' => "cursor at left side",
232         'zt' => "line at top",
233         'zu' => "undo spell<>ing",
234         'zv' => "unfold cursor line",
235         'zw' => "add missp<>ell<>ing\nWrong word",
236         'zW' => "temp missp<>ell<>ing",
237         'zx' => "update folds",
238         'zX' => "re<>apply f<>olds",
239         'zz' => "line at center\nZee Zenter (with a funny accent)",
240
241         "[`" => "previous lc mark",
242         '[#' => "previous open #if<>/#else",
243         '[(' => "previous open (",
244         '[/' => "start of C com<>m<>ent",
245         '[{' => "previous open {",
246         '[[' => "section back<>ward<>s",
247         "[\e"=> "normal mode",
248         '[]' => qq'<span style="font-variant:small-caps">section</span> back<>ward<>s',
249
250         '[c' => "start of change backw<>ards",
251         '[d' => "define line",
252         '[D' => "defin<>ition",
253         '[^d'=> "to defin<>it<>ion",
254         '[i' => "first occur<>renc<>e line",
255         '[I' => "first occur<>renc<>e",
256         '[^i'=> "to first occur<>renc<>e",
257         '[m' => "start of funct<>ion",
258         '[p' => "P reind<>ent<>ed",
259         '[s' => "last missp<>ell<>ing",
260         '[S' => "last bad word",
261         '[z' => "start of open fold",
262
263         "]`" => "next lc mark",
264         ']#' => "next open #endif<>/#else",
265         '])' => "next open )",
266         ']/' => "end of C com<>m<>ent",
267         '][' => qq'<span style="font-variant:small-caps">section</span> forw<>ard',
268         "]\e"=> "normal mode",
269         ']]' => "section forw<>ard",
270         ']}' => "next open }",
271
272         ']c' => "start of change forw<>ards",
273         ']d' => "next define line",
274         ']D' => "next define",
275         ']^d'=> "to next define",
276         ']i' => "next occur<>renc<>e line",
277         ']I' => "next occur<>renc<>e",
278         ']^i'=> "to occur<>renc<>e",
279         ']m' => "end of funct<>ion",
280         ']p' => "p reind<>ent<>ed",
281         ']s' => "next missp<>ell<>ing",
282         ']S' => "next bad word",
283         ']z' => "end of open fold",
284
285         '^w<' => "width decr<>ease",
286         '^w>' => "width incr<>ease",
287         '^w^' => "split, edit alt file",
288         '^w_' => "set height",
289         '^w+' => "height incr<>ease",
290         '^w-' => "height decr<>ease",
291         '^w=' => "same height",
292         "^w\e"=> "normal mode",
293         '^w]' => "split, to tag",
294         '^w}' => "pre<>view tag",
295         '^w|' => "set width",
296
297         '^wb' => "go to bot<>tom",
298         '^wc' => ":close",
299         '^w^c'=> "abort",
300         '^wd' => "split, to def<>inition",
301         '^wf' => "split, file edit",
302         '^wF' => "^wf, jump to line",
303         '^wg' => "extra cmds",
304         '^wh' => "go left",
305         '^wH' => "move far left",
306         '^wi' => "split, to decl of id<>ent<>ifier",
307         '^wj' => "go down",
308         '^wJ' => "move to bottom",
309         '^wk' => "go up",
310         '^wK' => "move to top",
311         '^wl' => "go right",
312         '^wL' => "move far right",
313         '^wn' => "open new",
314         '^wo' => ":only current",
315         '^wp' => "go to prev<>ious",
316         '^wP' => "go to pre<>view",
317         '^wq' => ":quit current",
318         '^wr' => "rotate down<>ward<>s",
319         '^wR' => "rotate up<>ward<>s",
320         '^ws' => "split horiz<>ont<>al<>ly",
321         '^wt' => "go to top",
322         '^wT' => "to tab",
323         '^wv' => "split vert<>ic<>al<>ly",
324         '^ww' => "go to next\nWrap around",
325         '^wW' => "go above<>/left",
326         '^wx' => "ex<>chan<>ge",
327         '^wz' => "close pre<>view",
328
329         "^wg\e"=> "normal mode",
330         '^wg]' => "split, :ts<>elect",
331         '^wg}' => ":ptj<>ump to tag",
332         '^wg^]'=> "split, :tj<>ump",
333         '^wgf' => "file in tab",
334         '^wgF' => "^wgf, to line<>nr",
335
336         'v!' => "external filter",
337         'v:' => "cmd on range",
338         'v<' => "un<>indent",
339         'v=' => "re<>ind<>ent",
340         'v>' => "ind<>ent",
341         'v~' => "toggle case",
342         "v\e"=> "normal mode",
343         'v^]'=> "jump to tag",
344
345         'va' => "ex<>tend area",
346         'vA' => "ap<>pend to block", # block
347         'v^a'=> "incr<>ement num<>bers",
348         'vc' => "repl<>ace area",
349         'vC' => "repl<>ace full lines", # like vS, but blocks are extended until eol
350         'v^c'=> "abort",
351         'vd' => "delete area",
352         'vD' => "delete lines",
353         'vg' => "extra cmds",
354         'v^g'=> "select mode",
355         'vi' => "extend inner a<>r<>ea",
356         'vI' => "insert to block", # block
357         'vJ' => "join lines",
358         'vK' => "help sel<>ect<>ion",
359         'vo' => "to other corner",
360         'vO' => "to other side",
361         'v^o'=> "visual once", # select
362         'vp' => "repl<>ace w/ paste",
363         'vP' => "repl<>ace w/ paste",
364         'vr' => "fill up w/ ch<>ar",
365         'vS' => "repl<>ace lines",
366         'vu' => "lower<>case",
367         'vU' => "upper<>case",
368         'vv' => "char<>wise",
369         'vV' => "line<>wise",
370         'v^v'=> "block<>wise",
371         'v^x'=> "decr<>ement num<>bers",
372         'vy' => "yank area",
373         'vY' => "yank lines",
374
375         "vg\e"=> "visual mode",
376         'vg?' => "rot13 encode",
377         'vg^a'=> "seq. incr<>ement",
378         'vg^g'=> "count region info",
379         'vgJ' => "join literal<>ly",
380         'vgq' => "for<>mat",
381         'vgw' => "for<>mat still",
382         'vg^x'=> "seq. decr<>ement",
383
384         "va'" => "quoted string",
385         'va<' => "&lt;&gt; block",
386         'va[' => "[] block",
387         "va\e"=> "visual mode",
388
389         'vab' => "() block",
390         'vaB' => "{} Block",
391         'vap' => "para<>graph",
392         'vas' => "senten<>ce",
393         'vat' => "xml tag block",
394         'vaw' => "word",
395         'vaW' => '<span style="font-variant:small-caps">word</span>',
396
397 #       'c^a' => "complete", #todo
398 #       'c^b' => "bol",
399 #       'c^d' => "complete", #todo
400 #       'c^e' => "eol",
401 #       'c^j' => "execute cmd",
402 #       'c^l' => "complete", #todo
403 #       'c^n' => "complete", #todo
404 #       'c^p' => "complete", #todo
405 #       'c^r' => \'i^r', # and then some...
406 #             ## "insert register",
407 #       'c^y' => "selec<>tion to clip<>b<>oard",
408
409         'i^@' => "last insert",
410         'i^^' => "toggle :lmap usag<>e",
411         "i\e" => "normal mode",
412         'i^]' => "abbrev<>iate",
413         'i^_' => "toggle lang<>uage",
414
415         'i^a' => "insert prev<>ious",
416         'i^b' => "former i^_",
417         'i^c' => "abort, no abbr",
418         'i^d' => "un<>ind<>ent",
419         'i^e' => "ins char below",
420         'i^f' => "set indent<>ation",
421         'i^g' => "extra cmds",
422         'i^h' => "back<>space",
423         'i^i' => "tab",
424         'i^j' => "enter",
425         'i^k' => "di<>graph\nKey code",
426         'i^l' => "<em>im</em> leave ins mode",
427         'i^m' => "enter",
428         'i^n' => "find next keyword",
429         'i^o' => "exec<>ute cmd",
430         'i^p' => "find prev keyword",
431         'i^r' => "insert reg<>ister",
432         'i^t' => "indent",
433         'i^u' => "delete line",
434         'i^v' => "literal or ch<>ar<>cod<>e\nVerbatim or by Value",
435         'i^w' => "delete word back",
436         'i^x' => "ex<>pand mode",
437         'i^y' => "ins char above",
438         'i^z' => ":sus<>pend in <em>im</em>",
439
440         "i^g\e"=> "insert mode",
441         'i^gk' => "<up> start col<>umn",
442         'i^gj' => "<down> start col<>umn",
443         'i^gu' => "break undo seq<>uence",
444         'i^gU' => "keep undo seq<>uence",
445         # other i^g keys (even esc) are not recognized
446
447         "i^x\e" => "normal mode",
448         'i^x^]' => "tag comp<>l<>et<>e",
449         'i^x^d' => "def<>ine compl<>et<>e",
450         'i^x^e' => "window up",
451         'i^x^f' => "file comp<>l<>et<>e",
452         'i^x^i' => "ident comp<>l<>et<>e",
453         'i^x^k' => "dict comp<>l<>et<>e",
454         'i^x^l' => "line comp<>l<>et<>e",
455         'i^x^n' => "next comp<>l<>et<>e",
456         'i^x^o' => "omni comp<>l<>et<>e",
457         'i^x^p' => "prev comp<>l<>ete",
458         'i^x^s' => "spell sugg<>est",
459         'i^x^t' => "thes<>aur<>us compl<>et<>e",
460         'i^x^u' => "cus<>tom comp<>l<>et<>e",
461         'i^x^v' => "ex cmd compl<>et<>e",
462         'i^x^y' => "window down",
463
464         # plugins
465           'gc' => "(un)<>com<>ment\ncommentary or tComment plugin",
466          'vgc' => "(un)<>com<>ment\ncommentary or tComment plugin",
467           'gl' => "align to left\nlion plugin, also good for easy-align",
468          'vgl' => "align to left\nlion plugin, also good for easy-align",
469           'gL' => "align to right\nlion plugin",
470          'vgL' => "align to right\nlion plugin",
471         'i^gs' => "sur<>round\nsurround plugin",
472
473         # unimpaired
474         '[a' => "prev<>ious file\nunimpaired map for :prev",
475         ']a' => "next file\nunimpaired map for :n",
476         '[A' => "first file\nunimpaired map for :rew",
477         ']A' => "last file\nunimpaired map for :la",
478         '[b' => "prev<>ious buffer\nunimpaired map for :bp",
479         ']b' => "next buffer\nunimpaired map for :bn",
480         '[B' => "first buffer\nunimpaired map for :br",
481         ']B' => "last buffer\nunimpaired map for :bl",
482         '[e' => "exchange line above\nunimpaired plugin",
483         ']e' => "exchange line belo<>w\nunimpaired plugin",
484         '[f' => "preced<>ing file alph<>abet<>ic<>al<>ly\nunimpaired plugin",
485         ']f' => "next file alph<>abet<>ic<>al<>ly\nunimpaired plugin",
486         '[l' => "previous loc<>at<>ion\nunimpaired map for :lp",
487         ']l' => "next loc<>ation\nunimpaired map for :lne",
488         '[L' => "first loc<>ation\nunimpaired map for :lr",
489         ']L' => "last loc<>ation\nunimpaired map for :lla",
490         '[^l'=> "next file in loc<>at<>ions\nunimpaired map for :lpf",
491         ']^l'=> "file back in loc<>at<>ions\nunimpaired map for :lnf",
492         '[n' => "previous conflict<>/hunk\nunimpaired plugin",
493         ']n' => "next confl<>ict<>/hunk\nunimpaired plugin",
494         '[o' => "enable option\nunimpaired plugin",
495         ']o' => "disable option\nunimpaired plugin",
496         'yo' => "toggle option\nunimpaired plugin",
497         '[q' => "previous quickfix\nunimpaired map for :cp",
498         ']q' => "next quickfix error\nunimpaired map for :cn",
499         '[Q' => "first quickfix\nunimpaired map for :cr",
500         ']Q' => "last quickfix error\nunimpaired map for :cla",
501         '[^q'=> "quickfix file b<>ack\nunimpaired map for :cpf",
502         ']^q'=> "next file in q<>uick<>f<>ix\nunimpaired map for :cnf",
503         '[t' => "previous tag\nunimpaired map for :tp",
504         ']t' => "next tag\nunimpaired map for :tn",
505         '[T' => "first tag\nunimpaired map for :tr",
506         ']T' => "last tag\nunimpaired map for :tl",
507         '[u' => "url encode\nunimpaired plugin",
508         ']u' => "url decode\nunimpaired plugin",
509         '[x' => "xml encode\nunimpaired plugin",
510         ']x' => "xml decode\nunimpaired plugin",
511         '[y' => "escape c str<>ing\nunimpaired plugin",
512         ']y' => "unescap<>e c str<>ing\nunimpaired plugin",
513
514         (map { ("d$_" => "delete to <alias>$_") } qw( g z [ ] )),
515         'dW' => 'delete <span style="font-variant:small-caps">word</span>',
516         'db' => 'delete <left> word',
517         'dB' => 'delete <left> <span style="font-variant:small-caps">word</span>',
518         'de' => 'delete word e<>nd',
519         'dE' => 'delete <span style="font-variant:small-caps">word</span> e<>nd',
520         'df' => 'delete to char<>acter',
521         'dF' => 'delete <left> to char<>acter',
522         'dG' => 'delete to line<>/eof',
523         'dH' => 'delete to top',
524         'dj' => 'delete <down> line',
525         'dk' => 'delete <up> line',
526         'dL' => 'delete to bottom',
527         'dM' => 'delete to middle',
528         'dn' => 'delete to next res<>ult',
529         'dN' => 'delete to prev res<>ult',
530         'dt' => 'delete upto ch<>ar<>acter',
531         'dT' => 'delete <left> upto ch<>ar<>acter',
532         'dw' => 'delete word',
533         'd,' => 'delete to prev ch<>ar<>acter',
534         'd;' => 'delete to next ch<>ar<>acter',
535         'd/' => 'delete to res<>ult',
536         'd?' => 'delete <left> to res<>ult',
537         'd`' => 'delete to mark',
538         "d'" => 'delete lines to m<>ark',
539         'd*' => 'delete to find',
540         'd#' => 'delete <left> to find',
541         'd%' => 'delete to line pct',
542         'd^' => 'delete to soft bol',
543         'd0' => 'delete to bol',
544         'd|' => 'delete to col<>umn',
545         'd{' => 'delete <left> par<>agr<>aph',
546         'd}' => 'delete rest of p<>ar<>agr<>aph',
547         'd(' => 'delete <left> senten<>ce',
548         'd)' => 'delete rest of s<>en<>ten<>ce',
549         'da' => 'delete area',
550         'di' => 'delete inner',
551         'dd' => 'delete line',
552         'do' => 'diff obtain',
553         'dp' => 'diff put',
554         'ds' => 'delete surr<>oun<>d<>ing',
555 },
556
557 mode => {
558         ''    => "normal mode",
559          g    => "extended commands (g)",
560          Z    => "quit commands",
561          z    => "additional commands (z)",
562         '['   => "backward search commands ([)",
563         ']'   => "forward search commands (])",
564         '^w'  => "window commands (ctrl-w)",
565         '^wg' => "extended window commands (ctrl-w g)",
566          v    => "visual mode",
567          vg   => "extended visual commands (v g)",
568          va   => "text object selection (v a/i)",
569 #        c    => "command-line mode",
570          i    => "insert mode",
571         'i^g' => "extended insert commands (i ctrl-g)",
572         'i^x' => "insert completion commands (i ctrl-x)",
573          d    => 'delete motions',
574 },
575
576 flag => {
577         g1 => ["info", "Info command: shows/does something without altering anything."],
578         g2 => ["motion", "Moves the cursor, or defines the range for an operator (<motion>)."],
579         g3 => ["positioning", "Other movement (jumps, window (re)positioning)."],
580         g4 => ["command", "Direct action command."],
581         g6 => ["ins mode", "Enters Insert or Replace mode."],
582         g7 => ["mode", "Enters a different mode."],
583         g8 => ["vis mode", "Enters Visual or Select mode."],
584         g9 => ["key cmd", "Additional key commands (click for overview)."],
585
586         arg => ["key<arg>", "Commands with a dot need a char argument afterwards."],
587         motion => ["key<motion>", "Requires a motion afterwards, operates between cursor and destination."],
588         'v6 new' => ["vim", "Not in original Vi (assessment incomplete)."],
589         'xcommentary xlion xsurround xunimpaired ext' => ["plugin", "Optional features provided by common plugins."],
590 },
591
592 def => {
593         '' => {
594                 '~' => "g4 undo",
595                 '!' => "g4 argm undo modec",
596                 '@' => "g4 arg undo",
597                 '#' => "g2 v6",
598                 '$' => "g2",
599                 '%' => "g2",
600                 '^' => "g2",
601                 '&' => "g4 undo",
602                 '*' => "g2 v6",
603                 '(' => 'g2',
604                 ')' => 'g2',
605                 '_' => "g2",
606                 '+' => "g2",
607                 '`' => "g2 arg",
608                 '0' => "g2",
609                 '^^'=> "g4",
610                 '-' => "g2",
611                 '=' => 'g4 argm undo',
612                 '?' => "g2 arg modec",
613                 ';' => "g2",
614                 ':' => "g4 modec",
615                 "'" => "g2 arg",
616                 '"' => 'g4 arg',
617                 '\\' => 'g9 arg',
618                 '^\\' => "g7 arg",
619                 ',' => "g2",
620                 '<' => "g4 argm undo",
621                 '.' => "g4 undo",
622                 '>' => "g4 argm undo",
623                 '/' => "g2 arg modec",
624                 '[' => "g9 arg mode[",
625                 '{' => "g2",
626                 ']' => "g9 arg mode]",
627                 '}' => "g2",
628                 '^]'=> "g3",
629                 '|' => "g2",
630
631                 'a' => "g6 undo modei",
632                 'A' => "g6 undo modei",
633                 '^a'=> "g4 undo",
634                 'b' => "g2",
635                 'B' => "g2",
636                 '^b'=> "g3",
637                 'c' => "g6 argm undo modei",
638                 'C' => "g6 undo modei",
639                 '^c'=> "g4",
640                 'd' => "g4 argm undo moded",
641                 'D' => "g4 undo",
642                 '^d'=> "g3",
643                 'e' => "g2",
644                 'E' => "g2",
645                 '^e'=> "g3",
646                 'f' => "g2 arg",
647                 'F' => "g2 arg",
648                 '^f'=> "g3",
649                 'g' => "g9 arg modeg",
650                 'G' => "g2",
651                 '^g'=> "g1",
652                 'h' => "g2",
653                 'H' => "g2",
654                 '^h'=> "=h",
655                 'i' => "g6 undo modei",
656                 'I' => "g6 undo modei",
657                 '^i'=> "g2 v6",
658                 'j' => "g2",
659                 'J' => "g4 undo",
660                 '^j'=> "=j",
661                 'k' => "g2",
662                 'K' => "g4",
663                 'l' => "g2",
664                 'L' => "g2",
665                 '^l'=> "g1",
666                 'm' => "g4 arg",
667                 'M' => "g2",
668                 '^m'=> "=+",
669                 'n' => "g2",
670                 'N' => "g2",
671                 '^n'=> "=j",
672                 'o' => "g6 undo modei",
673                 'O' => "g6 undo modei",
674                 '^o'=> "g2 v6",
675                 'p' => "g4 undo",
676                 'P' => "g4 undo",
677                 '^p'=> "=k",
678                 'q' => "g7 arg",
679                 'Q' => "g7",
680                 '^q'=> "g1", # or ^v
681                 'r' => "g4 arg undo",
682                 'R' => "g6 undo modei",
683                 '^r'=> "g4 undo v6",
684                 's' => "g6 undo modei",
685                 'S' => "g6 undo modei",
686                 '^s'=> "g1",
687                 't' => "g2 arg",
688                 'T' => "g2 arg",
689                 '^t'=> "g3",
690                 'u' => "g4 undo",
691                 'U' => "g4 undo",
692                 '^u'=> "g3",
693                 'v' => "g8 modev",
694                 'V' => "g8 modev",
695                 '^v'=> "g8 modev v6",
696                 'w' => "g2",
697                 'W' => "g2",
698                 '^w'=> "g9 arg mode^w",
699                 'x' => "g4 undo",
700                 'X' => "g4 undo",
701                 '^x'=> "g4 undo",
702                 'y' => "g4 argm",
703                 'Y' => "g4",
704                 '^y'=> "g3",
705                 'z' => "g9 arg modez",
706                 'Z' => "g9 arg modeZ",
707                 '^z'=> "g1",
708         }, # normal mode
709
710         g => {
711                 lead => "g",
712
713                 "\e"=> "g7 mode",
714
715                 '~' => "g4 argm v6",
716                 '@' => "g4 v7",
717                 '#' => "g2 v6",
718                 '$' => "g2",
719                 '^' => "g2 v6",
720                 '&' => "g4",
721                 '*' => "g2 v6",
722                 '_' => "g2 v6",
723                 '+' => "g4 v7",
724                 '`' => "g2 v6 arg",
725                 '8' => "g1",
726                 '0' => "g2 v6",
727                 '-' => "g4 v7",
728                 '^['=> "g7 mode",
729                 ']' => "g3",
730                 '^]'=> "g3",
731                 ';' => "g2",
732                 "'" => "g2 v6 arg",
733                 '<' => "g4 v7",
734                 '?' => "g4 argm v6",
735                 ',' => "g2",
736
737                 'a' => "g1",
738                 '^a'=> "g1",
739                 'c' => 'g4 argm xcommentary',
740                 'd' => "g2 v6",
741                 'D' => "g2 v6",
742                 'e' => "g2",
743                 'E' => "g2",
744                 'f' => "g4 v6",
745                 'F' => "g4 v7",
746                 'g' => "g2",
747                 '^g'=> "g1 vim6",
748                 'h' => "g8 modev",
749                 'H' => "g8 modev",
750                 '^h'=> "g8 modev v6",
751                 'i' => "g6 undo modei",
752                 'I' => "g6 undo modei",
753                 'j' => "g2 v6",
754                 'J' => "g4",
755                 'k' => "g2 v6",
756                 'l' => 'g3 argm arg xlion',
757                 'L' => 'g3 argm arg xlion',
758                 'm' => "g2 v6",
759                 'n' => "g8 v7 modev",
760                 'N' => "g8 v7 modev",
761                 'o' => "g2",
762                 'p' => "g4 undo",
763                 'P' => "g4",
764                 'q' => "g4 argm",
765                 'Q' => "g7 v6",
766                 'r' => "g4 arg",
767                 'R' => "g6 undo modei",
768                 's' => "g1 v6",
769                 't' => "g3 v7",
770                 'T' => "g3 v7",
771                 'u' => "g4 argm v6", # XXX undo?
772                 'U' => "g4 undo argm v6",
773                 'v' => 'g8 modev',
774                 'V' => "g4",
775                 'w' => "g4 argm v7",
776                 'x' => "g4 v7 ext",
777         }, # mode g
778
779         Z => {
780                 lead => "Z",
781
782                 "\e"=> "g7 mode",
783                 '^['=> "=\e",
784
785                 'Q' => "g4 v6",
786                 'Z' => "g4",
787         }, # mode Z
788
789         z => {
790                 lead => "z",
791
792                 "\e"=> "g7 mode",
793
794                 '^' => "g3",
795                 '+' => "g3",
796                 '-' => "g3",
797                 '=' => "g4 v7",
798                 '.' => "g3",
799                 '^['=> "=\e",
800
801                 'a' => "g4 v6 folding",
802                 'A' => "g4 v6 folding",
803                 'b' => "g3",
804                 'c' => "g4 v6 folding",
805                 'C' => "g4 v6 folding",
806                 'd' => "g4 v6 folding",
807                 'D' => "g4 v6 folding",
808                 'e' => "g3",
809                 'E' => "g4 v6 folding",
810                 'f' => "g4 argm v6 folding",
811                 'F' => "g4 v6 folding",
812                 'g' => "g4 v7",
813                 'G' => "g4 v7",
814                 'h' => "g3",
815                 'H' => "g3",
816                 'i' => "g4 v6 folding",
817                 'j' => "g2 v6 folding",
818                 'k' => "g2 v6 folding",
819                 'l' => "g3",
820                 'L' => "g3",
821                 '^m'=> "g3",
822                 'm' => "g4 v6 folding",
823                 'M' => "g4 v6 folding",
824                 'n' => "g4 v6 folding",
825                 'N' => "g4 v6 folding",
826                 'o' => "g4 v6 folding",
827                 'O' => "g4 v6 folding",
828                 'r' => "g4 v6 folding",
829                 'R' => "g4 v6 folding",
830                 's' => "g3",
831                 't' => "g3",
832                 'u' => "g4 arg v7",
833                 'v' => "g4 v6 folding",
834                 'w' => "g4 v7",
835                 'W' => "g4 v7",
836                 'x' => "g4 v6 folding",
837                 'X' => "g4 v6 folding",
838                 'z' => "g3",
839         }, # mode z
840
841         '[' => {
842                 lead => "[",
843
844                 "\e"=> "g7 mode",
845
846                 "`" => "g2 v6",
847                 '#' => "g2",
848                 '(' => "g2",
849                 '*' => "=[/",
850                 '/' => "g2",
851                 "'" => "=0[`^ g2 v6",
852                 '{' => "g2",
853                 '[' => "g2",
854                 '^['=> "=\e",
855                 ']' => "g2",
856
857                 'c' => "g2",
858                 'd' => "g1",
859                 'D' => "g4",
860                 '^d'=> "g3",
861                 'f' => "=gf",  # deprecated
862                 'i' => 'g1',
863                 'I' => 'g4',
864                 '^i'=> 'g3',
865                 'm' => "g2",
866                 'p' => "g4",
867                 'P' => "=[p",
868                 's' => "g3 v7",
869                 'S' => "g3 v7",
870                 'z' => "g2 v6 folding",
871
872                 'a' => "g3 xunimpaired",
873                 'A' => "g3 xunimpaired",
874                 'b' => "g3 xunimpaired",
875                 'B' => "g3 xunimpaired",
876                 'e' => "g4 xunimpaired",
877                 'l' => "g3 xunimpaired",
878                 'L' => "g3 xunimpaired",
879                 '^l'=> "g3 xunimpaired",
880                 '^l'=> "g3 xunimpaired",
881                 'f' => "g3 xunimpaired", # overrides native alias
882                 'n' => "g3 xunimpaired",
883                 'o' => "g9 arg xunimpaired",
884                 'q' => "g3 xunimpaired",
885                 'Q' => "g3 xunimpaired",
886                 '^q'=> "g3 xunimpaired",
887                 't' => "g3 xunimpaired",
888                 'T' => "g3 xunimpaired",
889                 'u' => "g4 argm xunimpaired",
890                 'x' => "g4 argm xunimpaired",
891                 'y' => "g4 argm xunimpaired",
892                 ' ' => "g4 xunimpaired",
893         }, # mode [
894
895         ']' => {
896                 lead => "]",
897
898                 "\e"=> "g7 mode",
899
900                 "`" => "g2 v6",
901                 '#' => "g2",
902                 ')' => "g2",
903                 '*' => "=]/",
904                 "'" => '=$]`^ g2 v6',
905                 '/' => "g2",
906                 '[' => "g2",
907                 '^['=> "=\e",
908                 ']' => "g2",
909                 '}' => "g2",
910
911                 'c' => "g2",
912                 'd' => "g1",
913                 'D' => "g4",
914                 '^d'=> "g3",
915                 'f' => "=gf",  # deprecated
916                 'i' => "g1",
917                 'I' => "g4",
918                 '^i'=> "g3",
919                 'm' => "g2",
920                 'p' => "g4",
921                 'P' => "=[p",
922                 's' => "g3 v7",
923                 'S' => "g3 v7",
924                 'z' => "g2 v6 folding",
925
926                 'a' => "g3 xunimpaired",
927                 'A' => "g3 xunimpaired",
928                 'b' => "g3 xunimpaired",
929                 'B' => "g3 xunimpaired",
930                 'e' => "g4 xunimpaired",
931                 'l' => "g3 xunimpaired",
932                 'L' => "g3 xunimpaired",
933                 '^l'=> "g3 xunimpaired",
934                 '^l'=> "g3 xunimpaired",
935                 'f' => "g3 xunimpaired", # overrides native alias
936                 'n' => "g3 xunimpaired",
937                 'o' => "g9 arg xunimpaired",
938                 'q' => "g3 xunimpaired",
939                 'Q' => "g3 xunimpaired",
940                 '^q'=> "g3 xunimpaired",
941                 't' => "g3 xunimpaired",
942                 'T' => "g3 xunimpaired",
943                 'u' => "g4 argm xunimpaired",
944                 'x' => "g4 argm xunimpaired",
945                 'y' => "g4 argm xunimpaired",
946                 ' ' => "g4 xunimpaired",
947         }, # mode ]
948
949         '^w' => {
950                 lead => "ŵ",
951
952                 "\e"=> "g7 mode",
953
954                 '<' => "g3",
955                 '>' => "g3",
956                 '^' => "g4",
957                 '_' => "g3",
958                 '+' => "g3",
959                 '-' => "g3",
960                 '=' => "g3",
961                 '^['=> "=\e",
962                 ']' => "g3",
963                 '}' => "g3",
964                 '|' => "g3",
965
966                 'b' => "g3",
967                 'c' => "g3",
968                 '^c'=> "g7 mode",
969                 'd' => "g3",
970                 'f' => "g4",
971                 'F' => "g4 v7",
972                 'g' => "g9 arg mode^wg",
973                 'h' => "g3",
974                 'H' => "g3",
975                 'i' => "g3",
976                 'j' => "g3",
977                 'J' => "g3",
978                 'k' => "g3",
979                 'K' => "g3",
980                 'l' => "g3",
981                 'L' => "g3",
982                 'n' => "g4",
983                 'o' => "g3",
984                 'p' => "g3",
985                 'P' => "g3",
986                 'q' => "g4",
987                 'r' => "g3",
988                 'R' => "g3",
989                 's' => "g3",
990                 'S' => "=^ws",
991                 't' => "g3",
992                 'T' => "g3 v7",
993                 'v' => "g3",
994                 'w' => "g3",
995                 'W' => "g3",
996                 'x' => "g3",
997                 'z' => "g3",
998         }, # mode ^w
999
1000         '^wg' => {
1001                 lead => "ŵg",
1002
1003                 "\e"=> "g7 mode",
1004                 '^['=> "=\e",
1005                 ']' => "g3",
1006                 '}' => "g3",
1007                 '^]'=> "g3",
1008                 'f' => "g4 v7",
1009                 'F' => "g4 v7",
1010         }, # mode ^w g
1011
1012         v => {
1013                 "\e"=> "g7 mode",
1014
1015                 '!' => "g4",
1016                 ':' => "g7 modec",
1017                 '<' => "g4",
1018                 '=' => 'g4 undo',
1019                 '>' => 'g4',
1020                 '~' => "g4 v6",
1021                 '^['=> "=\e",
1022                 '^]'=> "g3",
1023                 '^\\'=>'^\\',
1024
1025                 'a' => 'g9 modeva arg v6',
1026                 'A' => 'g6 modei v6',
1027                 '^a'=> 'g4 undo v8',
1028                 'c' => 'g6 modei v6',
1029                 'C' => 'g6 modei v6',
1030                 '^c'=> "g7 mode",
1031                 'd' => "g4 v6",
1032                 'D' => "g4 v6",
1033                 'g' => "g9 arg modevg",
1034                 '^g'=> "g8",
1035                 'i' => "g9 modeva arg v6",
1036                 'I' => "g6 modei v6", # block
1037                 'J' => "g4",
1038                 'K' => 'g4',
1039                 'o' => "g2",
1040                 'O' => "g2",
1041                 '^o'=> "g8",
1042                 'p' => 'g4',
1043                 'P' => 'g4',
1044                 'r' => 'g4 arg',
1045                 'R' => "=vS",  # "might change in future"
1046                 's' => "=vc",
1047                 'S' => 'g6 modei v6',
1048                 'u' => "g4 v6",
1049                 'U' => "g4 v6",
1050                 'v' => "g8",
1051                 'V' => "g8",
1052                 '^v'=> "g8 v6",
1053                 'x' => "=vd",
1054                 'X' => "=vD",
1055                 '^x'=> 'g4 undo v8',
1056                 'y' => "g4",
1057                 'Y' => "g4",
1058
1059                 (map { $_ => "=$_" } @motions, qw(
1060                         ^b ^d ^e ^f ^i m q ^q ^s ^u ^w ^y z ^z "
1061                 )), # a lot like normal mode
1062         }, # mode v
1063
1064         vg => {
1065                 lead => "g",
1066
1067                 "\e"=> "g8 modev",
1068
1069                 '^['=> "=\e",
1070                 '?' => "g4 v6",
1071                 '^a'=> 'g4 undo v8',
1072                 '^g' => "g1 vim6",
1073                 'c' => 'g4 xcommentary',
1074                 'J' => 'g4 v6',
1075                 'l' => 'g3 arg xlion',
1076                 'L' => 'g3 arg xlion',
1077                 'q' => "g4 v6",
1078                 'v' => "=gv",
1079                 'w' => 'g4 v7',
1080                 '^x'=> 'g4 undo v8',
1081         }, # mode v g
1082
1083         va => {
1084                 "\e"=> "g8 modev",
1085
1086                 '(' => "=vab",
1087                 ')' => "=vab",
1088                 '`' => "=va'",
1089                 "'" => 'g2 v7',
1090                 '"' => "=va'",
1091                 '<' => 'g2 v6',
1092                 '>' => "=va&lt;",
1093                 '[' => 'g2 v6',
1094                 '{' => "=vaB",
1095                 '^['=> "=\e",
1096                 ']' => "=va[",
1097                 '}' => "=vaB",
1098
1099                 'b' => 'g2 v6',
1100                 'B' => 'g2 v6',
1101                 'p' => 'g2 v6',
1102                 's' => 'g2 v6',
1103                 't' => 'g2 v7',
1104                 'w' => 'g2 v6',
1105                 'W' => 'g2 v6',
1106         }, # mode v a
1107
1108         #c => {
1109         #       desc => "command-line mode",
1110         #
1111         #       '^_' => "=i^_",
1112         #       '^^' => "=i^^",
1113         #       '^\\'=>'^\\',
1114         #       '^a' => "", #todo
1115         #       '^b' => "g3",
1116         #       '^c' => "=i^c",
1117         #       '^d' => "", #todo
1118         #       '^e' => "g3",
1119         #       '^h' => "=i^h",
1120         #       '^j' => "g4",
1121         #       '^k' => "=i^k",
1122         #       '^l' => "", #todo
1123         #       '^n' => "", #todo
1124         #       '^p' => "", #todo
1125         #       '^r' => "=i^r", # and then some...
1126         #            ## ["g4 arg v6"],
1127         #       '^q' => "=^q",
1128         #       '^u' => "=i^u",
1129         #       '^v' => "=i^v",
1130         #       '^w' => "=i^w",
1131         #       '^y' => "g4",
1132         #}, # mode c
1133
1134         i => {
1135                 "\e" => "g7 mode",
1136
1137                 '^@' => "g4",
1138                 '^^' => "g4 v6",
1139                 '^['=> "=\e",
1140                 '^]' => "g4 v6",
1141                 '^_' => "g4 v6",
1142                 '^\\'=>'^\\',
1143
1144                 '^a' => "g4 v6",
1145                 '^b' => "no v6",
1146                 '^c' => "g7 mode",
1147                 '^d' => 'g4',
1148                 '^e' => "g4 v6",
1149                 '^f' => 'g4',
1150                 '^g' => "g9 modei^g arg",
1151                 '^h' => "g4",
1152                 '^i' => "g4",
1153                 '^j' => "g4",
1154                 '^k' => 'g4 arg arg v6 linkdigraphs',
1155                 '^l' => "g7 mode v6",  # insertmode only
1156                 '^m' => "g4",
1157                 '^n' => "g2 v6",
1158                 '^o' => 'g4',
1159                 '^p' => "g2 v6",
1160                 '^q' => "=^q",  # or i^v
1161                 '^r' => 'g4 arg v6',
1162                 '^s' => "=^s",
1163                 '^t' => "g4",
1164                 '^u' => "g4",
1165                 '^v' => 'g4 linkcharset',
1166                 '^w' => "g4",
1167                 '^x' => 'g9 arg modei^x v6',
1168                 '^y' => "g4 v6",
1169                 '^z' => "g1 v6",  # insertmode only
1170         }, # modei
1171
1172         'i^g' => {
1173                 lead => "ĝ",
1174
1175                 "\e"=> 'g6 modei',
1176
1177                 'k' => 'g2',
1178                 'j' => 'g2',
1179                 's' => 'g4 arg xsurround',
1180                 'u' => 'g4',
1181                 'U' => 'g4 v8',
1182                 # other keys (even esc) are not recognized
1183         }, # mode i ^g
1184
1185         'i^x' => {
1186                 lead => "x̂",
1187
1188                 "\e" => "g7 mode", # yes, it really leaves insert mode
1189
1190                 '^['=> "=\e",
1191                 '^]' => 'g4',
1192                 '^d' => 'g4',
1193                 '^e' => "g3",
1194                 '^f' => 'g4',
1195                 '^i' => 'g4',
1196                 '^k' => 'g4',
1197                 '^l' => 'g4',
1198                 '^n' => 'g4',
1199                 '^o' => 'g4 v7',
1200                 '^p' => 'g4',
1201                 '^s' => 'g4',
1202                  's' => "=i^x^s",
1203                 '^t' => 'g4',
1204                 '^u' => 'g4 v7',
1205                 '^v' => 'g4',
1206                 '^y' => "g3",
1207         }, # mode i ^x
1208
1209         d => {
1210                 lead => "d",
1211
1212                 "\e"=> "g7 mode",
1213                 '^['=> "=\e",
1214
1215                 (map { $_ => 'g4' } @motions),
1216                 (map { $_ => 'g4 arg' } qw( f F t T ` ' / ? )), # @motions with option
1217                 (map { $_ => "=v$_" } qw( a i )), # motions from virtual
1218                 (map { $_ => "=$_" } qw( g z [ ]  \\ ^\\ ^q ^s ^z )),
1219
1220                 'd'  => 'g4',
1221                 'o'  => 'g5',
1222                 'p'  => 'g5',
1223                 's'  => 'g4 arg xsurround',
1224
1225                 'l'  => '=x',
1226                 'h'  => '=X',
1227                 '^h' => '=X',
1228                 '^j' => '=dj',
1229                 '^m' => '=dj',
1230                 '^n' => '=dj',
1231                 '+'  => '=dj',
1232                 '^p' => '=dk',
1233                 '-'  => '=dk',
1234                 '$'  => '=D',
1235                 '_'  => '=dd',
1236         }, # mode d
1237
1238         # TODO: mode/ (command-line)
1239         # XXX ex mode if you want to go completely wild
1240 },
1241 }