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