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