xref: /dflybsd-src/contrib/nvi2/ex/ex_cmd.c (revision 07bc39c2f4bbca56f12568e06d89da17f2eeb965)
1*e0b8e63eSJohn Marino /*-
2*e0b8e63eSJohn Marino  * Copyright (c) 1992, 1993, 1994
3*e0b8e63eSJohn Marino  *	The Regents of the University of California.  All rights reserved.
4*e0b8e63eSJohn Marino  * Copyright (c) 1992, 1993, 1994, 1995, 1996
5*e0b8e63eSJohn Marino  *	Keith Bostic.  All rights reserved.
6*e0b8e63eSJohn Marino  *
7*e0b8e63eSJohn Marino  * See the LICENSE file for redistribution information.
8*e0b8e63eSJohn Marino  */
9*e0b8e63eSJohn Marino 
10*e0b8e63eSJohn Marino #include "config.h"
11*e0b8e63eSJohn Marino 
12*e0b8e63eSJohn Marino #include <sys/types.h>
13*e0b8e63eSJohn Marino #include <sys/queue.h>
14*e0b8e63eSJohn Marino #include <sys/time.h>
15*e0b8e63eSJohn Marino 
16*e0b8e63eSJohn Marino #include <bitstring.h>
17*e0b8e63eSJohn Marino #include <limits.h>
18*e0b8e63eSJohn Marino #include <stdio.h>
19*e0b8e63eSJohn Marino 
20*e0b8e63eSJohn Marino #include "../common/common.h"
21*e0b8e63eSJohn Marino 
22*e0b8e63eSJohn Marino /*
23*e0b8e63eSJohn Marino  * This array maps ex command names to command functions.
24*e0b8e63eSJohn Marino  *
25*e0b8e63eSJohn Marino  * The order in which command names are listed below is important --
26*e0b8e63eSJohn Marino  * ambiguous abbreviations are resolved to be the first possible match,
27*e0b8e63eSJohn Marino  * e.g. "r" means "read", not "rewind", because "read" is listed before
28*e0b8e63eSJohn Marino  * "rewind".
29*e0b8e63eSJohn Marino  *
30*e0b8e63eSJohn Marino  * The syntax of the ex commands is unbelievably irregular, and a special
31*e0b8e63eSJohn Marino  * case from beginning to end.  Each command has an associated "syntax
32*e0b8e63eSJohn Marino  * script" which describes the "arguments" that are possible.  The script
33*e0b8e63eSJohn Marino  * syntax is as follows:
34*e0b8e63eSJohn Marino  *
35*e0b8e63eSJohn Marino  *	!		-- ! flag
36*e0b8e63eSJohn Marino  *	1		-- flags: [+-]*[pl#][+-]*
37*e0b8e63eSJohn Marino  *	2		-- flags: [-.+^]
38*e0b8e63eSJohn Marino  *	3		-- flags: [-.+^=]
39*e0b8e63eSJohn Marino  *	b		-- buffer
40*e0b8e63eSJohn Marino  *	c[01+a]		-- count (0-N, 1-N, signed 1-N, address offset)
41*e0b8e63eSJohn Marino  *	f[N#][or]	-- file (a number or N, optional or required)
42*e0b8e63eSJohn Marino  *	l		-- line
43*e0b8e63eSJohn Marino  *	S		-- string with file name expansion
44*e0b8e63eSJohn Marino  *	s		-- string
45*e0b8e63eSJohn Marino  *	W		-- word string
46*e0b8e63eSJohn Marino  *	w[N#][or]	-- word (a number or N, optional or required)
47*e0b8e63eSJohn Marino  */
48*e0b8e63eSJohn Marino EXCMDLIST const cmds[] = {
49*e0b8e63eSJohn Marino /* C_SCROLL */
50*e0b8e63eSJohn Marino 	{L("\004"),	ex_pr,		E_ADDR2,
51*e0b8e63eSJohn Marino 	    "",
52*e0b8e63eSJohn Marino 	    "^D",
53*e0b8e63eSJohn Marino 	    "scroll lines"},
54*e0b8e63eSJohn Marino /* C_BANG */
55*e0b8e63eSJohn Marino 	{L("!"),		ex_bang,	E_ADDR2_NONE|E_SECURE,
56*e0b8e63eSJohn Marino 	    "S",
57*e0b8e63eSJohn Marino 	    "[line [,line]] ! command",
58*e0b8e63eSJohn Marino 	    "filter lines through commands or run commands"},
59*e0b8e63eSJohn Marino /* C_HASH */
60*e0b8e63eSJohn Marino 	{L("#"),		ex_number,	E_ADDR2|E_CLRFLAG,
61*e0b8e63eSJohn Marino 	    "ca1",
62*e0b8e63eSJohn Marino 	    "[line [,line]] # [count] [l]",
63*e0b8e63eSJohn Marino 	    "display numbered lines"},
64*e0b8e63eSJohn Marino /* C_SUBAGAIN */
65*e0b8e63eSJohn Marino 	{L("&"),		ex_subagain,	E_ADDR2|E_ADDR_ZERO,
66*e0b8e63eSJohn Marino 	    "s",
67*e0b8e63eSJohn Marino 	    "[line [,line]] & [cgr] [count] [#lp]",
68*e0b8e63eSJohn Marino 	    "repeat the last subsitution"},
69*e0b8e63eSJohn Marino /* C_STAR */
70*e0b8e63eSJohn Marino 	{L("*"),		ex_at,		0,
71*e0b8e63eSJohn Marino 	    "b",
72*e0b8e63eSJohn Marino 	    "* [buffer]",
73*e0b8e63eSJohn Marino 	    "execute a buffer"},
74*e0b8e63eSJohn Marino /* C_SHIFTL */
75*e0b8e63eSJohn Marino 	{L("<"),		ex_shiftl,	E_ADDR2|E_AUTOPRINT,
76*e0b8e63eSJohn Marino 	    "ca1",
77*e0b8e63eSJohn Marino 	    "[line [,line]] <[<...] [count] [flags]",
78*e0b8e63eSJohn Marino 	    "shift lines left"},
79*e0b8e63eSJohn Marino /* C_EQUAL */
80*e0b8e63eSJohn Marino 	{L("="),		ex_equal,	E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF,
81*e0b8e63eSJohn Marino 	    "1",
82*e0b8e63eSJohn Marino 	    "[line] = [flags]",
83*e0b8e63eSJohn Marino 	    "display line number"},
84*e0b8e63eSJohn Marino /* C_SHIFTR */
85*e0b8e63eSJohn Marino 	{L(">"),		ex_shiftr,	E_ADDR2|E_AUTOPRINT,
86*e0b8e63eSJohn Marino 	    "ca1",
87*e0b8e63eSJohn Marino 	    "[line [,line]] >[>...] [count] [flags]",
88*e0b8e63eSJohn Marino 	    "shift lines right"},
89*e0b8e63eSJohn Marino /* C_AT */
90*e0b8e63eSJohn Marino 	{L("@"),		ex_at,		E_ADDR2,
91*e0b8e63eSJohn Marino 	    "b",
92*e0b8e63eSJohn Marino 	    "@ [buffer]",
93*e0b8e63eSJohn Marino 	    "execute a buffer"},
94*e0b8e63eSJohn Marino /* C_APPEND */
95*e0b8e63eSJohn Marino 	{L("append"),	ex_append,	E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF,
96*e0b8e63eSJohn Marino 	    "!",
97*e0b8e63eSJohn Marino 	    "[line] a[ppend][!]",
98*e0b8e63eSJohn Marino 	    "append input to a line"},
99*e0b8e63eSJohn Marino /* C_ABBR */
100*e0b8e63eSJohn Marino 	{L("abbreviate"), 	ex_abbr,	0,
101*e0b8e63eSJohn Marino 	    "W",
102*e0b8e63eSJohn Marino 	    "ab[brev] [word replace]",
103*e0b8e63eSJohn Marino 	    "specify an input abbreviation"},
104*e0b8e63eSJohn Marino /* C_ARGS */
105*e0b8e63eSJohn Marino 	{L("args"),	ex_args,	0,
106*e0b8e63eSJohn Marino 	    "",
107*e0b8e63eSJohn Marino 	    "ar[gs]",
108*e0b8e63eSJohn Marino 	    "display file argument list"},
109*e0b8e63eSJohn Marino /* C_BG */
110*e0b8e63eSJohn Marino 	{L("bg"),		ex_bg,		E_VIONLY,
111*e0b8e63eSJohn Marino 	    "",
112*e0b8e63eSJohn Marino 	    "bg",
113*e0b8e63eSJohn Marino 	    "put a foreground screen into the background"},
114*e0b8e63eSJohn Marino /* C_CHANGE */
115*e0b8e63eSJohn Marino 	{L("change"),	ex_change,	E_ADDR2|E_ADDR_ZERODEF,
116*e0b8e63eSJohn Marino 	    "!ca",
117*e0b8e63eSJohn Marino 	    "[line [,line]] c[hange][!] [count]",
118*e0b8e63eSJohn Marino 	    "change lines to input"},
119*e0b8e63eSJohn Marino /* C_CD */
120*e0b8e63eSJohn Marino 	{L("cd"),		ex_cd,		0,
121*e0b8e63eSJohn Marino 	    "!f1o",
122*e0b8e63eSJohn Marino 	    "cd[!] [directory]",
123*e0b8e63eSJohn Marino 	    "change the current directory"},
124*e0b8e63eSJohn Marino /* C_CHDIR */
125*e0b8e63eSJohn Marino 	{L("chdir"),	ex_cd,		0,
126*e0b8e63eSJohn Marino 	    "!f1o",
127*e0b8e63eSJohn Marino 	    "chd[ir][!] [directory]",
128*e0b8e63eSJohn Marino 	    "change the current directory"},
129*e0b8e63eSJohn Marino /* C_COPY */
130*e0b8e63eSJohn Marino 	{L("copy"),	ex_copy,	E_ADDR2|E_AUTOPRINT,
131*e0b8e63eSJohn Marino 	    "l1",
132*e0b8e63eSJohn Marino 	    "[line [,line]] co[py] line [flags]",
133*e0b8e63eSJohn Marino 	    "copy lines elsewhere in the file"},
134*e0b8e63eSJohn Marino /* C_CSCOPE */
135*e0b8e63eSJohn Marino 	{L("cscope"),      ex_cscope,      0,
136*e0b8e63eSJohn Marino 	    "!s",
137*e0b8e63eSJohn Marino 	    "cs[cope] command [args]",
138*e0b8e63eSJohn Marino 	    "create a set of tags using a cscope command"},
139*e0b8e63eSJohn Marino /*
140*e0b8e63eSJohn Marino  * !!!
141*e0b8e63eSJohn Marino  * Adding new commands starting with 'd' may break the delete command code
142*e0b8e63eSJohn Marino  * in ex_cmd() (the ex parser).  Read through the comments there, first.
143*e0b8e63eSJohn Marino  */
144*e0b8e63eSJohn Marino /* C_DELETE */
145*e0b8e63eSJohn Marino 	{L("delete"),	ex_delete,	E_ADDR2|E_AUTOPRINT,
146*e0b8e63eSJohn Marino 	    "bca1",
147*e0b8e63eSJohn Marino 	    "[line [,line]] d[elete][flags] [buffer] [count] [flags]",
148*e0b8e63eSJohn Marino 	    "delete lines from the file"},
149*e0b8e63eSJohn Marino /* C_DISPLAY */
150*e0b8e63eSJohn Marino 	{L("display"),	ex_display,	0,
151*e0b8e63eSJohn Marino 	    "w1r",
152*e0b8e63eSJohn Marino 	    "display b[uffers] | c[onnections] | s[creens] | t[ags]",
153*e0b8e63eSJohn Marino 	    "display buffers, connections, screens or tags"},
154*e0b8e63eSJohn Marino /* C_EDIT */
155*e0b8e63eSJohn Marino 	{L("edit"),	ex_edit,	E_NEWSCREEN,
156*e0b8e63eSJohn Marino 	    "f1o",
157*e0b8e63eSJohn Marino 	    "[Ee][dit][!] [+cmd] [file]",
158*e0b8e63eSJohn Marino 	    "begin editing another file"},
159*e0b8e63eSJohn Marino /* C_EX */
160*e0b8e63eSJohn Marino 	{L("ex"),		ex_edit,	E_NEWSCREEN,
161*e0b8e63eSJohn Marino 	    "f1o",
162*e0b8e63eSJohn Marino 	    "[Ee]x[!] [+cmd] [file]",
163*e0b8e63eSJohn Marino 	    "begin editing another file"},
164*e0b8e63eSJohn Marino /* C_EXUSAGE */
165*e0b8e63eSJohn Marino 	{L("exusage"),	ex_usage,	0,
166*e0b8e63eSJohn Marino 	    "w1o",
167*e0b8e63eSJohn Marino 	    "[exu]sage [command]",
168*e0b8e63eSJohn Marino 	    "display ex command usage statement"},
169*e0b8e63eSJohn Marino /* C_FILE */
170*e0b8e63eSJohn Marino 	{L("file"),	ex_file,	0,
171*e0b8e63eSJohn Marino 	    "f1o",
172*e0b8e63eSJohn Marino 	    "f[ile] [name]",
173*e0b8e63eSJohn Marino 	    "display (and optionally set) file name"},
174*e0b8e63eSJohn Marino /* C_FG */
175*e0b8e63eSJohn Marino 	{L("fg"),		ex_fg,		E_NEWSCREEN|E_VIONLY,
176*e0b8e63eSJohn Marino 	    "f1o",
177*e0b8e63eSJohn Marino 	    "[Ff]g [file]",
178*e0b8e63eSJohn Marino 	    "bring a backgrounded screen into the foreground"},
179*e0b8e63eSJohn Marino /* C_GLOBAL */
180*e0b8e63eSJohn Marino 	{L("global"),	ex_global,	E_ADDR2_ALL,
181*e0b8e63eSJohn Marino 	    "!s",
182*e0b8e63eSJohn Marino 	    "[line [,line]] g[lobal][!] [;/]RE[;/] [commands]",
183*e0b8e63eSJohn Marino 	    "execute a global command on lines matching an RE"},
184*e0b8e63eSJohn Marino /* C_HELP */
185*e0b8e63eSJohn Marino 	{L("help"),	ex_help,	0,
186*e0b8e63eSJohn Marino 	    "",
187*e0b8e63eSJohn Marino 	    "he[lp]",
188*e0b8e63eSJohn Marino 	    "display help statement"},
189*e0b8e63eSJohn Marino /* C_INSERT */
190*e0b8e63eSJohn Marino 	{L("insert"),	ex_insert,	E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF,
191*e0b8e63eSJohn Marino 	    "!",
192*e0b8e63eSJohn Marino 	    "[line] i[nsert][!]",
193*e0b8e63eSJohn Marino 	    "insert input before a line"},
194*e0b8e63eSJohn Marino /* C_JOIN */
195*e0b8e63eSJohn Marino 	{L("join"),	ex_join,	E_ADDR2|E_AUTOPRINT,
196*e0b8e63eSJohn Marino 	    "!ca1",
197*e0b8e63eSJohn Marino 	    "[line [,line]] j[oin][!] [count] [flags]",
198*e0b8e63eSJohn Marino 	    "join lines into a single line"},
199*e0b8e63eSJohn Marino /* C_K */
200*e0b8e63eSJohn Marino 	{L("k"),		ex_mark,	E_ADDR1,
201*e0b8e63eSJohn Marino 	    "w1r",
202*e0b8e63eSJohn Marino 	    "[line] k key",
203*e0b8e63eSJohn Marino 	    "mark a line position"},
204*e0b8e63eSJohn Marino /* C_LIST */
205*e0b8e63eSJohn Marino 	{L("list"),	ex_list,	E_ADDR2|E_CLRFLAG,
206*e0b8e63eSJohn Marino 	    "ca1",
207*e0b8e63eSJohn Marino 	    "[line [,line]] l[ist] [count] [#]",
208*e0b8e63eSJohn Marino 	    "display lines in an unambiguous form"},
209*e0b8e63eSJohn Marino /* C_MOVE */
210*e0b8e63eSJohn Marino 	{L("move"),	ex_move,	E_ADDR2|E_AUTOPRINT,
211*e0b8e63eSJohn Marino 	    "l",
212*e0b8e63eSJohn Marino 	    "[line [,line]] m[ove] line",
213*e0b8e63eSJohn Marino 	    "move lines elsewhere in the file"},
214*e0b8e63eSJohn Marino /* C_MARK */
215*e0b8e63eSJohn Marino 	{L("mark"),	ex_mark,	E_ADDR1,
216*e0b8e63eSJohn Marino 	    "w1r",
217*e0b8e63eSJohn Marino 	    "[line] ma[rk] key",
218*e0b8e63eSJohn Marino 	    "mark a line position"},
219*e0b8e63eSJohn Marino /* C_MAP */
220*e0b8e63eSJohn Marino 	{L("map"),		ex_map,		0,
221*e0b8e63eSJohn Marino 	    "!W",
222*e0b8e63eSJohn Marino 	    "map[!] [keys replace]",
223*e0b8e63eSJohn Marino 	    "map input or commands to one or more keys"},
224*e0b8e63eSJohn Marino /* C_MKEXRC */
225*e0b8e63eSJohn Marino 	{L("mkexrc"),	ex_mkexrc,	0,
226*e0b8e63eSJohn Marino 	    "!f1r",
227*e0b8e63eSJohn Marino 	    "mkexrc[!] file",
228*e0b8e63eSJohn Marino 	    "write a .exrc file"},
229*e0b8e63eSJohn Marino /* C_NEXT */
230*e0b8e63eSJohn Marino 	{L("next"),	ex_next,	E_NEWSCREEN,
231*e0b8e63eSJohn Marino 	    "!fN",
232*e0b8e63eSJohn Marino 	    "[Nn][ext][!] [+cmd] [file ...]",
233*e0b8e63eSJohn Marino 	    "edit (and optionally specify) the next file"},
234*e0b8e63eSJohn Marino /* C_NUMBER */
235*e0b8e63eSJohn Marino 	{L("number"),	ex_number,	E_ADDR2|E_CLRFLAG,
236*e0b8e63eSJohn Marino 	    "ca1",
237*e0b8e63eSJohn Marino 	    "[line [,line]] nu[mber] [count] [l]",
238*e0b8e63eSJohn Marino 	    "change display to number lines"},
239*e0b8e63eSJohn Marino /* C_OPEN */
240*e0b8e63eSJohn Marino 	{L("open"),	ex_open,	E_ADDR1,
241*e0b8e63eSJohn Marino 	    "s",
242*e0b8e63eSJohn Marino 	    "[line] o[pen] [/RE/] [flags]",
243*e0b8e63eSJohn Marino 	    "enter \"open\" mode (not implemented)"},
244*e0b8e63eSJohn Marino /* C_PRINT */
245*e0b8e63eSJohn Marino 	{L("print"),	ex_pr,		E_ADDR2|E_CLRFLAG,
246*e0b8e63eSJohn Marino 	    "ca1",
247*e0b8e63eSJohn Marino 	    "[line [,line]] p[rint] [count] [#l]",
248*e0b8e63eSJohn Marino 	    "display lines"},
249*e0b8e63eSJohn Marino /* C_PRESERVE */
250*e0b8e63eSJohn Marino 	{L("preserve"),	ex_preserve,	0,
251*e0b8e63eSJohn Marino 	    "",
252*e0b8e63eSJohn Marino 	    "pre[serve]",
253*e0b8e63eSJohn Marino 	    "preserve an edit session for recovery"},
254*e0b8e63eSJohn Marino /* C_PREVIOUS */
255*e0b8e63eSJohn Marino 	{L("previous"),	ex_prev,	E_NEWSCREEN,
256*e0b8e63eSJohn Marino 	    "!",
257*e0b8e63eSJohn Marino 	    "[Pp]rev[ious][!]",
258*e0b8e63eSJohn Marino 	    "edit the previous file in the file argument list"},
259*e0b8e63eSJohn Marino /* C_PUT */
260*e0b8e63eSJohn Marino 	{L("put"),		ex_put,
261*e0b8e63eSJohn Marino 	    E_ADDR1|E_AUTOPRINT|E_ADDR_ZERO|E_ADDR_ZERODEF,
262*e0b8e63eSJohn Marino 	    "b",
263*e0b8e63eSJohn Marino 	    "[line] pu[t] [buffer]",
264*e0b8e63eSJohn Marino 	    "append a cut buffer to the line"},
265*e0b8e63eSJohn Marino /* C_QUIT */
266*e0b8e63eSJohn Marino 	{L("quit"),	ex_quit,	0,
267*e0b8e63eSJohn Marino 	    "!",
268*e0b8e63eSJohn Marino 	    "q[uit][!]",
269*e0b8e63eSJohn Marino 	    "exit ex/vi"},
270*e0b8e63eSJohn Marino /* C_READ */
271*e0b8e63eSJohn Marino 	{L("read"),	ex_read,	E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF,
272*e0b8e63eSJohn Marino 	    "s",
273*e0b8e63eSJohn Marino 	    "[line] r[ead] [!cmd | [file]]",
274*e0b8e63eSJohn Marino 	    "append input from a command or file to the line"},
275*e0b8e63eSJohn Marino /* C_RECOVER */
276*e0b8e63eSJohn Marino 	{L("recover"),	ex_recover,	0,
277*e0b8e63eSJohn Marino 	    "!f1r",
278*e0b8e63eSJohn Marino 	    "recover[!] file",
279*e0b8e63eSJohn Marino 	    "recover a saved file"},
280*e0b8e63eSJohn Marino /* C_RESIZE */
281*e0b8e63eSJohn Marino 	{L("resize"),	ex_resize,	E_VIONLY,
282*e0b8e63eSJohn Marino 	    "c+",
283*e0b8e63eSJohn Marino 	    "resize [+-]rows",
284*e0b8e63eSJohn Marino 	    "grow or shrink the current screen"},
285*e0b8e63eSJohn Marino /* C_REWIND */
286*e0b8e63eSJohn Marino 	{L("rewind"),	ex_rew,		0,
287*e0b8e63eSJohn Marino 	    "!",
288*e0b8e63eSJohn Marino 	    "rew[ind][!]",
289*e0b8e63eSJohn Marino 	    "re-edit all the files in the file argument list"},
290*e0b8e63eSJohn Marino /*
291*e0b8e63eSJohn Marino  * !!!
292*e0b8e63eSJohn Marino  * Adding new commands starting with 's' may break the substitute command code
293*e0b8e63eSJohn Marino  * in ex_cmd() (the ex parser).  Read through the comments there, first.
294*e0b8e63eSJohn Marino  */
295*e0b8e63eSJohn Marino /* C_SUBSTITUTE */
296*e0b8e63eSJohn Marino 	{L("s"),		ex_s,		E_ADDR2|E_ADDR_ZERO,
297*e0b8e63eSJohn Marino 	    "s",
298*e0b8e63eSJohn Marino 	    "[line [,line]] s [[/;]RE[/;]repl[/;] [cgr] [count] [#lp]]",
299*e0b8e63eSJohn Marino 	    "substitute on lines matching an RE"},
300*e0b8e63eSJohn Marino /* C_SCRIPT */
301*e0b8e63eSJohn Marino 	{L("script"),	ex_script,	E_SECURE,
302*e0b8e63eSJohn Marino 	    "!f1o",
303*e0b8e63eSJohn Marino 	    "sc[ript][!] [file]",
304*e0b8e63eSJohn Marino 	    "run a shell in a screen"},
305*e0b8e63eSJohn Marino /* C_SET */
306*e0b8e63eSJohn Marino 	{L("set"),		ex_set,		0,
307*e0b8e63eSJohn Marino 	    "wN",
308*e0b8e63eSJohn Marino 	    "se[t] [option[=[value]]...] [nooption ...] [option? ...] [all]",
309*e0b8e63eSJohn Marino 	    "set options (use \":set all\" to see all options)"},
310*e0b8e63eSJohn Marino /* C_SHELL */
311*e0b8e63eSJohn Marino 	{L("shell"),	ex_shell,	E_SECURE,
312*e0b8e63eSJohn Marino 	    "",
313*e0b8e63eSJohn Marino 	    "sh[ell]",
314*e0b8e63eSJohn Marino 	    "suspend editing and run a shell"},
315*e0b8e63eSJohn Marino /* C_SOURCE */
316*e0b8e63eSJohn Marino 	{L("source"),	ex_source,	0,
317*e0b8e63eSJohn Marino 	    "f1r",
318*e0b8e63eSJohn Marino 	    "so[urce] file",
319*e0b8e63eSJohn Marino 	    "read a file of ex commands"},
320*e0b8e63eSJohn Marino /* C_STOP */
321*e0b8e63eSJohn Marino 	{L("stop"),	ex_stop,	E_SECURE,
322*e0b8e63eSJohn Marino 	    "!",
323*e0b8e63eSJohn Marino 	    "st[op][!]",
324*e0b8e63eSJohn Marino 	    "suspend the edit session"},
325*e0b8e63eSJohn Marino /* C_SUSPEND */
326*e0b8e63eSJohn Marino 	{L("suspend"),	ex_stop,	E_SECURE,
327*e0b8e63eSJohn Marino 	    "!",
328*e0b8e63eSJohn Marino 	    "su[spend][!]",
329*e0b8e63eSJohn Marino 	    "suspend the edit session"},
330*e0b8e63eSJohn Marino /* C_T */
331*e0b8e63eSJohn Marino 	{L("t"),		ex_copy,	E_ADDR2|E_AUTOPRINT,
332*e0b8e63eSJohn Marino 	    "l1",
333*e0b8e63eSJohn Marino 	    "[line [,line]] t line [flags]",
334*e0b8e63eSJohn Marino 	    "copy lines elsewhere in the file"},
335*e0b8e63eSJohn Marino /* C_TAG */
336*e0b8e63eSJohn Marino 	{L("tag"),		ex_tag_push,	E_NEWSCREEN,
337*e0b8e63eSJohn Marino 	    "!w1o",
338*e0b8e63eSJohn Marino 	    "[Tt]a[g][!] [string]",
339*e0b8e63eSJohn Marino 	    "edit the file containing the tag"},
340*e0b8e63eSJohn Marino /* C_TAGNEXT */
341*e0b8e63eSJohn Marino 	{L("tagnext"),	ex_tag_next,	0,
342*e0b8e63eSJohn Marino 	    "!",
343*e0b8e63eSJohn Marino 	    "tagn[ext][!]",
344*e0b8e63eSJohn Marino 	    "move to the next tag"},
345*e0b8e63eSJohn Marino /* C_TAGPOP */
346*e0b8e63eSJohn Marino 	{L("tagpop"),	ex_tag_pop,	0,
347*e0b8e63eSJohn Marino 	    "!w1o",
348*e0b8e63eSJohn Marino 	    "tagp[op][!] [number | file]",
349*e0b8e63eSJohn Marino 	    "return to the previous group of tags"},
350*e0b8e63eSJohn Marino /* C_TAGPREV */
351*e0b8e63eSJohn Marino 	{L("tagprev"),	ex_tag_prev,	0,
352*e0b8e63eSJohn Marino 	    "!",
353*e0b8e63eSJohn Marino 	    "tagpr[ev][!]",
354*e0b8e63eSJohn Marino 	    "move to the previous tag"},
355*e0b8e63eSJohn Marino /* C_TAGTOP */
356*e0b8e63eSJohn Marino 	{L("tagtop"),	ex_tag_top,	0,
357*e0b8e63eSJohn Marino 	    "!",
358*e0b8e63eSJohn Marino 	    "tagt[op][!]",
359*e0b8e63eSJohn Marino 	    "discard all tags"},
360*e0b8e63eSJohn Marino /* C_UNDO */
361*e0b8e63eSJohn Marino 	{L("undo"),	ex_undo,	E_AUTOPRINT,
362*e0b8e63eSJohn Marino 	    "",
363*e0b8e63eSJohn Marino 	    "u[ndo]",
364*e0b8e63eSJohn Marino 	    "undo the most recent change"},
365*e0b8e63eSJohn Marino /* C_UNABBREVIATE */
366*e0b8e63eSJohn Marino 	{L("unabbreviate"),ex_unabbr,	0,
367*e0b8e63eSJohn Marino 	    "w1r",
368*e0b8e63eSJohn Marino 	    "una[bbrev] word",
369*e0b8e63eSJohn Marino 	    "delete an abbreviation"},
370*e0b8e63eSJohn Marino /* C_UNMAP */
371*e0b8e63eSJohn Marino 	{L("unmap"),	ex_unmap,	0,
372*e0b8e63eSJohn Marino 	    "!w1r",
373*e0b8e63eSJohn Marino 	    "unm[ap][!] word",
374*e0b8e63eSJohn Marino 	    "delete an input or command map"},
375*e0b8e63eSJohn Marino /* C_V */
376*e0b8e63eSJohn Marino 	{L("v"),		ex_v,		E_ADDR2_ALL,
377*e0b8e63eSJohn Marino 	    "s",
378*e0b8e63eSJohn Marino 	    "[line [,line]] v [;/]RE[;/] [commands]",
379*e0b8e63eSJohn Marino 	    "execute a global command on lines NOT matching an RE"},
380*e0b8e63eSJohn Marino /* C_VERSION */
381*e0b8e63eSJohn Marino 	{L("version"),	ex_version,	0,
382*e0b8e63eSJohn Marino 	    "",
383*e0b8e63eSJohn Marino 	    "version",
384*e0b8e63eSJohn Marino 	    "display the program version information"},
385*e0b8e63eSJohn Marino /* C_VISUAL_EX */
386*e0b8e63eSJohn Marino 	{L("visual"),	ex_visual,	E_ADDR1|E_ADDR_ZERODEF,
387*e0b8e63eSJohn Marino 	    "2c11",
388*e0b8e63eSJohn Marino 	    "[line] vi[sual] [-|.|+|^] [window_size] [flags]",
389*e0b8e63eSJohn Marino 	    "enter visual (vi) mode from ex mode"},
390*e0b8e63eSJohn Marino /* C_VISUAL_VI */
391*e0b8e63eSJohn Marino 	{L("visual"),	ex_edit,	E_NEWSCREEN,
392*e0b8e63eSJohn Marino 	    "f1o",
393*e0b8e63eSJohn Marino 	    "[Vv]i[sual][!] [+cmd] [file]",
394*e0b8e63eSJohn Marino 	    "edit another file (from vi mode only)"},
395*e0b8e63eSJohn Marino /* C_VIUSAGE */
396*e0b8e63eSJohn Marino 	{L("viusage"),	ex_viusage,	0,
397*e0b8e63eSJohn Marino 	    "w1o",
398*e0b8e63eSJohn Marino 	    "[viu]sage [key]",
399*e0b8e63eSJohn Marino 	    "display vi key usage statement"},
400*e0b8e63eSJohn Marino /* C_VSPLIT */
401*e0b8e63eSJohn Marino 	{L("vsplit"),	ex_edit,	E_VIONLY,
402*e0b8e63eSJohn Marino 	    "f1o",
403*e0b8e63eSJohn Marino 	    "vs[plit] [+cmd] [file]",
404*e0b8e63eSJohn Marino 	    "split the current screen vertically"},
405*e0b8e63eSJohn Marino /* C_WRITE */
406*e0b8e63eSJohn Marino 	{L("write"),	ex_write,	E_ADDR2_ALL|E_ADDR_ZERODEF,
407*e0b8e63eSJohn Marino 	    "!s",
408*e0b8e63eSJohn Marino 	    "[line [,line]] w[rite][!] [ !cmd | [>>] [file]]",
409*e0b8e63eSJohn Marino 	    "write the file"},
410*e0b8e63eSJohn Marino /* C_WN */
411*e0b8e63eSJohn Marino 	{L("wn"),		ex_wn,		E_ADDR2_ALL|E_ADDR_ZERODEF,
412*e0b8e63eSJohn Marino 	    "!s",
413*e0b8e63eSJohn Marino 	    "[line [,line]] wn[!] [>>] [file]",
414*e0b8e63eSJohn Marino 	    "write the file and switch to the next file"},
415*e0b8e63eSJohn Marino /* C_WQ */
416*e0b8e63eSJohn Marino 	{L("wq"),		ex_wq,		E_ADDR2_ALL|E_ADDR_ZERODEF,
417*e0b8e63eSJohn Marino 	    "!s",
418*e0b8e63eSJohn Marino 	    "[line [,line]] wq[!] [>>] [file]",
419*e0b8e63eSJohn Marino 	    "write the file and exit"},
420*e0b8e63eSJohn Marino /* C_XIT */
421*e0b8e63eSJohn Marino 	{L("xit"),		ex_xit,		E_ADDR2_ALL|E_ADDR_ZERODEF,
422*e0b8e63eSJohn Marino 	    "!f1o",
423*e0b8e63eSJohn Marino 	    "[line [,line]] x[it][!] [file]",
424*e0b8e63eSJohn Marino 	    "exit"},
425*e0b8e63eSJohn Marino /* C_YANK */
426*e0b8e63eSJohn Marino 	{L("yank"),	ex_yank,	E_ADDR2,
427*e0b8e63eSJohn Marino 	    "bca",
428*e0b8e63eSJohn Marino 	    "[line [,line]] ya[nk] [buffer] [count]",
429*e0b8e63eSJohn Marino 	    "copy lines to a cut buffer"},
430*e0b8e63eSJohn Marino /* C_Z */
431*e0b8e63eSJohn Marino 	{L("z"),		ex_z,		E_ADDR1,
432*e0b8e63eSJohn Marino 	    "3c01",
433*e0b8e63eSJohn Marino 	    "[line] z [-|.|+|^|=] [count] [flags]",
434*e0b8e63eSJohn Marino 	    "display different screens of the file"},
435*e0b8e63eSJohn Marino /* C_SUBTILDE */
436*e0b8e63eSJohn Marino 	{L("~"),		ex_subtilde,	E_ADDR2|E_ADDR_ZERO,
437*e0b8e63eSJohn Marino 	    "s",
438*e0b8e63eSJohn Marino 	    "[line [,line]] ~ [cgr] [count] [#lp]",
439*e0b8e63eSJohn Marino 	    "replace previous RE with previous replacement string,"},
440*e0b8e63eSJohn Marino 	{NULL},
441*e0b8e63eSJohn Marino };
442