xref: /freebsd/contrib/nvi/vi/v_cmd.c (revision c59e5109)
1b8ba871bSPeter Wemm /*-
2b8ba871bSPeter Wemm  * Copyright (c) 1992, 1993, 1994
3b8ba871bSPeter Wemm  *	The Regents of the University of California.  All rights reserved.
4b8ba871bSPeter Wemm  * Copyright (c) 1992, 1993, 1994, 1995, 1996
5b8ba871bSPeter Wemm  *	Keith Bostic.  All rights reserved.
6b8ba871bSPeter Wemm  *
7b8ba871bSPeter Wemm  * See the LICENSE file for redistribution information.
8b8ba871bSPeter Wemm  */
9b8ba871bSPeter Wemm 
10b8ba871bSPeter Wemm #include "config.h"
11b8ba871bSPeter Wemm 
12b8ba871bSPeter Wemm #include <sys/types.h>
13f0957ccaSPeter Wemm #include <sys/queue.h>
14b8ba871bSPeter Wemm #include <sys/time.h>
15b8ba871bSPeter Wemm 
16b8ba871bSPeter Wemm #include <bitstring.h>
17b8ba871bSPeter Wemm #include <limits.h>
18b8ba871bSPeter Wemm #include <stdio.h>
19b8ba871bSPeter Wemm 
20b8ba871bSPeter Wemm #include "../common/common.h"
21b8ba871bSPeter Wemm #include "vi.h"
22b8ba871bSPeter Wemm 
23b8ba871bSPeter Wemm /*
24b8ba871bSPeter Wemm  * This array maps keystrokes to vi command functions.  It is known
25b8ba871bSPeter Wemm  * in ex/ex_usage.c that it takes four columns to name a vi character.
26b8ba871bSPeter Wemm  */
27b8ba871bSPeter Wemm VIKEYS const vikeys [MAXVIKEY + 1] = {
28b8ba871bSPeter Wemm /* 000 NUL -- The code in vi.c expects key 0 to be undefined. */
29b8ba871bSPeter Wemm 	{NULL},
30b8ba871bSPeter Wemm /* 001  ^A */
31b8ba871bSPeter Wemm 	{v_searchw,	V_ABS|V_CNT|V_MOVE|V_KEYW|VM_CUTREQ|VM_RCM_SET,
32b8ba871bSPeter Wemm 	    "[count]^A",
33b8ba871bSPeter Wemm 	    "^A search forward for cursor word"},
34b8ba871bSPeter Wemm /* 002  ^B */
35b8ba871bSPeter Wemm 	{v_pageup,	V_CNT|VM_RCM_SET,
36b8ba871bSPeter Wemm 	    "[count]^B",
37b8ba871bSPeter Wemm 	    "^B scroll up by screens"},
38b8ba871bSPeter Wemm /* 003  ^C */
39b8ba871bSPeter Wemm 	{NULL,		0,
40b8ba871bSPeter Wemm 	    "^C",
41b8ba871bSPeter Wemm 	    "^C interrupt an operation (e.g. read, write, search)"},
42b8ba871bSPeter Wemm /* 004  ^D */
43b8ba871bSPeter Wemm 	{v_hpagedown,	V_CNT|VM_RCM_SET,
44b8ba871bSPeter Wemm 	    "[count]^D",
45b8ba871bSPeter Wemm 	    "^D scroll down by half screens (setting count)"},
46b8ba871bSPeter Wemm /* 005  ^E */
47b8ba871bSPeter Wemm 	{v_linedown,	V_CNT,
48b8ba871bSPeter Wemm 	    "[count]^E",
49b8ba871bSPeter Wemm 	    "^E scroll down by lines"},
50b8ba871bSPeter Wemm /* 006  ^F */
51b8ba871bSPeter Wemm 	{v_pagedown,	V_CNT|VM_RCM_SET,
52b8ba871bSPeter Wemm 	    "[count]^F",
53b8ba871bSPeter Wemm 	    "^F scroll down by screens"},
54b8ba871bSPeter Wemm /* 007  ^G */
55b8ba871bSPeter Wemm 	{v_status,	0,
56b8ba871bSPeter Wemm 	    "^G",
57b8ba871bSPeter Wemm 	    "^G file status"},
58b8ba871bSPeter Wemm /* 010  ^H */
59b8ba871bSPeter Wemm 	{v_left,	V_CNT|V_MOVE|VM_RCM_SET,
60b8ba871bSPeter Wemm 	    "[count]^H",
61b8ba871bSPeter Wemm 	    "^H move left by characters"},
62b8ba871bSPeter Wemm /* 011  ^I */
63b8ba871bSPeter Wemm 	{NULL},
64b8ba871bSPeter Wemm /* 012  ^J */
65b8ba871bSPeter Wemm 	{v_down,	V_CNT|V_MOVE|VM_LMODE|VM_RCM,
66b8ba871bSPeter Wemm 	    "[count]^J",
67b8ba871bSPeter Wemm 	    "^J move down by lines"},
68b8ba871bSPeter Wemm /* 013  ^K */
69b8ba871bSPeter Wemm 	{NULL},
70b8ba871bSPeter Wemm /* 014  ^L */
71b8ba871bSPeter Wemm 	{v_redraw,	0,
72b8ba871bSPeter Wemm 	    "^L",
73b8ba871bSPeter Wemm 	    "^L redraw screen"},
74b8ba871bSPeter Wemm /* 015  ^M */
75b8ba871bSPeter Wemm 	{v_cr,		V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETFNB,
76b8ba871bSPeter Wemm 	    "[count]^M",
77b8ba871bSPeter Wemm 	    "^M move down by lines (to first non-blank)"},
78b8ba871bSPeter Wemm /* 016  ^N */
79b8ba871bSPeter Wemm 	{v_down,	V_CNT|V_MOVE|VM_LMODE|VM_RCM,
80b8ba871bSPeter Wemm 	    "[count]^N",
81b8ba871bSPeter Wemm 	    "^N move down by lines"},
82b8ba871bSPeter Wemm /* 017  ^O */
83b8ba871bSPeter Wemm 	{NULL},
84b8ba871bSPeter Wemm /* 020  ^P */
85b8ba871bSPeter Wemm 	{v_up,		V_CNT|V_MOVE|VM_LMODE|VM_RCM,
86b8ba871bSPeter Wemm 	    "[count]^P",
87b8ba871bSPeter Wemm 	    "^P move up by lines"},
88b8ba871bSPeter Wemm /* 021  ^Q -- same as ^V if not used for hardware flow control. */
89b8ba871bSPeter Wemm 	{NULL},
90b8ba871bSPeter Wemm /* 022  ^R */
91b8ba871bSPeter Wemm 	{v_redraw,	0,
92b8ba871bSPeter Wemm 	    "^R",
93b8ba871bSPeter Wemm 	    "^R redraw screen"},
94b8ba871bSPeter Wemm /* 023  ^S -- not available, used for hardware flow control. */
95b8ba871bSPeter Wemm 	{NULL},
96b8ba871bSPeter Wemm /* 024  ^T */
97b8ba871bSPeter Wemm 	{v_tagpop,	V_ABS|VM_RCM_SET,
98b8ba871bSPeter Wemm 	    "^T",
99b8ba871bSPeter Wemm 	    "^T tag pop"},
100b8ba871bSPeter Wemm /* 025  ^U */
101b8ba871bSPeter Wemm 	{v_hpageup,	V_CNT|VM_RCM_SET,
102b8ba871bSPeter Wemm 	    "[count]^U",
103b8ba871bSPeter Wemm 	    "^U half page up (set count)"},
104b8ba871bSPeter Wemm /* 026  ^V */
105b8ba871bSPeter Wemm 	{NULL,		0,
106b8ba871bSPeter Wemm 	    "^V",
107b8ba871bSPeter Wemm 	    "^V input a literal character"},
108b8ba871bSPeter Wemm /* 027  ^W */
109b8ba871bSPeter Wemm 	{v_screen,	0,
110b8ba871bSPeter Wemm 	    "^W",
111b8ba871bSPeter Wemm 	    "^W move to next screen"},
112b8ba871bSPeter Wemm /* 030  ^X */
113b8ba871bSPeter Wemm 	{NULL},
114b8ba871bSPeter Wemm /* 031  ^Y */
115b8ba871bSPeter Wemm 	{v_lineup,	V_CNT,
116b8ba871bSPeter Wemm 	    "[count]^Y",
117b8ba871bSPeter Wemm 	    "^Y page up by lines"},
118b8ba871bSPeter Wemm /* 032  ^Z */
119b8ba871bSPeter Wemm 	{v_suspend,	V_SECURE,
120b8ba871bSPeter Wemm 	    "^Z",
121b8ba871bSPeter Wemm 	    "^Z suspend editor"},
122b8ba871bSPeter Wemm /* 033  ^[ */
123b8ba871bSPeter Wemm 	{NULL,		0,
124b8ba871bSPeter Wemm 	    "^[ <escape>",
125b8ba871bSPeter Wemm 	    "^[ <escape> exit input mode, cancel partial commands"},
126b8ba871bSPeter Wemm /* 034  ^\ */
127b8ba871bSPeter Wemm 	{v_exmode,	0,
128b8ba871bSPeter Wemm 	    "^\\",
129b8ba871bSPeter Wemm 	    "^\\ switch to ex mode"},
130b8ba871bSPeter Wemm /* 035  ^] */
131b8ba871bSPeter Wemm 	{v_tagpush,	V_ABS|V_KEYW|VM_RCM_SET,
132b8ba871bSPeter Wemm 	    "^]",
133b8ba871bSPeter Wemm 	    "^] tag push cursor word"},
134b8ba871bSPeter Wemm /* 036  ^^ */
135b8ba871bSPeter Wemm 	{v_switch,	0,
136b8ba871bSPeter Wemm 	    "^^",
137b8ba871bSPeter Wemm 	    "^^ switch to previous file"},
138b8ba871bSPeter Wemm /* 037  ^_ */
139b8ba871bSPeter Wemm 	{NULL},
140b8ba871bSPeter Wemm /* 040 ' ' */
141b8ba871bSPeter Wemm 	{v_right,	V_CNT|V_MOVE|VM_RCM_SET,
142b8ba871bSPeter Wemm 	    "[count]' '",
143b8ba871bSPeter Wemm 	    "   <space> move right by columns"},
144b8ba871bSPeter Wemm /* 041   ! */
145b8ba871bSPeter Wemm 	{v_filter,	V_CNT|V_DOT|V_MOTION|V_SECURE|VM_RCM_SET,
146b8ba871bSPeter Wemm 	    "[count]![count]motion command(s)",
147b8ba871bSPeter Wemm 	    " ! filter through command(s) to motion"},
148b8ba871bSPeter Wemm /* 042   " */
149b8ba871bSPeter Wemm 	{NULL},
150b8ba871bSPeter Wemm /* 043   # */
151b8ba871bSPeter Wemm 	{v_increment,	V_CHAR|V_CNT|V_DOT|VM_RCM_SET,
152b8ba871bSPeter Wemm 	    "[count]# +|-|#",
153b8ba871bSPeter Wemm 	    " # number increment/decrement"},
154b8ba871bSPeter Wemm /* 044   $ */
155b8ba871bSPeter Wemm 	{v_dollar,	V_CNT|V_MOVE|VM_RCM_SETLAST,
156b8ba871bSPeter Wemm 	    " [count]$",
157b8ba871bSPeter Wemm 	    " $ move to last column"},
158b8ba871bSPeter Wemm /* 045   % */
159b8ba871bSPeter Wemm 	{v_match,	V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
160b8ba871bSPeter Wemm 	    "%",
161b8ba871bSPeter Wemm 	    " % move to match"},
162b8ba871bSPeter Wemm /* 046   & */
163b8ba871bSPeter Wemm 	{v_again,	0,
164b8ba871bSPeter Wemm 	    "&",
165b8ba871bSPeter Wemm 	    " & repeat substitution"},
166b8ba871bSPeter Wemm /* 047   ' */
167b8ba871bSPeter Wemm 	{v_fmark,	V_ABS_L|V_CHAR|V_MOVE|VM_LMODE|VM_RCM_SET,
168b8ba871bSPeter Wemm 	    "'['a-z]",
169b8ba871bSPeter Wemm 	    " ' move to mark (to first non-blank)"},
170b8ba871bSPeter Wemm /* 050   ( */
171b8ba871bSPeter Wemm 	{v_sentenceb,	V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
172b8ba871bSPeter Wemm 	    "[count](",
173b8ba871bSPeter Wemm 	    " ( move back sentence"},
174b8ba871bSPeter Wemm /* 051   ) */
175b8ba871bSPeter Wemm 	{v_sentencef,	V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
176b8ba871bSPeter Wemm 	    "[count])",
177b8ba871bSPeter Wemm 	    " ) move forward sentence"},
178b8ba871bSPeter Wemm /* 052   * */
179b8ba871bSPeter Wemm 	{NULL},
180b8ba871bSPeter Wemm /* 053   + */
181b8ba871bSPeter Wemm 	{v_down,	V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETFNB,
182b8ba871bSPeter Wemm 	    "[count]+",
183b8ba871bSPeter Wemm 	    " + move down by lines (to first non-blank)"},
184b8ba871bSPeter Wemm /* 054   , */
185b8ba871bSPeter Wemm 	{v_chrrepeat,	V_CNT|V_MOVE|VM_RCM_SET,
186b8ba871bSPeter Wemm 	    "[count],",
187b8ba871bSPeter Wemm 	    " , reverse last F, f, T or t search"},
188b8ba871bSPeter Wemm /* 055   - */
189b8ba871bSPeter Wemm 	{v_up,		V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETFNB,
190b8ba871bSPeter Wemm 	    "[count]-",
191b8ba871bSPeter Wemm 	    " - move up by lines (to first non-blank)"},
192b8ba871bSPeter Wemm /* 056   . */
193b8ba871bSPeter Wemm 	{NULL,		0,
194b8ba871bSPeter Wemm 	    ".",
195b8ba871bSPeter Wemm 	    " . repeat the last command"},
196b8ba871bSPeter Wemm /* 057   / */
197b8ba871bSPeter Wemm 	{v_searchf,	V_ABS_C|V_MOVE|VM_CUTREQ|VM_RCM_SET,
198b8ba871bSPeter Wemm 	    "/RE[/ offset]",
199b8ba871bSPeter Wemm 	    " / search forward"},
200b8ba871bSPeter Wemm /* 060   0 */
201b8ba871bSPeter Wemm 	{v_zero,	V_MOVE|VM_RCM_SET,
202b8ba871bSPeter Wemm 	    "0",
203b8ba871bSPeter Wemm 	    " 0 move to first character"},
204b8ba871bSPeter Wemm /* 061   1 */
205b8ba871bSPeter Wemm 	{NULL},
206b8ba871bSPeter Wemm /* 062   2 */
207b8ba871bSPeter Wemm 	{NULL},
208b8ba871bSPeter Wemm /* 063   3 */
209b8ba871bSPeter Wemm 	{NULL},
210b8ba871bSPeter Wemm /* 064   4 */
211b8ba871bSPeter Wemm 	{NULL},
212b8ba871bSPeter Wemm /* 065   5 */
213b8ba871bSPeter Wemm 	{NULL},
214b8ba871bSPeter Wemm /* 066   6 */
215b8ba871bSPeter Wemm 	{NULL},
216b8ba871bSPeter Wemm /* 067   7 */
217b8ba871bSPeter Wemm 	{NULL},
218b8ba871bSPeter Wemm /* 070   8 */
219b8ba871bSPeter Wemm 	{NULL},
220b8ba871bSPeter Wemm /* 071   9 */
221b8ba871bSPeter Wemm 	{NULL},
222b8ba871bSPeter Wemm /* 072   : */
223b8ba871bSPeter Wemm 	{v_ex,		0,
224b8ba871bSPeter Wemm 	    ":command [| command] ...",
225b8ba871bSPeter Wemm 	    " : ex command"},
226b8ba871bSPeter Wemm /* 073   ; */
227b8ba871bSPeter Wemm 	{v_chrepeat,	V_CNT|V_MOVE|VM_RCM_SET,
228b8ba871bSPeter Wemm 	    "[count];",
229b8ba871bSPeter Wemm 	    " ; repeat last F, f, T or t search"},
230b8ba871bSPeter Wemm /* 074   < */
231b8ba871bSPeter Wemm 	{v_shiftl,	V_CNT|V_DOT|V_MOTION|VM_RCM_SET,
232b8ba871bSPeter Wemm 	    "[count]<[count]motion",
233b8ba871bSPeter Wemm 	    " < shift lines left to motion"},
234b8ba871bSPeter Wemm /* 075   = */
235b8ba871bSPeter Wemm 	{NULL},
236b8ba871bSPeter Wemm /* 076   > */
237b8ba871bSPeter Wemm 	{v_shiftr,	V_CNT|V_DOT|V_MOTION|VM_RCM_SET,
238b8ba871bSPeter Wemm 	    "[count]>[count]motion",
239b8ba871bSPeter Wemm 	    " > shift lines right to motion"},
240b8ba871bSPeter Wemm /* 077   ? */
241b8ba871bSPeter Wemm 	{v_searchb,	V_ABS_C|V_MOVE|VM_CUTREQ|VM_RCM_SET,
242b8ba871bSPeter Wemm 	    "?RE[? offset]",
243b8ba871bSPeter Wemm 	    " ? search backward"},
244b8ba871bSPeter Wemm /* 100   @ */
245b8ba871bSPeter Wemm 	{v_at,		V_CNT|V_RBUF|VM_RCM_SET,
246b8ba871bSPeter Wemm 	    "@buffer",
247b8ba871bSPeter Wemm 	    " @ execute buffer"},
248b8ba871bSPeter Wemm /* 101   A */
249b8ba871bSPeter Wemm 	{v_iA,		V_CNT|V_DOT|VM_RCM_SET,
250b8ba871bSPeter Wemm 	    "[count]A",
251b8ba871bSPeter Wemm 	    " A append to the line"},
252b8ba871bSPeter Wemm /* 102   B */
253b8ba871bSPeter Wemm 	{v_wordB,	V_CNT|V_MOVE|VM_RCM_SET,
254b8ba871bSPeter Wemm 	    "[count]B",
255b8ba871bSPeter Wemm 	    " B move back bigword"},
256b8ba871bSPeter Wemm /* 103   C */
257b8ba871bSPeter Wemm 	{NULL,		0,
258b8ba871bSPeter Wemm 	    "[buffer][count]C",
259b8ba871bSPeter Wemm 	    " C change to end-of-line"},
260b8ba871bSPeter Wemm /* 104   D */
261b8ba871bSPeter Wemm 	{NULL,		0,
262b8ba871bSPeter Wemm 	    "[buffer]D",
263b8ba871bSPeter Wemm 	    " D delete to end-of-line"},
264b8ba871bSPeter Wemm /* 105   E */
265b8ba871bSPeter Wemm 	{v_wordE,	V_CNT|V_MOVE|VM_RCM_SET,
266b8ba871bSPeter Wemm 	    "[count]E",
267b8ba871bSPeter Wemm 	    " E move to end of bigword"},
268b8ba871bSPeter Wemm /* 106   F */
269b8ba871bSPeter Wemm 	{v_chF,		V_CHAR|V_CNT|V_MOVE|VM_RCM_SET,
270b8ba871bSPeter Wemm 	    "[count]F character",
271b8ba871bSPeter Wemm 	    " F character in line backward search"},
272b8ba871bSPeter Wemm /* 107   G */
273b8ba871bSPeter Wemm 	{v_lgoto,	V_ABS_L|V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETFNB,
274b8ba871bSPeter Wemm 	    "[count]G",
275b8ba871bSPeter Wemm 	    " G move to line"},
276b8ba871bSPeter Wemm /* 110   H */
277b8ba871bSPeter Wemm 	{v_home,	V_ABS_L|V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETNNB,
278b8ba871bSPeter Wemm 	    "[count]H",
279b8ba871bSPeter Wemm 	    " H move to count lines from screen top"},
280b8ba871bSPeter Wemm /* 111   I */
281b8ba871bSPeter Wemm 	{v_iI,		V_CNT|V_DOT|VM_RCM_SET,
282b8ba871bSPeter Wemm 	    "[count]I",
283b8ba871bSPeter Wemm 	    " I insert before first nonblank"},
284b8ba871bSPeter Wemm /* 112   J */
285b8ba871bSPeter Wemm 	{v_join,	V_CNT|V_DOT|VM_RCM_SET,
286b8ba871bSPeter Wemm 	    "[count]J",
287b8ba871bSPeter Wemm 	    " J join lines"},
288b8ba871bSPeter Wemm /* 113   K */
289b8ba871bSPeter Wemm 	{NULL},
290b8ba871bSPeter Wemm /* 114   L */
291b8ba871bSPeter Wemm 	{v_bottom,	V_ABS_L|V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETNNB,
292b8ba871bSPeter Wemm 	    "[count]L",
293b8ba871bSPeter Wemm 	    " L move to screen bottom"},
294b8ba871bSPeter Wemm /* 115   M */
295b8ba871bSPeter Wemm 	{v_middle,	V_ABS_L|V_CNT|V_MOVE|VM_LMODE|VM_RCM_SETNNB,
296b8ba871bSPeter Wemm 	    "M",
297b8ba871bSPeter Wemm 	    " M move to screen middle"},
298b8ba871bSPeter Wemm /* 116   N */
299b8ba871bSPeter Wemm 	{v_searchN,	V_ABS_C|V_MOVE|VM_CUTREQ|VM_RCM_SET,
300b8ba871bSPeter Wemm 	    "n",
301b8ba871bSPeter Wemm 	    " N reverse last search"},
302b8ba871bSPeter Wemm /* 117   O */
303b8ba871bSPeter Wemm 	{v_iO,		V_CNT|V_DOT|VM_RCM_SET,
304b8ba871bSPeter Wemm 	    "[count]O",
305b8ba871bSPeter Wemm 	    " O insert above line"},
306b8ba871bSPeter Wemm /* 120   P */
307b8ba871bSPeter Wemm 	{v_Put,		V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
308b8ba871bSPeter Wemm 	    "[buffer]P",
309b8ba871bSPeter Wemm 	    " P insert before cursor from buffer"},
310b8ba871bSPeter Wemm /* 121   Q */
311b8ba871bSPeter Wemm 	{v_exmode,	0,
312b8ba871bSPeter Wemm 	    "Q",
313b8ba871bSPeter Wemm 	    " Q switch to ex mode"},
314b8ba871bSPeter Wemm /* 122   R */
315b8ba871bSPeter Wemm 	{v_Replace,	V_CNT|V_DOT|VM_RCM_SET,
316b8ba871bSPeter Wemm 	    "[count]R",
317b8ba871bSPeter Wemm 	    " R replace characters"},
318b8ba871bSPeter Wemm /* 123   S */
319b8ba871bSPeter Wemm 	{NULL,		0,
320b8ba871bSPeter Wemm 	    "[buffer][count]S",
321b8ba871bSPeter Wemm 	    " S substitute for the line(s)"},
322b8ba871bSPeter Wemm /* 124   T */
323b8ba871bSPeter Wemm 	{v_chT,		V_CHAR|V_CNT|V_MOVE|VM_RCM_SET,
324b8ba871bSPeter Wemm 	    "[count]T character",
325b8ba871bSPeter Wemm 	    " T before character in line backward search"},
326b8ba871bSPeter Wemm /* 125   U */
327b8ba871bSPeter Wemm 	{v_Undo,	VM_RCM_SET,
328b8ba871bSPeter Wemm 	    "U",
329b8ba871bSPeter Wemm 	    " U Restore the current line"},
330b8ba871bSPeter Wemm /* 126   V */
331b8ba871bSPeter Wemm 	{NULL},
332b8ba871bSPeter Wemm /* 127   W */
333b8ba871bSPeter Wemm 	{v_wordW,	V_CNT|V_MOVE|VM_RCM_SET,
334b8ba871bSPeter Wemm 	    "[count]W",
335b8ba871bSPeter Wemm 	    " W move to next bigword"},
336b8ba871bSPeter Wemm /* 130   X */
337b8ba871bSPeter Wemm 	{v_Xchar,	V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
338b8ba871bSPeter Wemm 	    "[buffer][count]X",
339b8ba871bSPeter Wemm 	    " X delete character before cursor"},
340b8ba871bSPeter Wemm /* 131   Y */
341b8ba871bSPeter Wemm 	{NULL,		0,
342b8ba871bSPeter Wemm 	    "[buffer][count]Y",
343b8ba871bSPeter Wemm 	    " Y copy line"},
344b8ba871bSPeter Wemm /* 132   Z */
345b8ba871bSPeter Wemm 	{v_zexit,	0,
346b8ba871bSPeter Wemm 	    "ZZ",
347b8ba871bSPeter Wemm 	    "ZZ save file and exit"},
348b8ba871bSPeter Wemm /* 133   [ */
349b8ba871bSPeter Wemm 	{v_sectionb,	V_ABS|V_CNT|V_MOVE|VM_RCM_SET,
350b8ba871bSPeter Wemm 	    "[[",
351b8ba871bSPeter Wemm 	    "[[ move back section"},
352b8ba871bSPeter Wemm /* 134   \ */
353b8ba871bSPeter Wemm 	{NULL},
354b8ba871bSPeter Wemm /* 135   ] */
355b8ba871bSPeter Wemm 	{v_sectionf,	V_ABS|V_CNT|V_MOVE|VM_RCM_SET,
356b8ba871bSPeter Wemm 	    "]]",
357b8ba871bSPeter Wemm 	    "]] move forward section"},
358b8ba871bSPeter Wemm /* 136   ^ */
359b8ba871bSPeter Wemm 	/*
360b8ba871bSPeter Wemm 	 * DON'T set the VM_RCM_SETFNB flag, the function has to do the work
361b8ba871bSPeter Wemm 	 * anyway, in case it's a motion component.  DO set VM_RCM_SET, so
362b8ba871bSPeter Wemm 	 * that any motion that's part of a command is preserved.
363b8ba871bSPeter Wemm 	 */
364b8ba871bSPeter Wemm 	{v_first,	V_CNT|V_MOVE|VM_RCM_SET,
365b8ba871bSPeter Wemm 	    "^",
366b8ba871bSPeter Wemm 	    " ^ move to first non-blank"},
367b8ba871bSPeter Wemm /* 137   _ */
368b8ba871bSPeter Wemm 	/*
369b8ba871bSPeter Wemm 	 * Needs both to set the VM_RCM_SETFNB flag, and to do the work
370b8ba871bSPeter Wemm 	 * in the function, in case it's a delete.
371b8ba871bSPeter Wemm 	 */
372b8ba871bSPeter Wemm 	{v_cfirst,	V_CNT|V_MOVE|VM_RCM_SETFNB,
373b8ba871bSPeter Wemm 	    "_",
374b8ba871bSPeter Wemm 	    " _ move to first non-blank"},
375b8ba871bSPeter Wemm /* 140   ` */
376b8ba871bSPeter Wemm 	{v_bmark,	V_ABS_C|V_CHAR|V_MOVE|VM_CUTREQ|VM_RCM_SET,
377b8ba871bSPeter Wemm 	    "`[`a-z]",
378b8ba871bSPeter Wemm 	    " ` move to mark"},
379b8ba871bSPeter Wemm /* 141   a */
380b8ba871bSPeter Wemm 	{v_ia,		V_CNT|V_DOT|VM_RCM_SET,
381b8ba871bSPeter Wemm 	    "[count]a",
382b8ba871bSPeter Wemm 	    " a append after cursor"},
383b8ba871bSPeter Wemm /* 142   b */
384b8ba871bSPeter Wemm 	{v_wordb,	V_CNT|V_MOVE|VM_RCM_SET,
385b8ba871bSPeter Wemm 	    "[count]b",
386b8ba871bSPeter Wemm 	    " b move back word"},
387b8ba871bSPeter Wemm /* 143   c */
388b8ba871bSPeter Wemm 	{v_change,	V_CNT|V_DOT|V_MOTION|V_OBUF|VM_RCM_SET,
389b8ba871bSPeter Wemm 	    "[buffer][count]c[count]motion",
390b8ba871bSPeter Wemm 	    " c change to motion"},
391b8ba871bSPeter Wemm /* 144   d */
392b8ba871bSPeter Wemm 	{v_delete,	V_CNT|V_DOT|V_MOTION|V_OBUF|VM_RCM_SET,
393b8ba871bSPeter Wemm 	    "[buffer][count]d[count]motion",
394b8ba871bSPeter Wemm 	    " d delete to motion"},
395b8ba871bSPeter Wemm /* 145   e */
396b8ba871bSPeter Wemm 	{v_worde,	V_CNT|V_MOVE|VM_RCM_SET,
397b8ba871bSPeter Wemm 	    "[count]e",
398b8ba871bSPeter Wemm 	    " e move to end of word"},
399b8ba871bSPeter Wemm /* 146   f */
400b8ba871bSPeter Wemm 	{v_chf,		V_CHAR|V_CNT|V_MOVE|VM_RCM_SET,
401b8ba871bSPeter Wemm 	    "[count]f character",
402b8ba871bSPeter Wemm 	    " f character in line forward search"},
403b8ba871bSPeter Wemm /* 147   g */
404b8ba871bSPeter Wemm 	{NULL},
405b8ba871bSPeter Wemm /* 150   h */
406b8ba871bSPeter Wemm 	{v_left,	V_CNT|V_MOVE|VM_RCM_SET,
407b8ba871bSPeter Wemm 	    "[count]h",
408b8ba871bSPeter Wemm 	    " h move left by columns"},
409b8ba871bSPeter Wemm /* 151   i */
410b8ba871bSPeter Wemm 	{v_ii,		V_CNT|V_DOT|VM_RCM_SET,
411b8ba871bSPeter Wemm 	    "[count]i",
412b8ba871bSPeter Wemm 	    " i insert before cursor"},
413b8ba871bSPeter Wemm /* 152   j */
414b8ba871bSPeter Wemm 	{v_down,	V_CNT|V_MOVE|VM_LMODE|VM_RCM,
415b8ba871bSPeter Wemm 	    "[count]j",
416b8ba871bSPeter Wemm 	    " j move down by lines"},
417b8ba871bSPeter Wemm /* 153   k */
418b8ba871bSPeter Wemm 	{v_up,		V_CNT|V_MOVE|VM_LMODE|VM_RCM,
419b8ba871bSPeter Wemm 	    "[count]k",
420b8ba871bSPeter Wemm 	    " k move up by lines"},
421b8ba871bSPeter Wemm /* 154   l */
422b8ba871bSPeter Wemm 	{v_right,	V_CNT|V_MOVE|VM_RCM_SET,
423b8ba871bSPeter Wemm 	    "[count]l",
424b8ba871bSPeter Wemm 	    " l move right by columns"},
425b8ba871bSPeter Wemm /* 155   m */
426b8ba871bSPeter Wemm 	{v_mark,	V_CHAR,
427b8ba871bSPeter Wemm 	    "m[a-z]",
428b8ba871bSPeter Wemm 	    " m set mark"},
429b8ba871bSPeter Wemm /* 156   n */
430b8ba871bSPeter Wemm 	{v_searchn,	V_ABS_C|V_MOVE|VM_CUTREQ|VM_RCM_SET,
431b8ba871bSPeter Wemm 	    "n",
432b8ba871bSPeter Wemm 	    " n repeat last search"},
433b8ba871bSPeter Wemm /* 157   o */
434b8ba871bSPeter Wemm 	{v_io,		V_CNT|V_DOT|VM_RCM_SET,
435b8ba871bSPeter Wemm 	    "[count]o",
436b8ba871bSPeter Wemm 	    " o append after line"},
437b8ba871bSPeter Wemm /* 160   p */
438b8ba871bSPeter Wemm 	{v_put,		V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
439b8ba871bSPeter Wemm 	    "[buffer]p",
440b8ba871bSPeter Wemm 	    " p insert after cursor from buffer"},
441b8ba871bSPeter Wemm /* 161   q */
442b8ba871bSPeter Wemm 	{NULL},
443b8ba871bSPeter Wemm /* 162   r */
444b8ba871bSPeter Wemm 	{v_replace,	V_CNT|V_DOT|VM_RCM_SET,
445b8ba871bSPeter Wemm 	    "[count]r character",
446b8ba871bSPeter Wemm 	    " r replace character"},
447b8ba871bSPeter Wemm /* 163   s */
448b8ba871bSPeter Wemm 	{v_subst,	V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
449b8ba871bSPeter Wemm 	    "[buffer][count]s",
450b8ba871bSPeter Wemm 	    " s substitute character"},
451b8ba871bSPeter Wemm /* 164   t */
452b8ba871bSPeter Wemm 	{v_cht,		V_CHAR|V_CNT|V_MOVE|VM_RCM_SET,
453b8ba871bSPeter Wemm 	    "[count]t character",
454b8ba871bSPeter Wemm 	    " t before character in line forward search"},
455b8ba871bSPeter Wemm /* 165   u */
456b8ba871bSPeter Wemm 	/*
457b8ba871bSPeter Wemm 	 * DON'T set the V_DOT flag, it' more complicated than that.
458b8ba871bSPeter Wemm 	 * See vi/vi.c for details.
459b8ba871bSPeter Wemm 	 */
460b8ba871bSPeter Wemm 	{v_undo,	VM_RCM_SET,
461b8ba871bSPeter Wemm 	    "u",
462b8ba871bSPeter Wemm 	    " u undo last change"},
463b8ba871bSPeter Wemm /* 166   v */
464b8ba871bSPeter Wemm 	{NULL},
465b8ba871bSPeter Wemm /* 167   w */
466b8ba871bSPeter Wemm 	{v_wordw,	V_CNT|V_MOVE|VM_RCM_SET,
467b8ba871bSPeter Wemm 	    "[count]w",
468b8ba871bSPeter Wemm 	    " w move to next word"},
469b8ba871bSPeter Wemm /* 170   x */
470b8ba871bSPeter Wemm 	{v_xchar,	V_CNT|V_DOT|V_OBUF|VM_RCM_SET,
471b8ba871bSPeter Wemm 	    "[buffer][count]x",
472b8ba871bSPeter Wemm 	    " x delete character"},
473b8ba871bSPeter Wemm /* 171   y */
474b8ba871bSPeter Wemm 	{v_yank,	V_CNT|V_DOT|V_MOTION|V_OBUF|VM_RCM_SET,
475b8ba871bSPeter Wemm 	    "[buffer][count]y[count]motion",
476b8ba871bSPeter Wemm 	    " y copy text to motion into a cut buffer"},
477b8ba871bSPeter Wemm /* 172   z */
478b8ba871bSPeter Wemm 	/*
479b8ba871bSPeter Wemm 	 * DON'T set the V_CHAR flag, the char isn't required,
480b8ba871bSPeter Wemm 	 * so it's handled specially in getcmd().
481b8ba871bSPeter Wemm 	 */
482b8ba871bSPeter Wemm 	{v_z, 		V_ABS_L|V_CNT|VM_RCM_SETFNB,
483b8ba871bSPeter Wemm 	    "[line]z[window_size][-|.|+|^|<CR>]",
484b8ba871bSPeter Wemm 	    " z reposition the screen"},
485b8ba871bSPeter Wemm /* 173   { */
486b8ba871bSPeter Wemm 	{v_paragraphb,	V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
487b8ba871bSPeter Wemm 	    "[count]{",
488b8ba871bSPeter Wemm 	    " { move back paragraph"},
489b8ba871bSPeter Wemm /* 174   | */
490b8ba871bSPeter Wemm 	{v_ncol,	V_CNT|V_MOVE|VM_RCM_SET,
491b8ba871bSPeter Wemm 	    "[count]|",
492b8ba871bSPeter Wemm 	    " | move to column"},
493b8ba871bSPeter Wemm /* 175   } */
494b8ba871bSPeter Wemm 	{v_paragraphf,	V_ABS|V_CNT|V_MOVE|VM_CUTREQ|VM_RCM_SET,
495b8ba871bSPeter Wemm 	    "[count]}",
496b8ba871bSPeter Wemm 	    " } move forward paragraph"},
497b8ba871bSPeter Wemm /* 176   ~ */
498b8ba871bSPeter Wemm 	{v_ulcase,	V_CNT|V_DOT|VM_RCM_SET,
499b8ba871bSPeter Wemm 	    "[count]~",
500b8ba871bSPeter Wemm 	    " ~ reverse case"},
501b8ba871bSPeter Wemm };
502b8ba871bSPeter Wemm