keyboard/altgr/index: move ctrl rows to distinct inventory mode
[sheet.git] / keyboard / 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.6,
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 mode => {
19         ''    => "normal mode",
20          g    => "extended commands (g)",
21          Z    => "quit commands",
22          z    => "additional commands (z)",
23         '['   => "backward search commands ([)",
24         ']'   => "forward search commands (])",
25         '^w'  => "window commands (ctrl-w)",
26         '^wg' => "extended window commands (ctrl-w g)",
27          v    => "visual mode",
28          vg   => "extended visual commands (v g)",
29          va   => "text object selection (v a/i)",
30 #        c    => "command-line mode",
31          i    => "insert mode",
32         'i^g' => "extended insert commands (i ctrl-g)",
33         'i^x' => "insert completion commands (i ctrl-x)",
34          d    => 'delete motions',
35 },
36
37 flag => {
38         g1 => ["info", "Info command: shows/does something without altering anything."],
39         g2 => ["motion", "Moves the cursor, or defines the range for an operator (<motion>)."],
40         g3 => ["positioning", "Other movement (jumps, window (re)positioning)."],
41         g4 => ["command", "Direct action command."],
42         g6 => ["ins mode", "Enters Insert or Replace mode."],
43         g7 => ["mode", "Enters a different mode."],
44         g8 => ["vis mode", "Enters Visual or Select mode."],
45         g9 => ["key cmd", "Additional key commands (click for overview)."],
46
47         arg => ["key<arg>", "Commands with a dot need a char argument afterwards."],
48         motion => ["key<motion>", "Requires a motion afterwards, operates between cursor and destination."],
49         'v6 new' => ["vim", "Not in original Vi (assessment incomplete)."],
50         'xcommentary xlion xsurround xunimpaired ext' => ["plugin", "Optional features provided by common plugins."],
51 },
52
53 def => {
54         '' => {
55                 '~' => ["g4 undo", "case toggle"],
56                 '!' => ["g4 argm undo modec", "filt<>er lines"],
57                 '@' => ["g4 arg undo", "play macro"],
58                 '#' => ["g2 v6", "rev. find word"],
59                 '$' => ["g2", "eol"],
60                 '%' => ["g2", "goto match"],
61                 '^' => ["g2", '"soft" bol'],
62                 '&' => ["g4 undo", ":s rep<>eat"],
63                 '*' => ["g2 v6", "find word"],
64                 '(' => ['g2', "begin senten<>ce"],
65                 ')' => ['g2', "end senten<>ce"],
66                 '_' => ["g2", '"soft" bol down'],
67                 '+' => ["g2", "next line"],
68                 '`' => ["g2 arg", "goto mark"],
69                 '0' => ["g2", '"hard" bol'],
70                 '^^'=> ["g4", "edit alt. file"],
71                 '-' => ["g2", "prev line"],
72                 '=' => ['g4 argm undo', "re<>ind<>ent"],
73                 '?' => ["g2 arg modec", "find rev."],
74                 ';' => ["g2", "repeat t/f/T/F"],
75                 ':' => ["g4 modec", "ex cmd line"],
76                 "'" => ["g2 arg", "goto mark bol"],
77                 '"' => ['g4 arg', "use reg<>ister"],
78                 '\\' => ['g9 arg', "reser<>ved"],
79                 '^\\' => ["g7 arg", "to mode/<>ext<>ens<>ion<>s"],
80                 ',' => ["g2", "reverse t/T/f/F"],
81                 '<' => ["g4 argm undo", "un<>ind<>ent"],
82                 '.' => ["g4 undo", "repeat last cmd"],
83                 '>' => ["g4 argm undo", "ind<>ent"],
84                 '/' => ["g2 arg modec", "find"],
85                 '[' => ["g9 arg mode[", "move back<>ward<>s"],
86                 '{' => ["g2", "begin parag."],
87                 ']' => ["g9 arg mode]", "move forw<>ard"],
88                 '}' => ["g2", "end parag."],
89                 '^]'=> ["g3", "go to tag"],
90                 '|' => ["g2", "goto (1st) col"],
91
92                 'a' => ["g6 undo modei", "app<>end"],
93                 'A' => ["g6 undo modei", "app<>end to eol"],
94                 '^a'=> ["g4 undo", "incr<>ement\nAdd one"],
95                 'b' => ["g2", "prev word\nBack"],
96                 'B' => ["g2", 'prev <span style="font-variant:small-caps">word</span>'],
97                 '^b'=> ["g3", "page up"],
98                 'c' => ["g6 argm undo modei", "chan<>ge"],
99                 'C' => ["g6 undo modei", "chan<>ge to eol"],
100                 '^c'=> ["g4", "abort"],
101                 'd' => ["g4 argm undo moded", "del<>ete"],
102                 'D' => ["g4 undo", "delete to eol"],
103                 '^d'=> ["g3", "scroll down"],
104                 'e' => ["g2", "end word"],
105                 'E' => ["g2", 'end <span style="font-variant:small-caps">word</span>'],
106                 '^e'=> ["g3", "window down\nExtra line"],
107                 'f' => ["g2 arg", "fwd to char"],
108                 'F' => ["g2 arg", "back<>wd to char"],
109                 '^f'=> ["g3", "page down\npage Forward"],
110                 'g' => ["g9 arg modeg", "extra cmds"],
111                 'G' => ["g2", "eof/<>goto ln"],
112                 '^g'=> ["g1", ":file (info)"],
113                 'h' => ["g2", "<left>"],
114                 'H' => ["g2", "screen top\nHome row"],
115                 '^h'=> \'h',
116                 'i' => ["g6 undo modei", "insert mode"],
117                 'I' => ["g6 undo modei", "insert at bol"],
118                 '^i'=> ["g2 v6", "jump to newer\nIncrease position"],
119                 'j' => ["g2", "<down>"],
120                 'J' => ["g4 undo", "join lines"],
121                 '^j'=> \'j',
122                 'k' => ["g2", "<up>"],
123                 'K' => ["g4", "help\nlooKup Keyword"],
124                 'l' => ["g2", "<right>"],
125                 'L' => ["g2", "screen bottom\nLowermost Line"],
126                 '^l'=> ["g1", "redraw"],
127                 'm' => ["g4 arg", "set mark"],
128                 'M' => ["g2", "screen mid<>dle"],
129                 '^m'=> \'+',
130                 'n' => ["g2", "next find"],
131                 'N' => ["g2", "prev find"],
132                 '^n'=> \'j',
133                 'o' => ["g6 undo modei", "line below\nOpen"],
134                 'O' => ["g6 undo modei", "line above"],
135                 '^o'=> ["g2 v6", "jump to older"],
136                 'p' => ["g4 undo", "paste after"],
137                 'P' => ["g4 undo", "paste before"],
138                 '^p'=> \'k',
139                 'q' => ["g7 arg", "rec<>ord macro\nQueue seQuence"],
140                 'Q' => ["g7", "ex mode"],
141                 '^q'=> ["g1", "(xon)\nQome back"], # or ^v
142                 'r' => ["g4 arg undo", "repl<>ace char"],
143                 'R' => ["g6 undo modei", "repl<>ace mode"],
144                 '^r'=> ["g4 undo v6", "redo"],
145                 's' => ["g6 undo modei", "subst char"],
146                 'S' => ["g6 undo modei", "subst line"],
147                 '^s'=> ["g1", "(xoff)\nStop"],
148                 't' => ["g2 arg", "till char"],
149                 'T' => ["g2 arg", "back till char"],
150                 '^t'=> ["g3", "back tag"], # backtrag :P
151                 'u' => ["g4 undo", "undo"],
152                 'U' => ["g4 undo", "undo line"],
153                 '^u'=> ["g3", "scroll up"],
154                 'v' => ["g8 modev", "visual mode"],
155                 'V' => ["g8 modev", "visual lines"],
156                 '^v'=> ["g8 modev v6", "visual block"],
157                 'w' => ["g2", "next word"],
158                 'W' => ["g2", 'next <span style="font-variant:small-caps">word</span>'],
159                 '^w'=> ["g9 arg mode^w", "win<>dow cmds"],
160                 'x' => ["g4 undo", "delete char"],
161                 'X' => ["g4 undo", "back<>space"],
162                 '^x'=> ["g4 undo", "subs<>tract"],
163                 'y' => ["g4 argm", "yank\n(copy)"],
164                 'Y' => ["g4", "yank line"],
165                 '^y'=> ["g3", "window up\nYield"],
166                 'z' => ["g9 arg modez", "extra cmds"],
167                 'Z' => ["g9 arg modeZ", "quit"],
168                 '^z'=> ["g1", ":sus<>pend\nzzz (as in sleep)"],
169         }, # normal mode
170
171         g => {
172                 lead => "g",
173
174                 "\e"=> ["g7 mode", "normal mode"],
175
176                 '~' => ["g4 argm v6", "case toggl<>e"],
177                 '@' => ["g4 v7", "oper<>at<>or<>func"],
178                 '#' => ["g2 v6", "rev. find string"],
179                 '$' => ["g2", "virt<>ual eol"],
180                 '^' => ["g2 v6", qq'"soft" bol v<>irt<>ual'],
181                 '&' => ["g4", ":s rep<>eat glob<>al<>ly\nGlobal substitute"],
182                 '*' => ["g2 v6", "find string"],
183                 '_' => ["g2 v6", qq'"soft" eol'],
184                 '+' => ["g4 v7", "later undo"],
185                 '`' => ["g2 v6 arg", "to mark keepj<>umps"],
186                 '8' => ["g1", "char hex val<>ue<>s"],
187                 '0' => ["g2 v6", "virtual bol"],
188                 '-' => ["g4 v7", "earlier undo"],
189                 '^['=> ["g7 mode"],
190                 ']' => ["g3", "go to tselect"],
191                 '^]'=> ["g3", "go to tjump"],
192                 ';' => ["g2", "to prev change pos"],
193                 "'" => ["g2 v6 arg", "to mark keepj<>umps"],
194                 '<' => ["g4 v7", "see prev cmd output"],
195                 '?' => ["g4 argm v6", "rot13 encode"],
196                 ',' => ["g2", "to next change pos"],
197
198                 'a' => ["g1", "char value\nGet Ascii value"],
199                 '^a'=> ["g1", "mem usage stats"],
200                 'd' => ["g2 v6", "local declar<>ation"],
201                 'D' => ["g2 v6", "global declar<>ation"],
202                 'e' => ["g2", "back to word end"],
203                 'E' => ["g2", qq'back to <span style="font-variant:small-caps">word</span> end'],
204                 'f' => ["g4 v6", "edit file at cur<>sor\nGoto File"],
205                 'F' => ["g4 v7", "edit file + jump"],
206                 'g' => ["g2", "first line"],
207                 '^g'=> ["g1 vim6", "cur<>sor pos info"],
208                 'h' => ["g8 modev", "select mode\nGet Highlighted"],
209                 'H' => ["g8 modev", "select lines\nGet Highlighted"],
210                 '^h'=> ["g8 modev v6", "select block\nGet Highlighted"],
211                 'i' => ["g6 undo modei", "insert at last pos"],
212                 'I' => ["g6 undo modei", "insert at soft bol"],
213                 'j' => ["g2 v6", "<down> screen"],
214                 'J' => ["g4", "join leave spac<>ing"],
215                 'k' => ["g2 v6", "<up> screen"],
216                 'm' => ["g2 v6", "cen<>ter screen"],
217                 'n' => ["g8 v7 modev", "select next find"],
218                 'N' => ["g8 v7 modev", "select prev find"],
219                 'o' => ["g2", ":goto (byte)"],
220                 'p' => ["g4 undo", "paste still"],
221                 'P' => ["g4", "paste before still"],
222                 'q' => ["g4 argm", "for<>mat"],
223                 'Q' => ["g7 v6", "ex mode manual :"],
224                 'r' => ["g4 arg", "virt. repl<>ace char"],
225                 'R' => ["g6 undo modei", "virt. repl<>ace mode"],
226                 's' => ["g1 v6", "sleep\nGo to Sleep"],
227                 't' => ["g3 v7", "next tab\nGoto Tab"],
228                 'T' => ["g3 v7", "tab back"],
229                 'u' => ["g4 argm v6", "lower<>case"], # XXX undo?
230                 'U' => ["g4 undo argm v6", "up<>per<>case"],
231                 'v' => ['g8 modev', "prev<>ious highl<>ight\nprecedinG Visual"],
232                 'V' => ["g4", "avoid resel<>ect<>ion"],
233                 'w' => ["g4 argm v7", "for<>mat still"],
234                 'x' => ["g4 v7 ext", "Netrw<>BrowseX"],
235
236                 # plugins
237                 'c' => ['g4 argm xcommentary', "(un)<>com<>ment\ncommentary or tComment plugin"],
238                 'l' => ['g3 argm arg xlion', "align to left\nlion plugin, also good for easy-align"],
239                 'L' => ['g3 argm arg xlion', "align to right\nlion plugin"],
240         }, # mode g
241
242         Z => {
243                 lead => "Z",
244
245                 "\e"=> ["g7 mode", "normal mode"],
246                 '^['=> \"Z\e",
247
248                 'Q' => ["g4 v6", " :q! (force)"],
249                 'Z' => ["g4", " :wq (write)"],
250         }, # mode Z
251
252         z => {
253                 lead => "z",
254
255                 "\e"=> ["g7 mode", "normal mode"],
256
257                 '^' => ["g3", "page above"],
258                 '+' => ["g3", "page below"],
259                 '-' => ["g3", "line at bottom bol\ndon't (-) see any further"],
260                 '=' => ["g4 v7", "sug<>gest spell<>ing"],
261                 '.' => ["g3", "line at center bol"],
262                 '^['=> \"z\e",
263
264                 'a' => ["g4 v6 folding", "toggle fold"],
265                 'A' => ["g4 v6 folding", "toggle fold rec<>urs<>ive<>ly"],
266                 'b' => ["g3", "line at bot. bol"],
267                 'c' => ["g4 v6 folding", "close fold"],
268                 'C' => ["g4 v6 folding", "close folds rec<>curs<>ive<>ly"],
269                 'd' => ["g4 v6 folding", "delete fold"],
270                 'D' => ["g4 v6 folding", "delete folds rec<>urs<>ive"],
271                 'e' => ["g3", "cursor at right side"],
272                 'E' => ["g4 v6 folding", "elimi<>nate f<>olds"],
273                 'f' => ["g4 argm v6 folding", "create fold"],
274                 'F' => ["g4 v6 folding", "fold lines"],
275                 'g' => ["g4 v7", "add spell<>ing\nGood word"],
276                 'G' => ["g4 v7", "temp spell<>ing"],
277                 'h' => ["g3", "scroll <left>"],
278                 'H' => ["g3", "scroll <left> half scr<>een"],
279                 'i' => ["g4 v6 folding", "toggle all folds"],
280                 'j' => ["g2 v6 folding", "next fold start"],
281                 'k' => ["g2 v6 folding", "prev fold end"],
282                 'l' => ["g3", "scroll <right>"],
283                 'L' => ["g3", "scroll <right> half scr<>een"],
284                 '^m'=> ["g3", "line at top bol"],
285                 'm' => ["g4 v6 folding", "fold more"],
286                 'M' => ["g4 v6 folding", "close all folds"],
287                 'n' => ["g4 v6 folding", "fold none"],
288                 'N' => ["g4 v6 folding", "fold norm<>al"],
289                 'o' => ["g4 v6 folding", "open fold"],
290                 'O' => ["g4 v6 folding", "open folds rec<>urs<>ive<>ly"],
291                 'r' => ["g4 v6 folding", "reduce folding"],
292                 'R' => ["g4 v6 folding", "open all folds"],
293                 's' => ["g3", "cursor at left side"],
294                 't' => ["g3", "line at top"],
295                 'u' => ["g4 arg v7", "undo spell<>ing"],
296                 'v' => ["g4 v6 folding", "unfold cursor line"],
297                 'w' => ["g4 v7", "add missp<>ell<>ing\nWrong word"],
298                 'W' => ["g4 v7", "temp missp<>ell<>ing"],
299                 'x' => ["g4 v6 folding", "update folds"],
300                 'X' => ["g4 v6 folding", "re<>apply f<>olds"],
301                 'z' => ["g3", "line at center\nZee Zenter (with a funny accent)"],
302         }, # mode z
303
304         '[' => {
305                 lead => "[",
306
307                 "\e"=> ["g7 mode", "normal mode"],
308
309                 '`' => ["g2 v6", "previous lc mark"],
310                 '#' => ["g2", "previous open #if<>/#else"],
311                 '(' => ["g2", "previous open ("],
312                 '*' => \'[/',
313                 '/' => ["g2", "start of C com<>m<>ent"],
314                 "'" => ["g2 v6", \"0[`^"],
315                 '{' => ["g2", => "previous open {"],
316                 '[' => ["g2", "section back<>ward<>s"],
317                 '^['=> \"[\e",
318                 ']' => ["g2", qq'<span style="font-variant:small-caps">section</span> back<>ward<>s'],
319
320                 'c' => ["g2", "start of change backw<>ards"],
321                 'd' => ["g1", "define line"],
322                 'D' => ["g4", "defin<>ition"],
323                 '^d'=> ["g3", "to defin<>it<>ion"],
324                 'i' => ['g1', "first occur<>renc<>e line"],
325                 'I' => ['g4', "first occur<>renc<>e"],
326                 '^i'=> ['g3', "to first occur<>renc<>e"],
327                 'm' => ["g2", "start of funct<>ion"],
328                 'p' => ["g4", "P reind<>ent<>ed"],
329                 'P' => \"[p",
330                 's' => ["g3 v7", "last missp<>ell<>ing"],
331                 'S' => ["g3 v7", "last bad word"],
332                 'z' => ["g2 v6 folding", "start of open fold"],
333
334                 # unimpaired
335                 'a' => ["g3 xunimpaired", "prev<>ious file\nunimpaired map for :prev"],
336                 'A' => ["g3 xunimpaired", "first file\nunimpaired map for :rew"],
337                 'b' => ["g3 xunimpaired", "prev<>ious buffer\nunimpaired map for :bp"],
338                 'B' => ["g3 xunimpaired", "first buffer\nunimpaired map for :br"],
339                 'e' => ["g4 xunimpaired", "exchange line above\nunimpaired plugin"],
340                 'f' => \'gf',  # deprecated
341                 'f' => ["g3 xunimpaired", "preced<>ing file alph<>abet<>ic<>al<>ly\nunimpaired plugin"], # overrides native alias
342                 'l' => ["g3 xunimpaired", "previous loc<>at<>ion\nunimpaired map for :lp"],
343                 'L' => ["g3 xunimpaired", "first loc<>ation\nunimpaired map for :lr"],
344                 '^l'=> ["g3 xunimpaired", "next file in loc<>at<>ions\nunimpaired map for :lpf"],
345                 'n' => ["g3 xunimpaired", "previous conflict<>/hunk\nunimpaired plugin"],
346                 'o' => ["g9 arg xunimpaired", "enable option\nunimpaired plugin"],
347                 #'p' => ["g4 xunimpaired", "linewise paste before"],
348                 'q' => ["g3 xunimpaired", "previous quickfix\nunimpaired map for :cp"],
349                 'Q' => ["g3 xunimpaired", "first quickfix\nunimpaired map for :cr"],
350                 '^q'=> ["g3 xunimpaired", "quickfix file b<>ack\nunimpaired map for :cpf"],
351                 't' => ["g3 xunimpaired", "previous tag\nunimpaired map for :tp"],
352                 'T' => ["g3 xunimpaired", "first tag\nunimpaired map for :tr"],
353                 'u' => ["g4 argm xunimpaired", "url encode\nunimpaired plugin"],
354                 'x' => ["g4 argm xunimpaired", "xml encode\nunimpaired plugin"],
355                 'y' => ["g4 argm xunimpaired", "escape c str<>ing\nunimpaired plugin"],
356                 ' ' => ["g4 xunimpaired", 'prepend blank l<>in<>e<>s'],
357         }, # mode [
358
359         ']' => {
360                 lead => "]",
361
362                 "\e"=> ["g7 mode", "normal mode"],
363
364                 '`' => ["g2 v6", "next lc mark"],
365                 '#' => ["g2", "next open #endif<>/#else"],
366                 ')' => ["g2", "next open )"],
367                 '*' => \']/',
368                 "'" => ["g2 v6", \'$]`^'],
369                 '/' => ["g2", "end of C com<>m<>ent"],
370                 '[' => ["g2", qq'<span style="font-variant:small-caps">section</span> forw<>ard'],
371                 '^['=> \"]\e",
372                 ']' => ["g2", "section forw<>ard"],
373                 '}' => ["g2", "next open }"],
374
375                 'c' => ["g2", "start of change forw<>ards"],
376                 'd' => ["g1", "next define line"],
377                 'D' => ["g4", "next define"],
378                 '^d'=> ["g3", "to next define"],
379                 'f' => \'gf',  # deprecated
380                 'i' => ["g1", "next occur<>renc<>e line"],
381                 'I' => ["g4", "next occur<>renc<>e"],
382                 '^i'=> ["g3", "to occur<>renc<>e"],
383                 'm' => ["g2", "end of funct<>ion"],
384                 'p' => ["g4", "p reind<>ent<>ed"],
385                 'P' => \'[p',
386                 's' => ["g3 v7", "next missp<>ell<>ing"],
387                 'S' => ["g3 v7", "next bad word"],
388                 'z' => ["g2 v6 folding", "end of open fold"],
389
390                 # unimpaired
391                 'a' => ["g3 xunimpaired", "next file\nunimpaired map for :n"],
392                 'A' => ["g3 xunimpaired", "last file\nunimpaired map for :la"],
393                 'b' => ["g3 xunimpaired", "next buffer\nunimpaired map for :bn"],
394                 'B' => ["g3 xunimpaired", "last buffer\nunimpaired map for :bl"],
395                 'e' => ["g4 xunimpaired", "exchange line belo<>w\nunimpaired plugin"],
396                 'f' => ["g3 xunimpaired", "next file alph<>abet<>ic<>al<>ly\nunimpaired plugin"], # overrides native alias
397                 'l' => ["g3 xunimpaired", "next loc<>ation\nunimpaired map for :lne"],
398                 'L' => ["g3 xunimpaired", "last loc<>ation\nunimpaired map for :lla"],
399                 '^l'=> ["g3 xunimpaired", "file back in loc<>at<>ions\nunimpaired map for :lnf"],
400                 'n' => ["g3 xunimpaired", "next confl<>ict<>/hunk\nunimpaired plugin"],
401                 'o' => ["g9 arg xunimpaired", "disable option\nunimpaired plugin"],
402                 'q' => ["g3 xunimpaired", "next quickfix error\nunimpaired map for :cn"],
403                 'Q' => ["g3 xunimpaired", "last quickfix error\nunimpaired map for :cla"],
404                 '^q'=> ["g3 xunimpaired", "next file in q<>uick<>f<>ix\nunimpaired map for :cnf"],
405                 't' => ["g3 xunimpaired", "next tag\nunimpaired map for :tn"],
406                 'T' => ["g3 xunimpaired", "last tag\nunimpaired map for :tl"],
407                 'u' => ["g4 argm xunimpaired", "url decode\nunimpaired plugin"],
408                 'x' => ["g4 argm xunimpaired", "xml decode\nunimpaired plugin"],
409                 'y' => ["g4 argm xunimpaired", "unescap<>e c str<>ing\nunimpaired plugin"],
410                 ' ' => ["g4 xunimpaired", 'add blank l<>in<>e<>s bel<>ow'],
411         }, # mode ]
412
413         '^w' => {
414                 lead => "ŵ",
415
416                 "\e"=> ["g7 mode", "normal mode"],
417
418                 '<' => ["g3", => "width decr<>ease"],
419                 '>' => ["g3", => "width incr<>ease"],
420                 '^' => ["g4", => "split, edit alt file"],
421                 '_' => ["g3", => "set height"],
422                 '+' => ["g3", => "height incr<>ease"],
423                 '-' => ["g3", => "height decr<>ease"],
424                 '=' => ["g3", => "same height"],
425                 '^['=> \"^w\e",
426                 ']' => ["g3", => "split, to tag"],
427                 '}' => ["g3", => "pre<>view tag"],
428                 '|' => ["g3", => "set width"],
429
430                 'b' => ["g3", => "go to bot<>tom"],
431                 'c' => ["g3", => ":close"],
432                 '^c'=> ["g7 mode", "abort"],
433                 'd' => ["g3", => "split, to def<>inition"],
434                 'f' => ["g4", => "split, file edit"],
435                 'F' => ["g4 v7", => "^wf, jump to line"],
436                 'g' => ["g9 arg mode^wg", => "extra cmds"],
437                 'h' => ["g3", => "go left"],
438                 'H' => ["g3", => "move far left"],
439                 'i' => ["g3", => "split, to decl of id<>ent<>ifier"],
440                 'j' => ["g3", => "go down"],
441                 'J' => ["g3", => "move to bottom"],
442                 'k' => ["g3", => "go up"],
443                 'K' => ["g3", => "move to top"],
444                 'l' => ["g3", => "go right"],
445                 'L' => ["g3", => "move far right"],
446                 'n' => ["g4", => "open new"],
447                 'o' => ["g3", => ":only current"],
448                 'p' => ["g3", => "go to prev<>ious"],
449                 'P' => ["g3", => "go to pre<>view"],
450                 'q' => ["g4", => ":quit current"],
451                 'r' => ["g3", => "rotate down<>ward<>s"],
452                 'R' => ["g3", => "rotate up<>ward<>s"],
453                 's' => ["g3", => "split horiz<>ont<>al<>ly"],
454                 'S' => \'^ws',
455                 't' => ["g3", => "go to top"],
456                 'T' => ["g3 v7", => "to tab"],
457                 'v' => ["g3", => "split vert<>ic<>al<>ly"],
458                 'w' => ["g3", => "go to next\nWrap around"],
459                 'W' => ["g3", => "go above<>/left"],
460                 'x' => ["g3", => "ex<>chan<>ge"],
461                 'z' => ["g3", => "close pre<>view"],
462         }, # mode ^w
463
464         '^wg' => {
465                 lead => "ŵg",
466
467                 "\e"=> ["g7 mode", "normal mode"],
468                 '^['=> \"^wg\e",
469                 ']' => ["g3", => "split, :ts<>elect"],
470                 '}' => ["g3", => ":ptj<>ump to tag"],
471                 '^]'=> ["g3", "split, :tj<>ump"],
472                 'f' => ["g4 v7", => "file in tab"],
473                 'F' => ["g4 v7", => "^wgf, to line<>nr"],
474         }, # mode ^w g
475
476         v => {
477                 "\e"=> ["g7 mode", "normal mode"],
478
479                 '!' => ["g4", "external filter"],
480                 ':' => ["g7 modec", "cmd on range"],
481                 '<' => ["g4", "un<>indent"],
482                 '=' => ['g4 undo', "re<>ind<>ent"],
483                 '>' => ['g4', "ind<>ent"],
484                 '~' => ["g4 v6", "toggle case"],
485                 '^['=> \"v\e",
486                 '^]'=> ["g3", "jump to tag"],
487                 '^\\'=>\'^\\',
488
489                 'a' => ['g9 modeva arg v6', "ex<>tend area"],
490                 'A' => ['g6 modei v6', "ap<>pend to block"], # block
491                 '^a'=> ['g4 undo v8', "incr<>ement num<>bers"],
492                 'c' => ['g6 modei v6', "repl<>ace area"],
493                 'C' => ['g6 modei v6', "repl<>ace full lines"], # like vS, but blocks are extended until eol
494                 '^c'=> ["g7 mode", "abort"],
495                 'd' => ["g4 v6", "delete area"],
496                 'D' => ["g4 v6", "delete lines"],
497                 'g' => ["g9 arg modevg", "extra cmds"],
498                 '^g'=> ["g8", "select mode"],
499                 'i' => ["g9 modeva arg v6", "extend inner a<>r<>ea"],
500                 'I' => ["g6 modei v6", "insert to block"], # block
501                 'J' => ["g4", "join lines"],
502                 'K' => ['g4', "help sel<>ect<>ion"],
503                 'o' => ["g2", "to other corner"],
504                 'O' => ["g2", "to other side"],
505                 '^o'=> ["g8", "visual once"], # select
506                 'p' => ['g4', "repl<>ace w/ paste"],
507                 'P' => ['g4', "repl<>ace w/ paste"],
508                 'r' => ['g4 arg', "fill up w/ ch<>ar"],
509                 'R' => \'vS',  # "might change in future"
510                 's' => \'vc',
511                 'S' => ['g6 modei v6', "repl<>ace lines"],
512                 'u' => ["g4 v6", "lower<>case"],
513                 'U' => ["g4 v6", "upper<>case"],
514                 'v' => ["g8", "char<>wise"],
515                 'V' => ["g8", "line<>wise"],
516                 '^v'=> ["g8 v6", "block<>wise"],
517                 'x' => \'vd',
518                 'X' => \'vD',
519                 '^x'=> ['g4 undo v8', "decr<>ement num<>bers"],
520                 'y' => ["g4", "yank area"],
521                 'Y' => ["g4", "yank lines"],
522
523                 (map { $_ => \$_ } @motions, qw(
524                         ^b ^d ^e ^f ^i m q ^q ^s ^u ^w ^y z ^z "
525                 )), # a lot like normal mode TODO
526         }, # mode v
527
528         'vg' => {
529                 lead => "g",
530
531                 "\e"=> ["g8 modev", "visual mode"],
532
533                 '^['=> \"vg\e",
534                 '?' => ["g4 v6", => "rot13 encode"],
535                 '^a'=> ['g4 undo v8', "seq. incr<>ement"],
536                 '^g' => ["g1 vim6", "count region info"],
537                 'J' => ['g4 v6', => "join literal<>ly"],
538                 'q' => ["g4 v6", => "for<>mat"],
539                 'v' => \'gv',
540                 'w' => ['g4 v7', => "for<>mat still"],
541                 '^x'=> ['g4 undo v8', "seq. decr<>ement"],
542
543                 # plugins
544                 'c' => ['g4 xcommentary', => "(un)<>com<>ment\ncommentary or tComment plugin"],
545                 'l' => ['g3 arg xlion', => "align to left\nlion plugin, also good for easy-align"],
546                 'L' => ['g3 arg xlion', => "align to right\nlion plugin"],
547         }, # mode v g
548
549         va => {
550                 "\e"=> ["g8 modev", "visual mode"],
551
552                 '(' => \'vab',
553                 ')' => \'vab',
554                 '`' => \"va'",
555                 "'" => ['g2 v7', "quoted string"],
556                 '"' => \"va'",
557                 '<' => ['g2 v6', => "&lt;&gt; block"],
558                 '>' => \'va<',
559                 '[' => ['g2 v6', => "[] block"],
560                 '{' => \'vaB',
561                 '^['=> \"va\e",
562                 ']' => \'va[',
563                 '}' => \'vaB',
564
565                 'b' => ['g2 v6', => "() block"],
566                 'B' => ['g2 v6', => "{} Block"],
567                 'p' => ['g2 v6', => "para<>graph"],
568                 's' => ['g2 v6', => "senten<>ce"],
569                 't' => ['g2 v7', => "xml tag block"],
570                 'w' => ['g2 v6', => "word"],
571                 'W' => ['g2 v6', => '<span style="font-variant:small-caps">word</span>'],
572         }, # mode v a
573
574         #c => {
575         #       desc => "command-line mode",
576         #
577         #       '^_' => \"i^_",
578         #       '^^' => \"i^^",
579         #       '^\\'=>'^\\',
580         #       '^a' => ["", "complete"], #todo
581         #       '^b' => ["g3", "bol"],
582         #       '^c' => \"i^c",
583         #       '^d' => ["", "complete"], #todo
584         #       '^e' => ["g3", "eol"],
585         #       '^h' => \"i^h",
586         #       '^j' => ["g4", "execute cmd"],
587         #       '^k' => \"i^k",
588         #       '^l' => ["", "complete"], #todo
589         #       '^n' => ["", "complete"], #todo
590         #       '^p' => ["", "complete"], #todo
591         #       '^r' => \'i^r', # and then some...
592         #            ## ["g4 arg v6", "insert register"],
593         #       '^q' => \"^q",
594         #       '^u' => \"i^u",
595         #       '^v' => \"i^v",
596         #       '^w' => \"i^w",
597         #       '^y' => ["g4", "selec<>tion to clip<>b<>oard"],
598         #}, # mode c
599
600         i => {
601                 "\e" => ["g7 mode", "normal mode"],
602
603                 '^@' => ["g4", => "last insert"],
604                 '^^' => ["g4 v6", => "toggle :lmap usag<>e"],
605                 '^[' => \"i\e",
606                 '^]' => ["g4 v6", => "abbrev<>iate"],
607                 '^_' => ["g4 v6", => "toggle lang<>uage"],
608                 '^\\'=>\'^\\',
609
610                 '^a' => ["g4 v6", => "insert prev<>ious"],
611                 '^b' => ["no v6", => "former i^_"],
612                 '^c' => ["g7 mode", => "abort, no abbr"],
613                 '^d' => ['g4', => "un<>ind<>ent"],
614                 '^e' => ["g4 v6", => "ins char below"],
615                 '^f' => ['g4', => "set indent<>ation"],
616                 '^g' => ["g9 modei^g arg", => "extra cmds"],
617                 '^h' => ["g4", => "back<>space"],
618                 '^i' => ["g4", => "tab"],
619                 '^j' => ["g4", => "enter"],
620                 '^k' => ['g4 arg arg v6 linkdigraphs', => "di<>graph\nKey code"],
621                 '^l' => ["g7 mode v6", => "<em>im</em> leave ins mode"],  # insertmode only
622                 '^m' => ["g4", => "enter"],
623                 '^n' => ["g2 v6", => "find next keyword"],
624                 '^o' => ['g4', => "exec<>ute cmd"],
625                 '^p' => ["g2 v6", => "find prev keyword"],
626                 '^q' => \'^q',  # or i^v
627                 '^r' => ['g4 arg v6', "insert reg<>ister"],
628                 '^s' => \'^s',
629                 '^t' => ["g4", => "indent"],
630                 '^u' => ["g4", => "delete line"],
631                 '^v' => ['g4 linkcharset', => "literal or ch<>ar<>cod<>e\nVerbatim or by Value"],
632                 '^w' => ["g4", => "delete word back"],
633                 '^x' => ['g9 arg modei^x v6', => "ex<>pand mode"],
634                 '^y' => ["g4 v6", => "ins char above"],
635                 '^z' => ["g1 v6", => ":sus<>pend in <em>im</em>"],  # insertmode only
636         }, # modei
637
638         'i^g' => {
639                 lead => "ĝ",
640
641                 "\e"=> ['g6 modei', "insert mode"],
642
643                 'k' => ['g2', => "<up> start col<>umn"],
644                 'j' => ['g2', => "<down> start col<>umn"],
645                 'u' => ['g4', => "break undo seq<>uence"],
646                 'U' => ['g4 v8', => "keep undo seq<>uence"],
647                 # other keys (even esc) are not recognized
648
649                 's' => ['g4 arg xsurround', => "sur<>round\nsurround plugin"],
650         }, # mode i ^g
651
652         'i^x' => {
653                 lead => "x̂",
654
655                 "\e" => ["g7 mode", "normal mode"], # yes, it really leaves insert mode
656
657                 '^['=> \"i^x\e",
658                 '^]' => ['g4', => "tag comp<>l<>et<>e"],
659                 '^d' => ['g4', => "def<>ine compl<>et<>e"],
660                 '^e' => ["g3", => "window up"],
661                 '^f' => ['g4', => "file comp<>l<>et<>e"],
662                 '^i' => ['g4', => "ident comp<>l<>et<>e"],
663                 '^k' => ['g4', => "dict comp<>l<>et<>e"],
664                 '^l' => ['g4', => "line comp<>l<>et<>e"],
665                 '^n' => ['g4', => "next comp<>l<>et<>e"],
666                 '^o' => ['g4 v7', => "omni comp<>l<>et<>e"],
667                 '^p' => ['g4', => "prev comp<>l<>ete"],
668                 '^s' => ['g4', => "spell sugg<>est"],
669                  's' => \'i^x^s',
670                 '^t' => ['g4', => "thes<>aur<>us compl<>et<>e"],
671                 '^u' => ['g4 v7', => "cus<>tom comp<>l<>et<>e"],
672                 '^v' => ['g4', => "ex cmd compl<>et<>e"],
673                 '^y' => ["g3", => "window down"],
674         }, # mode i ^x
675
676         d => {
677                 lead => "d",
678
679                 "\e"=> ["g7 mode", "normal mode"],
680                 '^['=> \"d\e",
681
682                 'd'  => ['g4', 'delete line'],
683                 'o'  => ['g5', 'diff obtain'],
684                 'p'  => ['g5', 'diff put'],
685                 's'  => ['g4 arg xsurround', 'delete surr<>oun<>d<>ing'],
686
687                 (map { ($_ => [\$_, "delete to <alias>$_"]) } qw( g z [ ] )), # modes
688
689                 # commands
690                 (map { $_ => \$_ } qw( \\ ^\\ ^q ^s ^z )),
691                 'l'  => \'x',
692                 'h'  => \'X',
693                 '^h' => \'X',
694                 '^j' => \'dj',
695                 '^m' => \'dj',
696                 '^n' => \'dj',
697                 '+'  => \'dj',
698                 '^p' => \'dk',
699                 '-'  => \'dk',
700                 '$'  => \'D',
701                 '_'  => \'dd',
702
703                 # simple @motions
704                 'W' => ['g4', 'delete <span style="font-variant:small-caps">word</span>'],
705                 'b' => ['g4', 'delete <left> word'],
706                 'B' => ['g4', 'delete <left> <span style="font-variant:small-caps">word</span>'],
707                 'e' => ['g4', 'delete word e<>nd'],
708                 'E' => ['g4', 'delete <span style="font-variant:small-caps">word</span> e<>nd'],
709                 'G' => ['g4', 'delete to line<>/eof'],
710                 'H' => ['g4', 'delete to top'],
711                 'j' => ['g4', 'delete <down> line'],
712                 'k' => ['g4', 'delete <up> line'],
713                 'L' => ['g4', 'delete to bottom'],
714                 'M' => ['g4', 'delete to middle'],
715                 'n' => ['g4', 'delete to next res<>ult'],
716                 'N' => ['g4', 'delete to prev res<>ult'],
717                 'w' => ['g4', 'delete word'],
718                 ',' => ['g4', 'delete to prev ch<>ar<>acter'],
719                 ';' => ['g4', 'delete to next ch<>ar<>acter'],
720                 '*' => ['g4', 'delete to find'],
721                 '#' => ['g4', 'delete <left> to find'],
722                 '%' => ['g4', 'delete to line pct'],
723                 '^' => ['g4', 'delete to soft bol'],
724                 '0' => ['g4', 'delete to bol'],
725                 '|' => ['g4', 'delete to col<>umn'],
726                 '{' => ['g4', 'delete <left> par<>agr<>aph'],
727                 '}' => ['g4', 'delete rest of p<>ar<>agr<>aph'],
728                 '(' => ['g4', 'delete <left> senten<>ce'],
729                 ')' => ['g4', 'delete rest of s<>en<>ten<>ce'],
730
731                 # @motions with option
732                 'f' => ['g4 arg', 'delete to char<>acter'],
733                 'F' => ['g4 arg', 'delete <left> to char<>acter'],
734                 't' => ['g4 arg', 'delete upto ch<>ar<>acter'],
735                 'T' => ['g4 arg', 'delete <left> upto ch<>ar<>acter'],
736                 '`' => ['g4 arg', 'delete to mark'],
737                 "'" => ['g4 arg', 'delete lines to m<>ark'],
738                 '/' => ['g4 arg', 'delete to res<>ult'],
739                 '?' => ['g4 arg', 'delete <left> to res<>ult'],
740
741                 # motions from virtual
742                 'a' => ['g9 modeva arg v6 alias', 'delete area'], # va
743                 'i' => ['g9 modeva arg v6 alias', 'delete inner'], # vi
744         }, # mode d
745
746         # y => { 'o' => ['g9 arg xunimpaired', "toggle option\nunimpaired plugin"] }, # TODO
747
748         # TODO: mode/ (command-line)
749         # XXX ex mode if you want to go completely wild
750 },
751 }