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