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