|
|
1.1 ! root 1: .TH SAM 1 ! 2: .ds a \fR*\ \fP ! 3: .SH NAME ! 4: sam, B, sam.save \- screen editor with structural regular expressions ! 5: .SH SYNOPSIS ! 6: .B sam ! 7: [ ! 8: .I option ... ! 9: ] [ ! 10: .I files ! 11: ] ! 12: .PP ! 13: .B sam ! 14: .B -r ! 15: .I machine ! 16: .PP ! 17: .B sam.save ! 18: .PP ! 19: .B B ! 20: [ ! 21: .BI -nnnn ! 22: ] ! 23: .I file ... ! 24: .SH DESCRIPTION ! 25: .I Sam ! 26: is a multi-file editor. ! 27: It modifies a local copy of an external file. ! 28: The copy is here called a ! 29: .IR file . ! 30: The files are listed in a menu available through mouse button 3 ! 31: or the ! 32: .B n ! 33: command. ! 34: Each file has an associated name, usually the name of the ! 35: external file from which it was read, and a `modified' bit that indicates whether ! 36: the editor's file agrees with the external file. ! 37: The external file is not read into ! 38: the editor's file until it first becomes the current file\(emthat to ! 39: which editing commands apply\(emwhereupon its menu entry is printed. ! 40: The options are ! 41: .TF -rmachine ! 42: .TP ! 43: .B -d ! 44: Do not `download' the terminal part of ! 45: .IR sam . ! 46: Editing will be done with the command language only, as in ! 47: .IR ed (1). ! 48: .TP ! 49: .BI -r " machine ! 50: Run the host part remotely ! 51: on the specified machine, the terminal part locally. ! 52: .TP ! 53: .BI -s " path ! 54: Start the host part from the specified file on the remote host. ! 55: Only meaningful with the ! 56: .BI -r ! 57: option. ! 58: .TP ! 59: .BI -t " path ! 60: Start the terminal part from the specified file. Useful ! 61: for debugging. ! 62: .PD ! 63: .SS Regular expressions ! 64: Regular expressions are as in ! 65: .IR regexp (6) ! 66: with the addition of ! 67: .BR \en ! 68: to represent newlines. ! 69: A regular expression may never contain a literal newline character. ! 70: The empty ! 71: regular expression stands for the last complete expression encountered. ! 72: A regular expression in ! 73: .I sam ! 74: matches the longest leftmost substring formally ! 75: matched by the expression. ! 76: Searching in the reverse direction is equivalent ! 77: to searching backwards with the catenation operations reversed in ! 78: the expression. ! 79: .SS Addresses ! 80: An address identifies a substring in a file. ! 81: In the following, `character ! 82: .IR n ' ! 83: means the null string ! 84: after the ! 85: .IR n -th ! 86: character in the file, with 1 the ! 87: first character in the file. ! 88: `Line ! 89: .IR n ' ! 90: means the ! 91: .IR n -th ! 92: match, ! 93: starting at the beginning of the file, of the regular expression ! 94: .LR .*\en? . ! 95: All files always have a current substring, called dot, ! 96: that is the default address. ! 97: .SS Simple Addresses ! 98: .PD0 ! 99: .TP ! 100: .BI # n ! 101: The empty string after character ! 102: .IR n ; ! 103: .B #0 ! 104: is the beginning of the file. ! 105: .TP ! 106: .I n ! 107: Line ! 108: .IR n ; ! 109: .B 0 ! 110: is the beginning of the file. ! 111: .TP ! 112: .BI / regexp / ! 113: .PD0 ! 114: .TP ! 115: .BI ? regexp ? ! 116: The substring that matches the regular expression, ! 117: found by looking toward the end ! 118: .RB ( / ) ! 119: or beginning ! 120: .RB ( ? ) ! 121: of the file, ! 122: and if necessary continuing the search from the other end to the ! 123: starting point of the search. ! 124: The matched substring may straddle ! 125: the starting point. ! 126: When entering a pattern containing a literal question mark ! 127: for a backward search, the question mark should be ! 128: specified as a member of a class. ! 129: .PD ! 130: .TP ! 131: .B 0 ! 132: The string before the first full line. ! 133: This is not necessarily ! 134: the null string; see ! 135: .B + ! 136: and ! 137: .B - ! 138: below. ! 139: .TP ! 140: .B $ ! 141: The null string at the end of the file. ! 142: .TP ! 143: .B . ! 144: Dot. ! 145: .TP ! 146: .B \&' ! 147: The mark in the file (see the ! 148: .B k ! 149: command below). ! 150: .TP ! 151: \fL"\f2regexp\fL"\f1\f1 ! 152: Preceding a simple address (default ! 153: .BR . ), ! 154: refers to the address evaluated in the unique file whose menu line ! 155: matches the regular expression. ! 156: .PD ! 157: .SS Compound Addresses ! 158: In the following, ! 159: .I a1 ! 160: and ! 161: .I a2 ! 162: are addresses. ! 163: .TF a1+a2 ! 164: .TP ! 165: .IB a1 + a2 ! 166: The address ! 167: .I a2 ! 168: evaluated starting at the end of ! 169: .IR a1 . ! 170: .TP ! 171: .IB a1 - a2 ! 172: The address ! 173: .I a2 ! 174: evaluated looking in the reverse direction ! 175: starting at the beginning of ! 176: .IR a1 . ! 177: .TP ! 178: .IB a1 , a2 ! 179: The substring from the beginning of ! 180: .I a1 ! 181: to the end of ! 182: .IR a2 . ! 183: If ! 184: .I a1 ! 185: is missing, ! 186: .B 0 ! 187: is substituted. ! 188: If ! 189: .I a2 ! 190: is missing, ! 191: .B $ ! 192: is substituted. ! 193: .TP ! 194: .IB a1 ; a2 ! 195: Like ! 196: .IB a1 , a2\f1, ! 197: but with ! 198: .I a2 ! 199: evaluated at the end of, and dot set to, ! 200: .IR a1 . ! 201: .PD ! 202: .PP ! 203: The operators ! 204: .B + ! 205: and ! 206: .B - ! 207: are high precedence, while ! 208: .B , ! 209: and ! 210: .B ; ! 211: are low precedence. ! 212: .PP ! 213: In both ! 214: .B + ! 215: and ! 216: .B - ! 217: forms, if ! 218: .I a2 ! 219: is a line or character address with a missing ! 220: number, the number defaults to 1. ! 221: If ! 222: .I a1 ! 223: is missing, ! 224: .L . ! 225: is substituted. ! 226: If both ! 227: .I a1 ! 228: and ! 229: .I a2 ! 230: are present and distinguishable, ! 231: .B + ! 232: may be elided. ! 233: .I a2 ! 234: may be a regular ! 235: expression; if it is delimited by ! 236: .LR ? 's, ! 237: the effect of the ! 238: .B + ! 239: or ! 240: .B - ! 241: is reversed. ! 242: .PP ! 243: It is an error for a compound address to represent a malformed substring. ! 244: Some useful idioms: ! 245: .IB a1 +- ! 246: \%(\f2a1\fL-+\f1) ! 247: selects the line containing ! 248: the end (beginning) of a1. ! 249: .BI 0/ regexp / ! 250: locates the first match of the expression in the file. ! 251: (The form ! 252: .B 0;// ! 253: sets dot unnecessarily.) ! 254: .BI ./ regexp /// ! 255: finds the second following occurrence of the expression, ! 256: and ! 257: .BI .,/ regexp / ! 258: extends dot. ! 259: .SS Commands ! 260: In the following, text demarcated by slashes represents text delimited ! 261: by any printable ! 262: character except alphanumerics. ! 263: Any number of ! 264: trailing delimiters may be elided, with multiple elisions then representing ! 265: null strings, but the first delimiter must always ! 266: be present. ! 267: In any delimited text, ! 268: newline may not appear literally; ! 269: .B \en ! 270: may be typed for newline; and ! 271: .B \e/ ! 272: quotes the delimiter, here ! 273: .LR / . ! 274: Backslash is otherwise interpreted literally, except in ! 275: .B s ! 276: commands. ! 277: .PP ! 278: Most commands may be prefixed by an address to indicate their range ! 279: of operation. ! 280: Those that may not are marked with a ! 281: .L * ! 282: below. ! 283: If a command takes ! 284: an address and none is supplied, dot is used. ! 285: The sole exception is ! 286: the ! 287: .B w ! 288: command, which defaults to ! 289: .BR 0,$ . ! 290: In the description, `range' is used ! 291: to represent whatever address is supplied. ! 292: Many commands set the ! 293: value of dot as a side effect. ! 294: If so, it is always set to the `result' ! 295: of the change: the empty string for a deletion, the new text for an ! 296: insertion, etc. (but see the ! 297: .B s ! 298: and ! 299: .B e ! 300: commands). ! 301: .br ! 302: .ne 1.2i ! 303: .SS Text commands ! 304: .PD0 ! 305: .TP ! 306: .BI a/ text / ! 307: .TP ! 308: or ! 309: .TP ! 310: .B a ! 311: .TP ! 312: .I lines of text ! 313: .TP ! 314: .B . ! 315: Insert the text into the file after the range. ! 316: Set dot. ! 317: .PD ! 318: .TP ! 319: .B c\fP ! 320: .br ! 321: .ns ! 322: .TP ! 323: .B i\fP ! 324: Same as ! 325: .BR a , ! 326: but ! 327: .B c ! 328: replaces the text, while ! 329: .B i ! 330: inserts ! 331: .I before ! 332: the range. ! 333: .TP ! 334: .B d ! 335: Delete the text in the range. ! 336: Set dot. ! 337: .TP ! 338: .BI s/ regexp / text / ! 339: Substitute ! 340: .I text ! 341: for the first match to the regular expression in the range. ! 342: Set dot to the modified range. ! 343: In ! 344: .I text ! 345: the character ! 346: .B & ! 347: stands for the string ! 348: that matched the expression. ! 349: Backslash behaves as usual unless followed by ! 350: a digit: ! 351: .BI \e d ! 352: stands for the string that matched the ! 353: subexpression begun by the ! 354: .IR d -th ! 355: left parenthesis. ! 356: If ! 357: .I s ! 358: is followed immediately by a ! 359: number ! 360: .IR n , ! 361: as in ! 362: .BR s2/x/y/ , ! 363: the ! 364: .IR n -th ! 365: match in the range is substituted. ! 366: If the ! 367: command is followed by a ! 368: .BR g , ! 369: as in ! 370: .BR s/x/y/g , ! 371: all matches in the range ! 372: are substituted. ! 373: .TP ! 374: .BI m " a1 ! 375: .br ! 376: .ns ! 377: .TP ! 378: .BI t " a1 ! 379: Move ! 380: .RB ( m ) ! 381: or copy ! 382: .RB ( t ) ! 383: the range to after ! 384: .IR a1 . ! 385: Set dot. ! 386: .SS Display commands ! 387: .PD 0 ! 388: .TP ! 389: .B p ! 390: Print the text in the range. ! 391: Set dot. ! 392: .TP ! 393: .B = ! 394: Print the line address and character address of the range. ! 395: .TP ! 396: .B =# ! 397: Print just the character address of the range. ! 398: .PD ! 399: .SS File commands ! 400: .PD0 ! 401: .TP ! 402: .BI \*ab " file-list ! 403: Set the current file to the first file named in the list ! 404: that ! 405: .I sam ! 406: also has in its menu. ! 407: The list may be expressed ! 408: .BI < "Plan 9 command" ! 409: in which case the file names are taken as words (in the shell sense) ! 410: generated by the Plan 9 command. ! 411: .TP ! 412: .BI \*aB " file-list ! 413: Same as ! 414: .BR b , ! 415: except that file names not in the menu are entered there, ! 416: and all file names in the list are examined. ! 417: .TP ! 418: .B \*an ! 419: Print a menu of files. ! 420: The format is: ! 421: .RS ! 422: .TP 11 ! 423: .BR ' " or blank ! 424: indicating the file is modified or clean, ! 425: .TP 11 ! 426: .BR - " or \&" + ! 427: indicating the file is unread or has been read ! 428: (in the terminal, ! 429: .B * ! 430: means more than one window is open), ! 431: .TP 11 ! 432: .BR . " or blank ! 433: indicating the current file, ! 434: .TP 11 ! 435: a blank, ! 436: .TP 11 ! 437: and the file name. ! 438: .RE ! 439: .TP 0 ! 440: .BI \*aD " file-list ! 441: Delete the named files from the menu. ! 442: If no files are named, the current file is deleted. ! 443: It is an error to ! 444: .B D ! 445: a modified file, but a subsequent ! 446: .B D ! 447: will delete such a file. ! 448: .PD ! 449: .SS I/O Commands ! 450: .PD0 ! 451: .TP ! 452: .BI \*ae " filename ! 453: Replace the file by the contents of the named external file. ! 454: Set dot to the beginning of the file. ! 455: .TP ! 456: .BI r " filename ! 457: Replace the text in the range by the contents of the named external file. ! 458: Set dot. ! 459: .TP ! 460: .BI w " filename ! 461: Write the range (default ! 462: .BR 0,$ ) ! 463: to the named external file. ! 464: .TP ! 465: .BI \*af " filename ! 466: Set the file name and print the resulting menu entry. ! 467: .PP ! 468: If the file name is absent from any of these, the current file name is used. ! 469: .B e ! 470: always sets the file name; ! 471: .B r ! 472: and ! 473: .B w ! 474: do so if the file has no name. ! 475: .TP ! 476: .BI < " Plan 9-command ! 477: Replace the range by the standard output of the ! 478: Plan 9 command. ! 479: .TP ! 480: .BI > " Plan 9-command ! 481: Send the range to the standard input of the ! 482: Plan 9 command. ! 483: .TP ! 484: .BI | " Plan 9-command ! 485: Send the range to the standard input, and replace it by ! 486: the standard output, of the ! 487: Plan 9 command. ! 488: .TP ! 489: .BI \*a! " Plan 9-command ! 490: Run the ! 491: Plan 9 command. ! 492: .TP ! 493: .BI \*acd " directory ! 494: Change working directory. ! 495: If no directory is specified, ! 496: .B $home ! 497: is used. ! 498: .PD ! 499: .PP ! 500: In any of ! 501: .BR < , ! 502: .BR > , ! 503: .B | ! 504: or ! 505: .BR ! , ! 506: if the ! 507: .I Plan 9 command ! 508: is omitted the last ! 509: .I Plan 9 command ! 510: (of any type) is substituted. ! 511: If ! 512: .I sam ! 513: is ! 514: .I downloaded ! 515: (using the mouse and bitmap display, i.e. not using option ! 516: .BR -d ), ! 517: .B ! ! 518: sets standard input to ! 519: .BR /dev/null , ! 520: and otherwise ! 521: unassigned output ! 522: .RB ( stdout ! 523: for ! 524: .B ! ! 525: and ! 526: .BR > , ! 527: .B stderr ! 528: for all) is placed in ! 529: .B /tmp/sam.err ! 530: and the first few lines are printed. ! 531: .SS Loops and Conditionals ! 532: .PD0 ! 533: .TP ! 534: .BI x/ regexp / " command ! 535: For each match of the regular expression in the range, run the command ! 536: with dot set to the match. ! 537: Set dot to the last match. ! 538: If the regular ! 539: expression and its slashes are omitted, ! 540: .L /.*\en/ ! 541: is assumed. ! 542: Null string matches potentially occur before every character ! 543: of the range and at the end of the range. ! 544: .TP ! 545: .BI y/ regexp / " command ! 546: Like ! 547: .BR x , ! 548: but run the command for each substring that lies before, between, ! 549: or after ! 550: the matches that would be generated by ! 551: .BR x . ! 552: There is no default regular expression. ! 553: Null substrings potentially occur before every character ! 554: in the range. ! 555: .TP ! 556: .BI \*aX/ regexp / " command ! 557: For each file whose menu entry matches the regular expression, ! 558: make that the current file and ! 559: run the command. ! 560: If the expression is omitted, the command is run ! 561: in every file. ! 562: .TP ! 563: .BI \*aY/ regexp / " command ! 564: Same as ! 565: .BR X , ! 566: but for files that do not match the regular expression, ! 567: and the expression is required. ! 568: .TP ! 569: .BI g/ regexp / " command ! 570: .br ! 571: .ns ! 572: .TP ! 573: .BI v/ regexp / " command ! 574: If the range contains ! 575: .RB ( g ) ! 576: or does not contain ! 577: .RB ( v ) ! 578: a match for the expression, ! 579: set dot to the range and run the command. ! 580: .PP ! 581: These may be nested arbitrarily deeply, but only one instance of either ! 582: .B X ! 583: or ! 584: .B Y ! 585: may appear in a \%single command. ! 586: An empty command in an ! 587: .B x ! 588: or ! 589: .B y ! 590: defaults to ! 591: .BR p ; ! 592: an empty command in ! 593: .B X ! 594: or ! 595: .B Y ! 596: defaults to ! 597: .BR f . ! 598: .B g ! 599: and ! 600: .B v ! 601: do not have defaults. ! 602: .PD ! 603: .SS Miscellany ! 604: .TF (empty) ! 605: .TP ! 606: .B k ! 607: Set the current file's mark to the range. Does not set dot. ! 608: .TP ! 609: .B \*aq ! 610: Quit. ! 611: It is an error to quit with modified files, but a second ! 612: .B q ! 613: will succeed. ! 614: .TP ! 615: .BI \*au " n ! 616: Undo the last ! 617: .I n ! 618: (default 1) ! 619: top-level commands that changed the contents or name of the ! 620: current file, and any other file whose most recent change was simultaneous ! 621: with the current file's change. ! 622: Successive ! 623: .BR u 's ! 624: move further back in time. ! 625: The only commands for which u is ineffective are ! 626: .BR cd , ! 627: .BR u , ! 628: .BR q , ! 629: .B w ! 630: and ! 631: .BR D . ! 632: .TP ! 633: (empty) ! 634: If the range is explicit, set dot to the range. ! 635: If ! 636: .I sam ! 637: is downloaded, the resulting dot is selected on the screen; ! 638: otherwise it is printed. ! 639: If no address is specified (the ! 640: command is a newline) dot is extended in either direction to ! 641: line boundaries and printed. ! 642: If dot is thereby unchanged, it is set to ! 643: .B .+1 ! 644: and printed. ! 645: .PD ! 646: .SS Grouping and multiple changes ! 647: Commands may be grouped by enclosing them in braces ! 648: .BR {} . ! 649: Commands within the braces must appear on separate lines (no backslashes are ! 650: required between commands). ! 651: Semantically, an opening brace is like a command: ! 652: it takes an (optional) address and sets dot for each sub-command. ! 653: Commands within the braces are executed sequentially, but changes made ! 654: by one command are not visible to other commands (see the next ! 655: paragraph). ! 656: Braces may be nested arbitrarily. ! 657: .PP ! 658: When a command makes a number of changes to a file, as in ! 659: .BR x/re/c/text/ , ! 660: the addresses of all changes to the file are computed in the original file. ! 661: If the changes are in sequence, ! 662: they are applied to the file. ! 663: Successive insertions at the same address are catenated into a single ! 664: insertion composed of the several insertions in the order applied. ! 665: .SS The terminal ! 666: What follows refers to behavior of ! 667: .I sam ! 668: when downloaded, that is, when ! 669: operating as a display editor on a bitmap display. ! 670: This is the default ! 671: behavior; invoking ! 672: .I sam ! 673: with the ! 674: .B -d ! 675: (no download) option provides access ! 676: to the command language only. ! 677: .PP ! 678: Each file may have zero or more windows open. ! 679: Each window is equivalent ! 680: and is updated simultaneously with changes in other windows on the same file. ! 681: Each window has an independent value of dot, indicated by a highlighted ! 682: substring on the display. ! 683: Dot may be in a region not within ! 684: the window. ! 685: There is usually a `current window', ! 686: marked with a dark border, to which typed text and editing ! 687: commands apply. ! 688: Text may be typed and edited as in ! 689: .IR 8½ (1); ! 690: also the escape key (ESC) selects (sets dot to) text typed ! 691: since the last mouse button hit. ! 692: .PP ! 693: The button 3 menu controls window operations. ! 694: The top of the menu ! 695: provides the following operators, each of which uses one or ! 696: more ! 697: .IR 8½ -like ! 698: cursors to prompt for selection of a window or sweeping ! 699: of a rectangle. ! 700: `Sweeping' a null rectangle gets a large window, disjoint ! 701: from the command window or the whole screen, depending on ! 702: where the null rectangle is. ! 703: .TF reshape ! 704: .TP ! 705: .B new ! 706: Create a new, empty file. ! 707: .TP ! 708: .B zerox ! 709: Create a copy of an existing window. ! 710: .TP ! 711: .B reshape ! 712: As in ! 713: .IR 8½ . ! 714: .TP ! 715: .B close ! 716: Delete the window. ! 717: In the last window of a file, ! 718: .B close ! 719: is equivalent to a ! 720: .B D ! 721: for the file. ! 722: .TP ! 723: .B write ! 724: Equivalent to a ! 725: .B w ! 726: for the file. ! 727: .PD ! 728: .PP ! 729: Below these operators is a list of available files, starting with ! 730: .BR ~~sam~~ , ! 731: the command window. ! 732: Selecting a file from the list makes the most recently ! 733: used window on that file current, unless it is already current, in which ! 734: case selections cycle through the open windows. ! 735: If no windows are open ! 736: on the file, the user is prompted to open one. ! 737: Files other than ! 738: .B ~~sam~~ ! 739: are marked with one of the characters ! 740: .B -+* ! 741: according as zero, one, or more windows ! 742: are open on the file. ! 743: A further mark ! 744: .L . ! 745: appears on the file in the current window and ! 746: a single quote, ! 747: .BR ' , ! 748: on a file modified since last write. ! 749: .PP ! 750: The command window, created automatically when ! 751: .B sam ! 752: starts, is an ordinary window except that text typed to it ! 753: is interpreted as commands for the editor rather than passive text, ! 754: and text printed by editor commands appears in it. ! 755: The behavior is like ! 756: .IR 8½ , ! 757: with an `output point' that separates commands being typed from ! 758: previous output. ! 759: Commands typed in the command window apply to the ! 760: current open file\(emthe file in the most recently ! 761: current window. ! 762: .SS Manipulating text ! 763: Button 1 changes selection, much like ! 764: .IR 8½ . ! 765: Pointing to a non-current window with button 1 makes it current; ! 766: within the current window, button 1 selects text, thus setting dot. ! 767: Double-clicking selects text to the boundaries of words, lines, ! 768: quoted strings or bracketed strings, depending on the text at the click. ! 769: .PP ! 770: Button 2 provides a menu of editing commands: ! 771: .TF /regexp ! 772: .TP ! 773: .B cut ! 774: Delete dot and save the deleted text in the snarf buffer. ! 775: .TP ! 776: .B paste ! 777: Replace the text in dot by the contents of the snarf buffer. ! 778: .TP ! 779: .B snarf ! 780: Save the text in dot in the snarf buffer. ! 781: .TP ! 782: .B look ! 783: Search forward for the next occurrence of the literal text in dot. ! 784: If dot is the null string, the text in the snarf buffer is ! 785: used. ! 786: The snarf buffer is unaffected. ! 787: .TP ! 788: .B <8½> ! 789: Exchange snarf buffers with ! 790: .IR 8½ . ! 791: .TP ! 792: .BI / regexp ! 793: Search forward for the next match of the last regular expression ! 794: typed in a command. ! 795: (Not in command window.) ! 796: .TP ! 797: .B send ! 798: Send the text in dot, or the snarf buffer if ! 799: dot is the null string, as if it were typed to the command window. ! 800: Saves the sent text in the snarf buffer. ! 801: (Command window only.) ! 802: .PD ! 803: .SS External communication ! 804: On invocation ! 805: .I sam ! 806: creates a named pipe ! 807: .BI /srv/sam. user ! 808: which acts as an additional source of commands. Characters written to ! 809: the named pipe are treated as if they had been typed in the command window. ! 810: This is usually used to issue ! 811: .B B ! 812: commands from the shell. ! 813: .PP ! 814: .I B ! 815: is a shell-level command that causes an instance of ! 816: .I sam ! 817: running on the same terminal to load the named ! 818: .IR files . ! 819: The option allows a line number to be specified for ! 820: the initial position to display in the last named file. ! 821: .SS Abnormal termination ! 822: If ! 823: .I sam ! 824: terminates other than by a ! 825: .B q ! 826: command (by hangup, deleting its window, etc.), modified ! 827: files are saved in an ! 828: executable file, ! 829: .BR $home/sam.save . ! 830: This program, when executed, asks whether to write ! 831: each file back to a external file. ! 832: The answer ! 833: .L y ! 834: causes writing; anything else skips the file. ! 835: .SH FILES ! 836: .TF /sys/src/cmd/samterm ! 837: .TP ! 838: .B $home/sam.save ! 839: .TP ! 840: .B $home/sam.err ! 841: .TP ! 842: .B /sys/lib/samsave ! 843: the program called to unpack ! 844: .BR $home/sam.save . ! 845: .SH SOURCE ! 846: .TF /sys/src/cmd/samterm ! 847: .TP ! 848: .B /sys/src/cmd/sam ! 849: source for ! 850: .I sam ! 851: itself ! 852: .TP ! 853: .B /sys/src/cmd/samterm ! 854: source for the separate terminal part ! 855: .TP ! 856: .B /rc/bin/B ! 857: .SH SEE ALSO ! 858: .IR ed (1), ! 859: .IR sed (1), ! 860: .IR grep (1), ! 861: .IR 8½ (1), ! 862: .IR regexp (6). ! 863: .PP ! 864: Rob Pike, ! 865: ``The text editor sam''.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.