|
|
1.1 ! root 1: .TH "QED" 1 ! 2: . \" /*% nroff -man % ! 3: .if t .ds q \(aa ! 4: .if n .ds q ' ! 5: .SH NAME ! 6: qed \- multi-file text editor ! 7: .SH SYNOPSIS ! 8: .B qed ! 9: [ ! 10: .B \- ! 11: ] [ ! 12: .B \-i ! 13: ] [ ! 14: .B \-q ! 15: ] [ ! 16: .B \-e ! 17: ] [ ! 18: .B \-x ! 19: startupfile ! 20: ] [ filename1 filename2 ... ] ! 21: .SH DESCRIPTION ! 22: \fIQed\fP ! 23: is a multiple-file programmable text editor based on ! 24: .IR ed . ! 25: .PP ! 26: .I Qed ! 27: operates on a copy of any file it is editing; changes made ! 28: in the copy have no effect on the file until a \fIw\fR ! 29: or \fIW\fR (write) ! 30: command is given. ! 31: The copy of the text being edited resides ! 32: in a scratch area called a ! 33: .I buffer. ! 34: There are 56 buffers, labeled by alphabetics `a' to `z' and `A' to `Z', ! 35: and the characters `{', `|', `}' and `~' ! 36: (the four ASCII characters following `z'). ! 37: These 56 characters are called, for notational efficiency, ! 38: .I bnames. ! 39: The buffers can contain any ASCII character except NUL. ! 40: .PP ! 41: If ! 42: .I file ! 43: arguments are given, ! 44: .I qed ! 45: simulates an ! 46: .I r ! 47: command (see below) on each of the named files; that is to say, ! 48: the files are read into ! 49: .I qed's ! 50: buffers so that they can be edited. ! 51: The first is read into buffer `a', the second into buffer `b', ! 52: through `z', ! 53: then from `A' to `Z', ! 54: up to a maximum of 52 files. ! 55: The optional ! 56: .B \- ! 57: puts ! 58: .I qed ! 59: in non-\c ! 60: .I verbose ! 61: mode (described with the ! 62: .I o ! 63: command). ! 64: The ! 65: \fB\-q\fR, \fB\-e\fR ! 66: and ! 67: .B \-i ! 68: are equivalent to performing an initial ! 69: `oqs', `oes' or `ois' command (see the ! 70: .I o ! 71: command below). ! 72: .PP ! 73: When \fIqed\fP starts up, ! 74: the file named by the environment variable ! 75: .B QEDFILE ! 76: is read into ! 77: buffer `~' and executed ! 78: (i.e. read as command input), before ! 79: reading in files and accepting commands from the terminal. ! 80: The argument ! 81: .I filename\c ! 82: s are set in the buffers before the startup file is executed, ! 83: so the startup file can treat the \fIfilenames\fR as arguments. ! 84: The default startup file may be overridden with the \fB\-x\fR option. ! 85: .PP ! 86: Input to ! 87: .I qed ! 88: can be redirected, at any time, ! 89: to come from storage such as a buffer ! 90: by use of a ! 91: .I special ! 92: .I character ! 93: such as ``\eb''. ! 94: All the ! 95: .I qed special character ! 96: sequences are discussed in detail below; ! 97: they all begin with a ! 98: backslash `\\'. ! 99: .PP ! 100: .I Qed ! 101: has a ! 102: .I truth flag ! 103: which is set according to the success of certain commands ! 104: and which can be tested for conditional execution, and a ! 105: .I count ! 106: which is set to such values as the number of successful substitutions ! 107: performed in an ! 108: .I s ! 109: command. ! 110: Each buffer has associated with it a ! 111: (possibly null) filename and a ! 112: .I changed ! 113: flag, which is ! 114: set if the contents of the buffer are known to differ ! 115: from the contents of the named file in that buffer. ! 116: .PP ! 117: Commands to ! 118: .I qed ! 119: have a simple and regular structure: zero or ! 120: more ! 121: .I addresses ! 122: followed by a single character ! 123: \fIcommand\fP, ! 124: possibly ! 125: followed by parameters to the command. ! 126: These addresses specify one or more lines in the buffer. ! 127: Every command which requires addresses has default addresses, ! 128: so that the addresses can often be omitted. ! 129: .PP ! 130: In general, any number of commands can appear on a line. ! 131: Some commands require that the character following ! 132: the command be a separator, such as blank, tab or newline. ! 133: Usually, a ! 134: .I display ! 135: .IR character , ! 136: .IR p , ! 137: .IR P , ! 138: .IR l , ! 139: or ! 140: .I L ! 141: may precede the separator, ! 142: causing the resulting line to be displayed in the specified format ! 143: after the command. ! 144: Certain commands allow the input of text for placement in the buffer. ! 145: This text can be supplied in two forms: ! 146: either ! 147: on the same line, after the command, ! 148: or on lines following the command, ! 149: terminated by a line containing only a period `\fB.\fP'. ! 150: If the text is on the command line, ! 151: it is separated from the command by a space or a tab. ! 152: If the tab is used, it is considered part of the text. ! 153: .PP ! 154: .I Qed ! 155: supports a limited form of ! 156: \fIregular\fP \fIexpression\fP ! 157: notation. ! 158: A regular expression specifies ! 159: a set of strings of characters. ! 160: A member of this set of strings is said to be ! 161: .I matched ! 162: by the regular expression. ! 163: Regular expressions in ! 164: .I qed ! 165: are delimited by enclosing them in a pair of identical characters, ! 166: frequently slashes `/'. ! 167: In the following specification for regular expressions the word `character' ! 168: means any character but newline. ! 169: Note that special character interpretation always occurs ! 170: .I before ! 171: executing a command. ! 172: Thus, the backslashes mentioned below are those present ! 173: after special characters have been interpreted. ! 174: .IP 1. ! 175: Any character except a metacharacter matches itself. ! 176: Metacharacters are the regular expression delimiter plus ! 177: < [ \fB.\fP and \e | > ^ * \+ $ ! 178: when another rule gives them a meaning. ! 179: .IP 2. ! 180: A \fB.\fP matches any character. ! 181: .IP 3. ! 182: A backslash \\ followed by ! 183: any metacharacter in the list given in rule 1 ! 184: is a regular expression and matches that character. ! 185: A backslash followed by one of ! 186: ! _ { } ( ) ! 187: or a non-zero digit ! 188: has a special meaning discussed below; ! 189: otherwise, backslashes have literal meaning in regular expressions. ! 190: .IP 4. ! 191: The metacharacter \e\|! matches any control character ! 192: except tab or newline. ! 193: .IP 5. ! 194: A non-empty string ! 195: .I s ! 196: enclosed in square brackets ! 197: [\fIs\fP] (or [^\fIs\fP]) matches any character in (or not in) \fIs\fP. ! 198: In ! 199: .IR s , ! 200: \\ has no special meaning, and ] may only appear as the first character. ! 201: A substring ! 202: .IR a \- b , ! 203: with ! 204: .I a ! 205: and ! 206: .I b ! 207: in ascending ASCII order, stands for the inclusive range of ASCII characters. ! 208: .IP 6. ! 209: A regular expression, ! 210: of the form <\fIx1\fP> or <\fIx1\fR|\|\fIx2\fR|\|...|\|\fIxn\fR>, ! 211: where the \fIx\fR's are regular expressions of form 1-12, matches what ! 212: the leftmost successful \fIx\fR ! 213: matches. ! 214: .IP 7. ! 215: A backslash followed by a non-zero digit ! 216: .I n ! 217: matches a copy of the string that the bracketed regular expression ! 218: (see rule 11) ! 219: beginning with the \fIn\fPth \e\|( matched. ! 220: .IP 8. ! 221: A regular expression of form 1-7 followed by * (\+) ! 222: matches a sequence of zero (one) or more matches of the regular expression. ! 223: .IP 9. ! 224: The metacharacter \\\|_ matches a non-empty ! 225: maximal-length sequence of blanks and tabs. ! 226: .IP 10. ! 227: The metacharacter \\\|{ (\\\|}) matches the empty string at the beginning ! 228: (end) of an identifier. An identifier is defined to be ! 229: an underscore _ or alphabetic followed by zero or more ! 230: underscores, alphabetics or digits. ! 231: .IP 11. ! 232: A regular expression, ! 233: .IR x , ! 234: of form 1-12, bracketed \e\|(\|\fIx\fP\|\e\|) matches what ! 235: .I x ! 236: matches. ! 237: The nesting of these brackets in each regular expression of an ! 238: alternation (rule 6) must be identical. ! 239: An alternation with these brackets may not be iterated (rule 8). ! 240: .IP 12. ! 241: A regular expression of form 1-12, ! 242: .IR x , ! 243: followed by a regular expression of form 1-11, ! 244: .IR y , ! 245: matches a match for ! 246: .I x ! 247: followed by a match for ! 248: .IR y , ! 249: with the ! 250: .I x ! 251: match being as long as possible while still permitting a ! 252: .I y ! 253: match. ! 254: .IP 13. ! 255: A regular expression of form 1-12 preceded by ^ (followed by $) is constrained ! 256: to matches that begin at the left (end at the right) end of a line. ! 257: .IP 14. ! 258: A regular expression of form 1-13 picks out the longest among the leftmost matches ! 259: in a line. ! 260: .IP 15. ! 261: An empty regular expression stands for a copy of the last regular expression encountered. ! 262: .PP ! 263: .i0 ! 264: Regular expressions are used in addresses and the ! 265: .I g ! 266: and ! 267: .I v ! 268: commands ! 269: to specify ! 270: lines, in the ! 271: .I s ! 272: command ! 273: to specify a portion of a line which is to be replaced, ! 274: in the ! 275: .I G ! 276: and ! 277: .I V ! 278: commands to refer to buffers in which to perform commands, ! 279: and in general whenever text ! 280: is being specified. ! 281: .PP ! 282: To understand addressing in ! 283: .I qed ! 284: it is necessary to know that at any time there is a ! 285: \fIcurrent buffer\fR ! 286: and a ! 287: \fIcurrent line.\fR ! 288: When ! 289: .I qed ! 290: is invoked, ! 291: the current buffer is ! 292: buffer `a', ! 293: but may be changed at any time by a ! 294: .I b ! 295: (change buffer) command. ! 296: All addresses refer to lines in the current buffer, ! 297: except for a special case described under the ! 298: .I m ! 299: (move) command. ! 300: .PP ! 301: Generally speaking, the current line is ! 302: the last line affected by a command; however, ! 303: the exact effect on the current line ! 304: is discussed under the description of ! 305: the command. ! 306: Addresses are constructed as follows. ! 307: .IP 1. ! 308: The character `\fB.\fR' addresses the current line. ! 309: .IP 2. ! 310: The character `$' addresses the last line of the buffer. ! 311: .IP 3. ! 312: A decimal number ! 313: .I n ! 314: addresses the ! 315: \fIn\fR-th ! 316: line of the buffer. ! 317: .IP 4. ! 318: `\*q\fIx\fR' addresses the line marked with the ! 319: mark name character \fIx\fR, ! 320: which must be a bname. ! 321: Lines are marked with the ! 322: .I k ! 323: command described below. ! 324: It is an error for the marked line to be outside of the current buffer. ! 325: .IP 5. ! 326: A regular expression enclosed in slashes `/' addresses ! 327: the first matching line ! 328: found by searching forwards from the line after the current line. ! 329: If necessary, the search wraps around to the beginning of the ! 330: buffer. ! 331: If the trailing `/' would be followed by a newline, ! 332: it may be omitted. ! 333: .IP 6. ! 334: A regular expression enclosed in queries `?' addresses ! 335: the first matching line ! 336: found by searching backwards from the line before ! 337: the current line. ! 338: If necessary ! 339: the search wraps around to the end of the buffer. ! 340: If the trailing `?' would be followed by a newline, ! 341: it may be omitted. ! 342: .IP 7. ! 343: An address followed by a plus sign `+' ! 344: or a minus sign `\-' followed by a decimal number specifies that address plus ! 345: (resp. minus) the indicated number of lines. ! 346: The plus sign may be omitted. ! 347: .IP 8. ! 348: An address followed by `+' or `\-' followed by a ! 349: regular expression enclosed in slashes specifies the first ! 350: matching line following (resp. preceding) that address. ! 351: The search wraps around if necessary. ! 352: The `+' may be omitted. ! 353: Enclosing the regular expression in `?' reverses the search direction. ! 354: .IP 9. ! 355: If an address begins with `+' or `\-' ! 356: the addition or subtraction is taken with respect to the current line; ! 357: e.g. `\-5' is understood to mean `\fB.\fR\-5'. ! 358: .IP 10. ! 359: If an address ends with a `+' (or `\-') 1 is added (resp. subtracted). ! 360: As a consequence of this rule and rule 9, ! 361: the address `\-' refers to the line before the current line. ! 362: Moreover, trailing `+' and `\-' characters have cumulative effect, so `\-\-' ! 363: refers to the current line less 2. ! 364: .IP 11. ! 365: To maintain compatibility with earlier versions of the editor, ! 366: the character `^' in addresses is entirely ! 367: equivalent to `\-'. ! 368: .PP ! 369: .i0 ! 370: Commands may require zero, one, or two addresses. ! 371: Commands which require no addresses regard the presence ! 372: of an address as an error. ! 373: Commands which accept one or two addresses ! 374: assume default addresses when none is given. ! 375: If more addresses are given than the command requires, ! 376: the last one or two (depending on what is accepted) are used. ! 377: The last addressed line must not precede the second-last addressed line. ! 378: .PP ! 379: Typically, addresses are separated from each other by a comma `,'. ! 380: They may instead be separated by a semicolon `;' ! 381: in which case the current line `\fB.\fR' is set to the first address ! 382: before the second address is interpreted. ! 383: The second of two separated addresses may not be a line ! 384: earlier in the buffer than the first. ! 385: If the address on the left (right) side of a comma or semicolon ! 386: is absent, it defaults to the first (resp. last) line. ! 387: .PP ! 388: Filename operands of commands may be made up of printing characters only. ! 389: However, when the filename appears as the argument to the invocation of ! 390: \fIqed\fP, ! 391: non-printing characters may be included. ! 392: When a filename is specified for a command, ! 393: it is terminated at the first blank, tab or newline. ! 394: .PP ! 395: In the following list of ! 396: .I qed ! 397: commands, the default addresses ! 398: are shown in parentheses. ! 399: The parentheses are not part of ! 400: the address, but are used to show that the given addresses are ! 401: the default. ! 402: .TP 5 ! 403: ( \fB. \fR)\|a <text> ! 404: The append command accepts input text ! 405: and appends it after the addressed line. ! 406: `\fB.\fR' is left ! 407: on the last line input, if there ! 408: were any, otherwise at the addressed line. ! 409: Address `0' is legal for this command; text is placed ! 410: at the beginning of the buffer. ! 411: .TP 5 ! 412: b<bname> ! 413: The change buffer command sets the current buffer ! 414: to be that named. ! 415: `\fB.\fR', `$' and the remembered ! 416: .I filename ! 417: are set to those of the new buffer; ! 418: upon return to a previously used buffer, ! 419: `\fB.\fR' will be set to its value when the buffer was last used. ! 420: .TP 5 ! 421: ( \fB. \fR)\|b[+\-\^\fB.\fP\^][pagesize][display character] ! 422: The browse command provides page-oriented printing. ! 423: The optional `+', `\-', or ! 424: .RB ` . ' ! 425: specifies whether the next, ! 426: previous, ! 427: or surrounding page ! 428: is to be printed; if absent, `+' is assumed. ! 429: .IB b . ! 430: also prints several carets `^^^^^' ! 431: immediately below the current line. ! 432: If a pagesize is given, it is used for the current browse ! 433: command and remembered as the default. ! 434: The pagesize is initially 22 lines. ! 435: If a display character is given, ! 436: the lines are printed in the specified format, ! 437: and the format is remembered as the default. ! 438: Initially, `p' is the default. ! 439: For ! 440: .I b+ ! 441: and ! 442: .IR b\- , ! 443: `\fB.\fP' is left at the last line displayed; ! 444: for ! 445: \fIb\fP\fB.\fP, ! 446: it is unchanged. ! 447: NOTE: The browse and change buffer commands are the same character! ! 448: The two commands can be syntactically distinguished ! 449: in all cases except for `b<display\ char>'; ! 450: this ambiguity may be resolved by typing the (implicit) `+' ! 451: after the `b'. ! 452: .TP 5 ! 453: ( \fB. \fR, \fB. \fR)\|c <text> ! 454: The change ! 455: command deletes the addressed lines, then accepts input ! 456: text which replaces these lines. ! 457: `\fB.\fR' is left at the last line input; if there were none, ! 458: it is left at the line preceding the deleted lines. ! 459: If an interrupt signal (usually ASCII DEL) is received during a ! 460: change command, the old lines are not deleted. ! 461: .TP 5 ! 462: ( \fB. \fR, \fB. \fR)\|d ! 463: The delete command deletes the addressed lines from the buffer. ! 464: The line after the deleted section becomes the current line; ! 465: if the deleted lines were originally at the end, ! 466: the new last line becomes the current line. ! 467: The character after the `d' can only be one of ! 468: a blank, newline, tab, or display character. ! 469: Line 0 is a valid address for deletion; ! 470: deleting line 0 has no affect on any lines in the buffer. ! 471: .TP 5 ! 472: e filename ! 473: The edit ! 474: command causes the entire contents of the current buffer to be deleted, ! 475: and then the named file to be read in. ! 476: `\fB.\fR' is set to the last line of the buffer. ! 477: The number of characters read is typed ! 478: if ! 479: .I qed ! 480: is in ! 481: .I verbose ! 482: mode. ! 483: The \fIfilename\fP is remembered for possible use as a default file name ! 484: in a subsequent ! 485: \fIf\fP, \fIr\fR, \fIw\fR, or \fIW\fR command. ! 486: .TP 5 ! 487: E filename ! 488: The ! 489: .I E ! 490: command is like ! 491: .IR e , ! 492: except that ! 493: .I qed ! 494: does not check to see ! 495: if the buffer has been modified ! 496: since the last ! 497: .I w ! 498: command. ! 499: .TP 5 ! 500: f filename ! 501: The filename command prints information about the current buffer, ! 502: in the format used by the \fIn\fR command. ! 503: If \fIfilename\fP is given, ! 504: the currently remembered file name is changed to \fIfilename\fP. ! 505: If ! 506: .I qed ! 507: is not in verbose mode, ! 508: the information is only printed if the ! 509: .I filename ! 510: is not specified. ! 511: If it is not desired to set the ! 512: .I filename, ! 513: the character immediately after the f must be a newline. ! 514: Otherwise, the first token ! 515: (which may be the null string) ! 516: on the line, after a mandatory non-empty sequence of blanks and tabs, ! 517: is taken to be the ! 518: .I filename. ! 519: These rules apply to all ! 520: .I filename\c ! 521: -using commands, ! 522: .I e, ! 523: .I f, ! 524: .I r, ! 525: .I R, ! 526: .I S, ! 527: .I w ! 528: and ! 529: .I W, ! 530: although some regard specification of an explicitly null \fIfilename\fP as an ! 531: error. ! 532: .TP 5 ! 533: ( 1 , $ )\|g/regular expression/command list ! 534: In the global ! 535: command, the first step is to mark every line in the range which matches ! 536: the regular expression. ! 537: Then for every such line, the ! 538: command list is executed with `\fB.\fR' initially set to that line. ! 539: Any embedded newlines in the command list ! 540: must be escaped with a backslash. ! 541: The ! 542: \fIa\fP, ! 543: \fIi\fP, ! 544: and ! 545: .I c ! 546: commands and associated input are permitted; ! 547: the `\fB.\fR' terminating input mode may be omitted if it would be on the ! 548: last line of the command list. ! 549: The commands ! 550: .I g ! 551: and ! 552: .I v ! 553: are not permitted in the command list. ! 554: If the command list is empty, `\fB.\fPp' is assumed. ! 555: The regular expression may be delimited by any character other than newline. ! 556: .TP 5 ! 557: G/regular expression/command list ! 558: In the globuf ! 559: command, the first step is to mark every active buffer ! 560: whose output from an ! 561: .I f ! 562: command ! 563: (with the ! 564: .I filename ! 565: printed literally) ! 566: would match the regular expression. ! 567: (An active buffer is one which has either some text or ! 568: a remembered file name.)\ ! 569: Then for every such buffer, the ! 570: command list is executed with the current buffer set to that buffer. ! 571: In other respects it is like the global command, ! 572: except that only the commands ! 573: .I G ! 574: and ! 575: .I V ! 576: are not permitted in the command list. ! 577: If the command list is empty, `f' is assumed. ! 578: .TP 5 ! 579: h<option> command list ! 580: The until command provides a simple looping mechanism. ! 581: The command list is a newline-terminated command sequence which forms ! 582: the body of the loop; embedded newlines must be escaped with a backslash. ! 583: The option specifies the exit condition for the loop, ! 584: and is specified by the character(s) immediately following the `h': ! 585: .RS ! 586: .IP h[\fIN\fP]t 6 ! 587: The loop is executed until the truth flag is true. ! 588: .PD 0 ! 589: .IP h[\fIN\fP]f 6 ! 590: The loop is executed until the truth flag is false. ! 591: .IP h[\fIN\fP] 6 ! 592: The loop is executed indefinitely. ! 593: .RE ! 594: .PD ! 595: .IP ! 596: The loop condition is tested ! 597: .I after ! 598: execution, so the `ht' and `hf' forms execute at least once. ! 599: .I N ! 600: denotes an optional non-negative number which indicates the ! 601: maximum number of times to execute the loop. ! 602: .TP 5 ! 603: ( \fB. \fR)\|i <text> ! 604: The insert command accepts input text ! 605: and inserts it before the addressed line. ! 606: `\fB.\fR' is left at the last line input; if there were none, ! 607: at the line before the addressed line. ! 608: This command differs from the ! 609: .I a ! 610: command only in the placement of the ! 611: text. ! 612: .TP 5 ! 613: ( \fB.\fR\-1 , \fB. \fR)\|j ! 614: .PD 0 ! 615: .TP 5 ! 616: ( \fB.\fR\-1 , \fB. \fR)\|j\|/replacement/ ! 617: .PD ! 618: The join command collapses all addressed lines into a single line by ! 619: deleting intermediate newlines. ! 620: The ! 621: .I replacement ! 622: (if any) is placed between joined lines. ! 623: Newlines, backslashes `\\', and slashes `/' within ! 624: .I replacement ! 625: must be preceded by a backslash. ! 626: Only slashes may delimit \fIreplacement\fP. ! 627: `\fB.\fP' is left at the resulting line. ! 628: NOTE: The join command in ! 629: .I qed ! 630: has a different default addressing from that in ! 631: .I ed. ! 632: .TP 5 ! 633: ( \fB. \fR)\|k<bname> ! 634: The mark command marks the addressed line with ! 635: the given bname. ! 636: (The bname used in the mark has no relation to any buffer; ! 637: it is just a label.)\ ! 638: The address form `\*q<bname>' ! 639: then addresses this line. ! 640: `\fB.\fR' is not changed. ! 641: The marks are global to ! 642: .I qed\c ! 643: ; marking a line `x' erases any previous mark `x' in any buffer. ! 644: .TP 5 ! 645: ( \fB. \fR, \fB. \fR)\|l ! 646: The list command ! 647: prints the addressed lines in an unambiguous way: ! 648: a tab is printed as `\et', a backspace as `\\b', ! 649: a backslash as `\e\e', ! 650: a non-printing character is ! 651: printed as a backslash followed by three octal digits, ! 652: and a long line is folded, ! 653: with the second and subsequent sub-lines indented one tab stop. ! 654: If the last character in the line is a blank, ! 655: it is followed by `\\n'. ! 656: .TP 5 ! 657: ( \fB. \fR, \fB. \fR)\|L ! 658: The \fIL\fP command ! 659: is similar to the \fIl\fP command, ! 660: but each line displayed is preceded by its line number, ! 661: any marks it has (which appear as `\*q\fIx\fR'), ! 662: and a tab. ! 663: .TP 5 ! 664: ( \fB. \fR, \fB. \fR)\|m\fIa\fR ! 665: The move command repositions the addressed lines after the line ! 666: addressed by ! 667: \fIa\fP. ! 668: The last of the moved lines becomes the current line. ! 669: The address \fIa\fP can also be of the form ! 670: <bname>address, ! 671: in which case the text is moved after the address in the named ! 672: buffer. ! 673: The buffer to which the text was moved becomes the current buffer. ! 674: The original buffer (if different) has `\fB.\fR' left at the line before the moved lines. ! 675: .TP 5 ! 676: n ! 677: The names command displays the bname, ! 678: dollar ! 679: and \fIfilename\fR (in `l' format) of the current buffer and all active buffers. ! 680: If the buffer's changed flag is set, an apostrophe `\*q' is printed ! 681: after the bname. ! 682: The current buffer is indicated by a period `\fB.\fP' before the ! 683: dollar value. ! 684: If present, the ! 685: .I filename ! 686: is preceded by a tab. ! 687: .TP 5 ! 688: N ! 689: The \fIN\fP command is similar to the \fIn\fP command, ! 690: but the display is only given for those buffers ! 691: which have a \fIfilename\fP and for which the changed flag is set. ! 692: .TP 5 ! 693: o\fIps\fP ! 694: The option command allows various options to be set. ! 695: The first argument, \fIp\fP, ! 696: specifies which option is being set. ! 697: The rest of the command, \fIs\fP, ! 698: specifies the setting. ! 699: Most options can be either enabled or disabled; ! 700: \fIs\fP is `s' to set the option, ! 701: or `r' to reset it. ! 702: The following table describes the available options. ! 703: The default setting is shown after the option's letter. ! 704: .RS ! 705: .IP b22p 5 ! 706: Set the length and format of the page printed by the browse command. ! 707: Either the length or the format may be omitted. ! 708: .PD 0 ! 709: .IP "B<null string>" 5 ! 710: Set the default command sequence to be ! 711: performed when a newline command is typed at the terminal. ! 712: The command sequence is set by following the `B' with a newline-terminated ! 713: string. ! 714: If the string is null, the newline command resumes its default behaviour. ! 715: .IP cr 5 ! 716: Set the changed flag of the current buffer. ! 717: .IP dr 5 ! 718: Dualcase search mode ! 719: affects rule one of regular expression construction ! 720: so that a letter is matched without regard to its case. ! 721: .IP er 5 ! 722: Error exit mode causes ! 723: .I qed ! 724: to exit if an error occurs (see the DIAGNOSTICS section). ! 725: This option is mainly intended for use of qed in shell files. ! 726: .IP ir 5 ! 727: Interrupt catching mode causes ! 728: .I qed ! 729: to exit when interrupted. (This includes removing the temporary file). ! 730: .IP pr 5 ! 731: Prompting mode causes `*' to be typed ! 732: immediately before a command (as opposed to text) ! 733: is read from the terminal. ! 734: .IP qr 5 ! 735: Quit catching mode causes ! 736: .I qed ! 737: to dump core, leaving the temporary file intact, ! 738: when a QUIT signal is received. ! 739: .IP Tr 5 ! 740: Tracing mode causes ! 741: all commands not typed directly by the user to be echoed on the terminal. ! 742: When a special character (other than `\eB or `\eN') ! 743: is encountered, a `[' is typed, ! 744: followed by a code specifying the character \(em ! 745: `za' for register `a', `g' for global command list, ! 746: `l' for `\el', `B' for browse pseudo-register, etc. ! 747: Then, an `=' is typed, followed by the interpretation ! 748: of the special character, followed by a `]'. ! 749: .IP us 5 ! 750: Uppercase conversion mode enables case transformation in ! 751: substitute commands. ! 752: If the `u' flag is set, the character caret (`^') ! 753: becomes non-literal in the replacement text of a substitution. ! 754: It behaves just like `&', but with case switching of alphabetics ! 755: in the replaced text. ! 756: If the flag is `u', all alphabetics are mapped to upper case; ! 757: if `l', lower case; and if `s', the case is switched. ! 758: .IP vs 5 ! 759: Verbose mode causes character counts to be typed ! 760: after ! 761: \fIe\fP, ! 762: \fIr\fP, ! 763: \fIw\fP, ! 764: \fIR\fP, ! 765: \fIS\fP, ! 766: and ! 767: .I W ! 768: commands. ! 769: It also causes `!' to be typed upon completion of the \fI!\fR, ! 770: \fI<\fR, \fI|\fR and \fI>\fR commands. ! 771: .IP ?\fIc\fP 5 ! 772: \fIc\fP must be one of ! 773: `c', `d', `i', `p', `T' or `v'. ! 774: The value of the corresponding flag is stored in the truth. ! 775: .PD ! 776: .RE ! 777: .TP 5 ! 778: ( \fB. \fR, \fB. \fR)\|p ! 779: The print command prints the addressed lines. ! 780: `\fB.\fR' is left at the last line printed. ! 781: .TP 5 ! 782: ( \fB. \fR, \fB. \fR)\|P ! 783: The PRINT command is similar to the print command, ! 784: but each line displayed is preceded by its line number, ! 785: any marks it has (which appear as `\*q\fIx\fR'), ! 786: and a tab. ! 787: .TP 5 ! 788: q ! 789: The quit command causes ! 790: .I qed ! 791: to exit. ! 792: No automatic write ! 793: of a file is done. ! 794: If the changed flag is set ! 795: in any buffer, ! 796: .I qed ! 797: prints `?q' ! 798: and refuses to quit. ! 799: A second ! 800: .I q ! 801: or a ! 802: .I Q ! 803: will get out regardless, ! 804: as will an end-of-file ! 805: on the standard input. ! 806: .TP 5 ! 807: Q ! 808: Like ! 809: .IR q , ! 810: but changed flags ! 811: are not checked. ! 812: .TP 5 ! 813: ( $ )\|r filename ! 814: The read command ! 815: reads in the given file after the addressed line. ! 816: If no \fIfilename\fP is given, ! 817: the remembered \fIfilename\fP is used ! 818: (see ! 819: .I e ! 820: and ! 821: .I f ! 822: commands). ! 823: The \fIfilename\fP is remembered if there was not already a ! 824: remembered \fIfilename\fP in the current buffer. ! 825: Address `0' is legal for ! 826: .I r ! 827: and causes the ! 828: file to be read at the beginning of the buffer. ! 829: If ! 830: .I qed ! 831: is in ! 832: .I verbose ! 833: mode and the read is successful, the number of characters ! 834: read is typed, ! 835: except while ! 836: .I qed ! 837: is starting up, ! 838: in which case an ! 839: .I f ! 840: command is performed. ! 841: `\fB.\fR' is left at the last line read in from the file. ! 842: .TP 5 ! 843: R filename ! 844: The restore command restores an environment saved by a save (\fIS\fR) command. ! 845: The changed flag in each buffer is restored from the files; all other flags ! 846: are unaffected. ! 847: The input stack is reset to the top (teletype input) level, ! 848: and the current buffer becomes `a'. ! 849: `\fB.\fP' is left at the saved value of `\fB.\fP' in buffer `a'\fB.\fP ! 850: If the \fIfilename\fP is not specified, `q' is used. ! 851: .TP 5 ! 852: ( \fB. \fR, \fB. \fR)\|s\fIn\fR/regular expression/replacement/ ! 853: .PD 0 ! 854: .TP 5 ! 855: ( \fB. \fR, \fB. \fR)\|s\fIn\fR/regular expression/replacement/g ! 856: .PD ! 857: The substitute command searches each addressed ! 858: line for occurrences of the specified regular expression. ! 859: The decimal number \fIn\fP defaults to 1 if missing. ! 860: On each line in which ! 861: .I n ! 862: matches are found, ! 863: the \fIn\fPth matched string is replaced with ! 864: \fIreplacement\fP. ! 865: If the global replacement indicator `g' follows the command, ! 866: all subsequent matches on the line are also replaced. ! 867: Within a line, a search starts from the character following the last match, ! 868: unless the last match was an empty string, ! 869: in which case the search starts at ! 870: the second character following the empty string ! 871: (to ensure a match is not repeated). ! 872: It is an error for the substitution to fail on all addressed lines ! 873: unless it is in a global command. ! 874: `\fB.\fR' is left at the last line substituted. ! 875: .PP ! 876: .RS ! 877: Any character other than newline or a numeral ! 878: may be used instead of `/' to delimit the regular expression ! 879: and \fIreplacement\fP. ! 880: If the trailing delimiter is missing ! 881: (i.e., an unescaped newline ! 882: in the ! 883: .IR replacement ), ! 884: its presence is assumed, ! 885: and the last line affected is printed, ! 886: as if the ! 887: substitute ! 888: was followed by a ! 889: .I p ! 890: command. ! 891: If delimiter following the expression ! 892: is omitted as well, ! 893: an empty ! 894: .I replacement ! 895: is assumed. ! 896: .PP ! 897: An ampersand `&' appearing in \fIreplacement\fP ! 898: is replaced by the string matching the regular expression. ! 899: As a more general feature, ! 900: the characters ! 901: `\\\fIn\fR', ! 902: where ! 903: .I n ! 904: is a digit, ! 905: are replaced by the text matched by the ! 906: \fIn\fR-th ! 907: regular subexpression ! 908: enclosed between `\e\|(' and `\e\|)'. ! 909: When nested parenthesized subexpressions are present, ! 910: .I n ! 911: is determined by counting occurrences of `\e\|(' starting from the left. ! 912: .PP ! 913: A caret `^' appearing in \fIreplacement\fP ! 914: behaves much like an ampersand, ! 915: but provides a mechanism for case switching of alphabetics, ! 916: as discussed under the \fIo\fR command. ! 917: To include an ampersand `&', caret `^', backslash `\\', newline, ! 918: or the delimiter literally in ! 919: \fIreplacement\fP, ! 920: the character must be preceded by a backslash. ! 921: Lines may be split by substituting newline characters into them. ! 922: .RE ! 923: .TP 5 ! 924: S filename ! 925: The save command saves the full buffer and register information in two ! 926: files called `filename:aq' and `filename:bq'. ! 927: If the filename is absent, `q' is used. ! 928: If the filename has more than 12 characters after the last slash `/', ! 929: it is truncated to 12 characters to avoid overwriting the file. ! 930: .TP 5 ! 931: ( \fB.\fR , \fB.\fR )\|t\fIa\fR ! 932: The copy command acts just like the move ! 933: .I m ! 934: command except that a copy of the addressed lines is placed after address ! 935: \fIa\fP. ! 936: `\fB.\fR' is left on the last line of the copy. ! 937: The buffer to which the text was copied becomes the current buffer. ! 938: .TP 5 ! 939: u ! 940: The undo command restores the last line changed by a ! 941: \fIs\fP, ! 942: \fIu\fP, ! 943: or ! 944: .I x ! 945: command. ! 946: Any new lines created by splitting the original are left. ! 947: It is an error if the line is not in the current buffer. ! 948: `\fB.\fP' is left at the restored line. ! 949: .TP 5 ! 950: ( 1 , $ )\|v/regular expression/command list ! 951: This command is the same as the global command ! 952: except that the command list is executed ! 953: with `\fB.\fR' initially set to every line ! 954: .I except ! 955: those ! 956: matching the regular expression. ! 957: .TP 5 ! 958: V/regular expression/command list ! 959: This command is the same as the globuf command ! 960: except that the command list is executed ! 961: with the current buffer initially set to every active buffer ! 962: .I except ! 963: those ! 964: matching the regular expression. ! 965: .TP 5 ! 966: ( 1 , $ )\|w filename ! 967: The write command writes the addressed lines onto ! 968: the given file. ! 969: If the file does not exist, ! 970: it is created. ! 971: The filename is remembered if there was not already a ! 972: remembered file name in the current buffer. ! 973: If no file name is given, ! 974: the remembered file name is used. ! 975: `\fB.\fR' is unchanged. ! 976: If ! 977: .I qed ! 978: is in ! 979: .I verbose ! 980: mode and ! 981: the command is successful, the number of characters written is ! 982: typed. ! 983: .TP 5 ! 984: ( 1 , $ )\|W ! 985: The \fIW\fP command is the same as the \fIw\fP command except that ! 986: the addressed lines are appended to the file. ! 987: .PP ! 988: .TP 5 ! 989: ( \fB. \fR, \fB. \fR)\|x ! 990: .RS ! 991: The xform command allows one line at a time to be modified according to ! 992: graphical requests. ! 993: The line to be modified is typed out, ! 994: and then the modify request is read from the terminal ! 995: (even if the xform command is in a global command or other ! 996: nested input source). ! 997: Generally each character in the request specifies how to ! 998: modify the character immediately above it, in the original line, ! 999: as described in the following table. ! 1000: .IP # 5 ! 1001: Delete the above character. ! 1002: .PD 0 ! 1003: .IP % 5 ! 1004: Replace the above character with a space. ! 1005: .IP ^ 5 ! 1006: Insert the rest of the request line before the above character. ! 1007: If the rest of the request line is empty, insert a newline character. ! 1008: .IP $ 5 ! 1009: Delete the characters in the above line from this position on; ! 1010: replace them with the rest of the request line. ! 1011: .IP "space or tab:" 5 ! 1012: Leave above character(s) unchanged. ! 1013: .IP "any other:" 5 ! 1014: This character replaces the one above it. ! 1015: .PD ! 1016: .PP ! 1017: If the request line is longer than the line to be modified, ! 1018: the overhang is added to the end of the line ! 1019: without interpretation, ! 1020: that is, without treating `#', `%', `^' or `$' specially. ! 1021: Any characters after a `^' or `$' request are not interpreted either. ! 1022: .PP ! 1023: Xform will not process control characters other ! 1024: than tab and newline, ! 1025: except in contexts where it need not know their width ! 1026: (that is, after a `^' or `$' request, or in the part of ! 1027: either the request or the line that overhangs the other). ! 1028: Remember that the ERASE character (processed by the system) ! 1029: erases the last character typed, ! 1030: not the last column. ! 1031: .PP ! 1032: Some characters take more than one column of the terminal ! 1033: to enter or display. ! 1034: For example, entering the ERASE or KILL characters literally ! 1035: takes two columns because they must be escaped. ! 1036: To delete a multi-column character, ! 1037: one must type `#' under all its columns. ! 1038: To replace a multicolumn character, ! 1039: the replacement must be typed under the first column of the character. ! 1040: Similarly, if a replacement character is multi-columned, ! 1041: it replaces the character in its first column. ! 1042: .PP ! 1043: The tab character prints as a sequence of spaces, and may be ! 1044: modified as if it were that sequence. ! 1045: As long as the last space is unmodified, it and the ! 1046: remaining contiguous spaces will represent a tab. ! 1047: .PP ! 1048: The modification process is repeated until the request is empty. ! 1049: Only a newline may immediately follow the `x'. ! 1050: .RE ! 1051: .TP 5 ! 1052: y<condition><type> ! 1053: The jump command controls execution nested input sources. ! 1054: The condition is compared to the truth flag to see if the jump ! 1055: should be performed; ! 1056: if a `t', the jump is performed if the truth flag is true, ! 1057: if an `f', the jump is performed if the truth flag is false, ! 1058: if absent the jump is always performed. ! 1059: Several types of jumps exist: ! 1060: .RS ! 1061: .IP y[tf]o ! 1062: Jump out of the current input source. ! 1063: If the current input source is the command line ! 1064: for a \fIg\fR, \fIG\fP, \fIv\fR, \fIV\fR or \fIh\fR command, the command is terminated. ! 1065: .PD 0 ! 1066: .IP y[tf]\fIN\fR ! 1067: Control is transferred to absolute line \fIN\fR (an integer) ! 1068: in the executing buffer. ! 1069: The current input source must be a buffer. ! 1070: .IP y[tf]\(aa<label> ! 1071: Control is transferred to the first line found, ! 1072: searching forward in the buffer, ! 1073: that begins with a comment "<label>. ! 1074: The match of the labels must be exact; ! 1075: regular expressions are not used to define the control label. ! 1076: (A tab, blank or newline after the double quote specifies a null label: ! 1077: a line beginning `"\ \ LAB' cannot be transferred to by this form of jump.)\ ! 1078: If no such label is found, ! 1079: control resumes at the character after the label in the jump command. ! 1080: The current input source must be a buffer. ! 1081: .IP y[tf]\(ga<label> ! 1082: Similar to `y\(aa<label>', ! 1083: but the search is in the opposite (reverse) direction. ! 1084: .IP y[tf] ! 1085: If no ! 1086: recognized type is given, ! 1087: input is skipped up to the next newline. ! 1088: .PD ! 1089: .RE ! 1090: .IP ! 1091: It is an error if reading the label or line number for a jump command ! 1092: causes the current input source (i.e. buffer) to be `popped.'\ ! 1093: This can happen if the label is the last word in the buffer, ! 1094: but can be circumvented by putting an extra blank or newline after ! 1095: the jump command. ! 1096: .TP 5 ! 1097: ( \fB.\fR , \fB.\fR )\|z\fIXc\fR ! 1098: \fIQed\fP has 56 registers labeled by bnames. ! 1099: Three of these, ! 1100: registers `T', `C', and `U', ! 1101: are reserved: ! 1102: `T' is the truth flag, `C' is the count, ! 1103: `U' contains the ! 1104: .SM UNIX ! 1105: command from the most recent ! 1106: bang, crunch, zap, or pipe command. ! 1107: The contents of register \fIX\fP, ! 1108: where \fIX\fR is a bname, ! 1109: can be inserted into the input ! 1110: stream with the special character ``\ez\fIX\fP''. ! 1111: The command ``z\fIX\fR'' ! 1112: specifies register \fIX\fR ! 1113: as the argument to ! 1114: the operation character (signified above by \fIc\fR) that follows it. ! 1115: In the description below, ! 1116: \fIN\fR stands for a possibly signed decimal integer ! 1117: and \fIS\fR stands for a newline-terminated string. ! 1118: Newlines may be embedded in registers by escaping ! 1119: them with a backslash. ! 1120: Although some of the register commands refer to addressed lines, ! 1121: `\fB.\fP' is unaffected by a ! 1122: .I z ! 1123: command. ! 1124: The operations are as follows: ! 1125: .RS ! 1126: .IP p ! 1127: Print the contents of the register in `p' format. ! 1128: .PD 0 ! 1129: .IP l ! 1130: Print the contents of the register in `l' format. ! 1131: .IP \fB.\fP ! 1132: Set the register to the contents of the addressed line. ! 1133: .IP /reg-exp/ ! 1134: Set the register to the portion of ! 1135: current line that matches the regular expression in slashes. ! 1136: If no such pattern is found, ! 1137: the register is cleared. ! 1138: The truth flag is set according to whether a ! 1139: match was found. ! 1140: .IP \fB:\fR\fIS\fR ! 1141: Set register to the string following the colon. ! 1142: .IP \&\(aa\fIY\fR ! 1143: Make a direct copy of register \fIY\fR in register \fIX\fR, ! 1144: without interpreting special characters. ! 1145: \fIY\fR is any register bname. ! 1146: .IP +\fIN\fR ! 1147: Increment by \fIN\fR the ASCII value of each character in the register. ! 1148: Similarly, a `\-' decrements each character. ! 1149: .IP =\fIS\fR ! 1150: (Or `<' or `>' or `!=' or `!<' or `!>'.)\ ! 1151: Set truth flag to the result of the lexical comparison ! 1152: of the register and the string \fIS\fR. ! 1153: .IP n ! 1154: Set the count to the length of the register. ! 1155: .IP )\|\fIN\fR ! 1156: (Or '('.)\ ! 1157: `Take' ! 1158: the first \fIN\fR characters of the register, i.e. truncate at the \fIN\fR+1'th ! 1159: character. ! 1160: `(' (`drop') is the complementary operator; ! 1161: it deletes the first \fIN\fP characters from the register. ! 1162: If \fIN\fP is negative, the break point is |\|\fIN\fP| from the end. ! 1163: .IP [/reg-exp/ ! 1164: Set the count to the starting index of the regular expression in ! 1165: the register. ! 1166: Set the truth to whether the expression matches any of the register. ! 1167: .IP s\fIn\fP/reg-exp/replacement/ ! 1168: .IP s\fIn\fP/reg-exp/replacement/g ! 1169: Perform a substitute command with semantics identical to the \fIs\fR command, ! 1170: but in the text of the register, not a line of the buffer. ! 1171: .IP C ! 1172: `Clean' the register: collapse each occurrence of `white space' in the register ! 1173: to a single blank, and delete initial and trailing white space. ! 1174: .IP {\|\fIS\fR ! 1175: Set the register to the value of the shell environment variable \fIS\fR, ! 1176: whose name may be terminated by a space, tab, newline or `}'. ! 1177: .PD ! 1178: .PP ! 1179: The registers can also be manipulated as decimal numbers. ! 1180: Numerical operations are indicated by a number sign `#' ! 1181: after the register name: ! 1182: e.g. `zx#+2'. ! 1183: It is an error to attempt to perform arithmetic on a ! 1184: register containing non-numeric text other than a leading minus sign. ! 1185: The numerical operations are: ! 1186: .IP a ! 1187: Set the value of the register to be the value of ! 1188: the address given to the command; e.g. `$za#a' sets register `a' ! 1189: to the number of lines in the buffer. ! 1190: .PD 0 ! 1191: .IP r ! 1192: Set register \fIX\fR to be the first address ! 1193: given the command, ! 1194: and \fIX\fR+1 to be the second. If \fIX\fR is `~', an error is generated. ! 1195: For example, `5,$zi#r' sets register `i' to 5, and ! 1196: register `j' to the value of `$'. ! 1197: `\fB.\fP' is unchanged. ! 1198: This command is usually used to pass addresses to a command buffer. ! 1199: .IP n ! 1200: Set register to the length of the addressed line. ! 1201: .IP \fB:\fIN\fR ! 1202: Set register to \fIN\fR. ! 1203: Scanning of the number stops at the first non-numeric character, ! 1204: not at the end of the line. ! 1205: .IP +\fIN\fR ! 1206: Increment register by \fIN\fR. `\-', `*', `/', and `%' ! 1207: decrement, multiply, divide, or modulo the register by \fIN\fR. ! 1208: .IP P ! 1209: Set register to the decimal value of the process id of ! 1210: .I qed. ! 1211: .IP =\fIN\fR ! 1212: (Or `<' or `>' or `!=' or `!<' or `!>'.)\ ! 1213: Set truth flag to the result of the numeric comparison of the register ! 1214: and the number ! 1215: .I N. ! 1216: .PD ! 1217: .PP ! 1218: Several numerical operations may be combined in one command ! 1219: (and it is more efficient to do so when possible.) ! 1220: For example, `$zd#a\-3' sets register `d' to three less than the value ! 1221: of `$'. ! 1222: .RE ! 1223: .TP 5 ! 1224: Z ! 1225: The zero command clears the current buffer. ! 1226: The contents, filename and all flags for the buffer are zeroed. ! 1227: The character after the `Z' must be a blank, tab or newline. ! 1228: .TP 5 ! 1229: ( $ )\|= ! 1230: The line number of the addressed line is typed. ! 1231: `\fB.\fR' is unchanged. ! 1232: .TP 5 ! 1233: !\|<\s-2UNIX\s+2 command> ! 1234: The bang command sends the ! 1235: command line after the `!' ! 1236: to the UNIX shell to be interpreted as a command. ! 1237: Embedded newlines must be preceded by a backslash. ! 1238: The signals INTR, QUIT, and HUP are enabled or disabled ! 1239: as on entry to ! 1240: \fIqed\fP. ! 1241: At the completion of the command, ! 1242: if ! 1243: .I qed ! 1244: is in ! 1245: .I verbose ! 1246: mode, an `!' is typed. ! 1247: The return status of the command is stored in the truth flag. ! 1248: `\fB.\fR' is unchanged. ! 1249: .IP ! 1250: The ! 1251: command line ! 1252: is stored in register `U'. ! 1253: If a second `!' immediately follows the first, ! 1254: it is replaced with the uninterpreted contents ! 1255: of this register. ! 1256: Thus `!!' repeats the most recent bang command, ! 1257: and `!! \(or wc' ! 1258: repeats the command with an additional pipeline element added. ! 1259: .TP 5 ! 1260: ( 1 , $ )\|>\|<\s-2UNIX\s+2 command> ! 1261: The zap command is similar ! 1262: to the bang command, ! 1263: but the addressed lines become the default standard input of the command. ! 1264: The command is stored in register `U', ! 1265: as for bang; ! 1266: `>>' corresponds to `!!'. ! 1267: .TP 5 ! 1268: ( $ )\|<\|<\s-2UNIX\s+2 command> ! 1269: The crunch command is similar to the bang command, ! 1270: but the standard output of the command is appended to the current buffer ! 1271: after the addressed line, as though read with an \fIr\fR command ! 1272: from a temporary file. ! 1273: The command is stored in register `U' ! 1274: as for bang; ! 1275: `<<' corresponds to `!!'. ! 1276: `\fB.\fP' is left at the last line read. ! 1277: .TP 5 ! 1278: ( 1 , $ )\||\|<\s-2UNIX\s+2 command> ! 1279: The pipe command is similar to the bang command, ! 1280: but the addressed lines become the default standard input of the command, ! 1281: and are replaced by the standard output of the command. ! 1282: The command is stored in register `U' ! 1283: as for bang; ! 1284: `|\||' corresponds to `!!'. ! 1285: If the command returns non-zero status, the original lines are not deleted. ! 1286: `\fB.\fP' is left at the last line read. ! 1287: .TP 5 ! 1288: ( \fB.\fR )" ! 1289: The comment command sets dot to the addressed line, and ignores ! 1290: the rest of the line up to the first following double quote or newline. ! 1291: If, however, the character immediately after the double quote is ! 1292: a second double quote (i.e. the command is ``""''), ! 1293: the text which would normally be ignored is typed on the standard output. ! 1294: Special characters in the text will be interpreted, whether or not ! 1295: the text is printed, ! 1296: so to print a message such as ``Type \\bx'' requires the command ! 1297: ``"\|"\|Type \\cbx''. ! 1298: Commented lines are used as labels by the ! 1299: .I y ! 1300: (jump) command. ! 1301: .TP 5 ! 1302: % ! 1303: The register print command displays the name and value of all defined ! 1304: registers, ! 1305: followed by the \\p (`P') and \\r (`R') pseudo-registers, ! 1306: and the browse (`B') pseudo-register, if defined. ! 1307: .TP 5 ! 1308: # ! 1309: The numeric register print command displays the name and value of all ! 1310: defined registers with numeric values. ! 1311: .TP 5 ! 1312: ( \fB.\fR+1 , \fB.\fR+1 )<newline> ! 1313: An address or addresses alone on a line ! 1314: cause the addressed lines to be printed. ! 1315: If the last address separator before the newline was `;', ! 1316: only the final addressed line is printed. ! 1317: A blank line alone causes the contents of the ! 1318: browse pseudo-register (described with the ! 1319: .I o ! 1320: command) to be executed. ! 1321: If the register is null, as it is initially, ! 1322: the newline command behaves as though the register contains ! 1323: `\fB.\fP+1p'. ! 1324: .PP ! 1325: .ul ! 1326: Special Characters ! 1327: .PP ! 1328: \fIQed\fP has some special character sequences with non-literal ! 1329: interpretations. ! 1330: These sequences are processed at the ! 1331: .I lowest ! 1332: level of input, so their interpretation is completely transparent ! 1333: to the actual commands. ! 1334: Whenever input from the user is expected, a special character can appear and ! 1335: will be processed. ! 1336: Special characters can be nested in the sense that, for example, ! 1337: a buffer invoked by `\eb' can contain a register invocation `\e\|z'. ! 1338: Backslashed escape sequences such as `\e\|(' in regular expressions ! 1339: are ! 1340: .I not ! 1341: special characters, so are not interpreted at input. ! 1342: The sequence `\e\|(' is left untouched by the input mechanism of ! 1343: .I qed; ! 1344: any special meaning it receives is given it during regular expression ! 1345: processing. ! 1346: The special characters are: ! 1347: .RS ! 1348: .IP \eb<bname> ! 1349: The `b' must be followed by a bname. ! 1350: When `\eb\fIX\fR' is typed, ! 1351: the contents of buffer \fIX\fR, up to but \fInot including\fP the last ! 1352: newline, are read as if they were entered from the keyboard. ! 1353: Typically, the missing newline is replaced by the newline which ! 1354: appears after the buffer invocation. ! 1355: Changing the contents of an executing buffer may have bizarre effects. ! 1356: .PD 0 ! 1357: .IP \e\|B ! 1358: Equivalent to current buffer's bname. ! 1359: .IP \ec ! 1360: The sequence \ec is replaced by a single backslash, ! 1361: which is not re-scanned. ! 1362: The effect of the `c' is to delay interpretation of a special ! 1363: character. ! 1364: .IP \e\|f ! 1365: Equivalent to current buffer's file name. ! 1366: .IP \e\|F<bname> ! 1367: Equivalent to the file name in the named buffer. ! 1368: .IP \e\|l ! 1369: One line is read from the standard input up to, but \fInot including\fP ! 1370: the terminal newline, which is discarded. ! 1371: Note that the first invocation will read the remainder of the last ! 1372: line entered from the keyboard. ! 1373: For example, if a buffer is invoked by typing the line: ! 1374: .br ! 1375: .ti +5 ! 1376: \ebxjunk ! 1377: .br ! 1378: the first \e\|l in buffer `x' will return the string `junk'. ! 1379: .IP \e\|N ! 1380: Equivalent to a newline. ! 1381: Primarily useful when delayed. ! 1382: .IP \ep ! 1383: Equivalent to the most recent regular expression used. ! 1384: .IP \e\|r ! 1385: Equivalent to the replacement text of ! 1386: the most recent substitute or join command. ! 1387: .IP \e\|z<bname> ! 1388: Equivalent to the contents of register `\e\|z\fIX\fR'. ! 1389: If the register changes during execution, the changes appear immediately ! 1390: and affect execution. ! 1391: If a `+' (`\-') appears between the `z' and the bname, ! 1392: the ASCII values of the characters in the register are ! 1393: incremented (decremented) by one before interpretation. ! 1394: If a `#' precedes the `+' (`\-') ! 1395: the contents of the register are numerically incremented (decremented). ! 1396: .IP \e" ! 1397: The sequence \e" means `no character at all'! ! 1398: It is primarily used to delay interpretation of a period ! 1399: that terminates an append, until the second or third time ! 1400: it is read (e.g. in loading execution buffers): ! 1401: the sequence \ec"\fB.\fP at the beginning of a line ! 1402: puts a period on the line which will terminate ! 1403: an append the second time it is read. ! 1404: .IP \e\*q[bfFlprz]\ ! 1405: If an apostrophe ! 1406: appears between the backslash and the identifying character ! 1407: for one of the special characters `\eb', `\e\|f', `\e\|F', `\e\|l', `\e\|p', ! 1408: `\e\|r' or `\e\|z', interpretation is as usual except that ! 1409: any further special characters \fIembedded\fP ! 1410: in the buffer, register, etc. are \fInot\fP interpreted. ! 1411: Actually, any special character may be quoted, but in forms such as ! 1412: `\e\*q\|B', the quote has no effect. ! 1413: .RE ! 1414: .PD ! 1415: .PP ! 1416: A special character is interpreted immediately when it appears ! 1417: in the input stream, ! 1418: whether it is currently coming from ! 1419: the teletype, a buffer, a register, etc. ! 1420: (This includes characters read when typing a special character: ! 1421: `\e\*qb\eza', with register `a' containing the character `X', ! 1422: invokes the literal contents of buffer `X'.)\ ! 1423: Thus, interpretation is recursive unless the special character ! 1424: is `\ec'. ! 1425: Special characters appearing in text processed in a command such ! 1426: as move, read or write, are \fInot\fP interpreted. ! 1427: If the backslash-character pair is not a special character ! 1428: from the above list, it is passed unchanged. ! 1429: Interpretation may be delayed using `\ec'; for example, ! 1430: if a `\ebx' is to be appended to a buffer for later interpretation, ! 1431: the user must type `\ecbx'. ! 1432: To delay interpretation \fIn\fP times, \fIn\fP c's must be placed between the ! 1433: backslash and the identifying character. ! 1434: In regular expressions and substitutes, ! 1435: a backslash preceding a metacharacter turns off its special meaning. ! 1436: Even in these cases, ! 1437: a backslash preceding an ordinary character is not deleted, ! 1438: unlike in \fIed\fP. ! 1439: For example, since the `g' command must read its entire line, ! 1440: a `\e\|zx' in a substitute driven by a global must be delayed ! 1441: if the contents of the register are to be different for each line, ! 1442: but since `\e&' is not a special character except to the substitute, ! 1443: its interpretation need not be delayed: ! 1444: .sp ! 1445: .in +5 ! 1446: zA#:1 ! 1447: .br ! 1448: g/\|\e$/ s\|/\|\e.xyz\|/\|\eczA \e&/p zA#+1 ! 1449: .sp ! 1450: .in ! 1451: globally searches for lines with a literal currency sign, ! 1452: and on each one substitutes for `.xyz' the contents ! 1453: of register `A' ! 1454: at the time of substitution, ! 1455: followed by a space and a literal ampersand, ! 1456: prints the result and increments register `A'. ! 1457: As a second example, the substitute ! 1458: .ti +5 ! 1459: .sp ! 1460: s\|/xyz\|/\|\e\e\|N&/ ! 1461: .sp ! 1462: replaces `xyz' with a newline followed by `xyz'. ! 1463: Note that the `\e\e\|N' is interpreted as ! 1464: `backslash followed by newline,' ! 1465: as the sequence `\\\\' ! 1466: .ft I ! 1467: has no special meaning in qed ! 1468: .ft R ! 1469: outside of regular expressions ! 1470: and replacement text. ! 1471: However, ! 1472: to match, say, `\e\e\|z' using a regular expression, it must be entered ! 1473: as `\e\e\ecz'. ! 1474: .PP ! 1475: .PP ! 1476: If an interrupt signal (ASCII DEL) is sent, ! 1477: .I qed ! 1478: prints `??' and returns to its command level. ! 1479: If a hangup signal is received, ! 1480: .I qed ! 1481: executes the command `S qed.hup'. ! 1482: .PP ! 1483: Some size limitations: ! 1484: 512 characters per line, ! 1485: 256 characters per global command list, ! 1486: 1024 characters of string storage area, ! 1487: used for storing registers, file names and regular expressions, ! 1488: 16 levels of input nesting, ! 1489: and 128K characters in the temporary file. ! 1490: The limit on the number of lines depends on the amount of core: ! 1491: each line takes 1 word. ! 1492: .SH FILES ! 1493: /tmp/q#, temporary; ! 1494: `#' is the process number (six decimal digits). ! 1495: .SH DIAGNOSTICS ! 1496: Diagnostics are in the form of `?' followed by a single letter code. ! 1497: If the diagnostic is because of an inaccessible file, ! 1498: the offending file name is also displayed. ! 1499: If input is not from the highest level (i.e. the standard input, ! 1500: usually the terminal), a traceback is printed, starting with the ! 1501: lowest level. ! 1502: The elements of the traceback ! 1503: are of the form ?b\fIXM.N\fR or ?z\fIXN\fR, ! 1504: where \fIX\fR is the buffer or register being executed when the ! 1505: error was encountered, ! 1506: \fIM\fR is the line number in the buffer and \fIN\fR is the character ! 1507: number in the line or register. ! 1508: The possible errors are: ! 1509: .PD 0 ! 1510: .IP 0 ! 1511: non-zero status return in \fI|\fR command ! 1512: .IP F ! 1513: bad bname for \e\|F ! 1514: .IP G ! 1515: nested globuf commands ! 1516: .IP N ! 1517: last line of input did not end with newline ! 1518: .IP O ! 1519: unknown option in the \fIo?c\fP command ! 1520: .IP R ! 1521: restore (\fIR\fR) command failed ! 1522: (file not found or bad format) ! 1523: .IP T ! 1524: I/O error or overflow in tempfile ! 1525: .IP Z ! 1526: out of string space; clear a few registers or file names ! 1527: .IP a ! 1528: address syntax ! 1529: .IP b ! 1530: bad bname in a \fIb\fR command or for \\b ! 1531: .IP c ! 1532: ran out of core ! 1533: .IP f ! 1534: filename syntax error ! 1535: .IP g ! 1536: nested global commands ! 1537: .IP i ! 1538: more than 52 files in initialization argument list ! 1539: .IP k ! 1540: bad bname in \fIk\fR command ! 1541: .IP l ! 1542: an internal table length was exceeded ! 1543: .IP m ! 1544: tried to move to an illegal place (e.g. 1,6m4) ! 1545: .IP o ! 1546: error opening or creating a file ! 1547: .IP p ! 1548: bad regular expression (pattern) syntax ! 1549: .IP q ! 1550: .I e ! 1551: with the current changed flag set, ! 1552: or ! 1553: .I q ! 1554: with any changed flag set ! 1555: .IP r ! 1556: read error from file ! 1557: .IP s ! 1558: no substitutions found ! 1559: .IP t ! 1560: bad \fIx\fR command data or single-case terminal ! 1561: .IP u ! 1562: no line for \fIu\fR command to undo ! 1563: .IP x ! 1564: command syntax error ! 1565: .IP w ! 1566: write error on file ! 1567: .IP y ! 1568: bad jump command (including popping the input buffer while scanning the label) ! 1569: .IP z ! 1570: bad register bname ! 1571: .IP | ! 1572: failure to create pipe for \fI<\fR, \fI|\fR or \fI>\fR command ! 1573: .IP # ! 1574: bad numeric register operation ! 1575: .IP $ ! 1576: line address out of range ! 1577: .IP ? ! 1578: interrupt ! 1579: .IP / ! 1580: line search failed ! 1581: .IP [ ! 1582: bad index in a register take or drop command ! 1583: .IP \e ! 1584: attempt to recursively append a buffer ! 1585: .IP ! ! 1586: jackpot \(em you found a bug in regular expression matching ! 1587: .PD ! 1588: .PP ! 1589: .SH "SEE ALSO" ! 1590: qedbufs(1) ! 1591: .br ! 1592: A Tutorial Introduction to the ED Text Editor ! 1593: (B. W. Kernighan) ! 1594: .br ! 1595: Programming in ! 1596: .IR Qed : ! 1597: a Tutorial ! 1598: (Robert Pike) ! 1599: .br ! 1600: ed(1) ! 1601: .SH "U of T INFO" ! 1602: Written at U of T, ! 1603: based on several incarnations of ! 1604: .I ed, ! 1605: with contributions from ! 1606: Tom Duff, Robert Pike, Hugh Redelmeier and David Tilbrook. ! 1607: .SH BUGS ! 1608: The changed flag is not omniscient; changing the contents of ! 1609: the file outside of ! 1610: .I qed ! 1611: will fool it. ! 1612: .br ! 1613: Xform \fIcould\fP work on single-case terminals, but backslashes ! 1614: become very confusing for the user. ! 1615: .br ! 1616: On the PDP-11, numeric registers are 16-bit integers, but the ! 1617: count is a 32-bit integer.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.