Annotation of 43BSDReno/share/doc/usd/13.edadv/ae3, revision 1.1.1.1

1.1       root        1: .\"    @(#)ae3 6.1 (Berkeley) 5/22/86
                      2: .\"
                      3: .NH
                      4: LINE ADDRESSING IN THE EDITOR
                      5: .PP
                      6: The next general area we will discuss is that of
                      7: line addressing in
                      8: .UL ed ,
                      9: that is, how you specify what lines are to be
                     10: affected by editing commands.
                     11: We have already used constructions like 
                     12: .P1
                     13: 1,$s/x/y/
                     14: .P2
                     15: to specify a change on all lines.
                     16: And most users are long since familiar with
                     17: using a single newline (or return) to print the next line,
                     18: and with
                     19: .P1
                     20: /thing/
                     21: .P2
                     22: to find a line that contains `thing'.
                     23: Less familiar, surprisingly enough, is the
                     24: use of
                     25: .P1
                     26: ?thing?
                     27: .P2
                     28: to scan
                     29: .ul
                     30: backwards
                     31: for the previous occurrence of `thing'.
                     32: This is especially handy when you realize that the thing
                     33: you want to operate on is back up the page from
                     34: where you are currently editing.
                     35: .PP
                     36: The slash and question mark are the only characters you can
                     37: use to delimit a context search, though you can use
                     38: essentially any character in a substitute command.
                     39: .SH
                     40: Address Arithmetic
                     41: .PP
                     42: The next step is to combine the line numbers
                     43: like `\*.', `$', `/.../' and `?...?'
                     44: with `+' and `\-'.
                     45: Thus
                     46: .P1
                     47: $-1
                     48: .P2
                     49: is a command to print the next to last line of
                     50: the current file (that is, one line before line `$').
                     51: For example, to recall how far you got in a previous editing session,
                     52: .P1
                     53: $-5,$p
                     54: .P2
                     55: prints the last six lines.
                     56: (Be sure you understand why it's six, not five.)
                     57: If there aren't six, of course, you'll get an error message.
                     58: .PP
                     59: As another example,
                     60: .P1
                     61: \&\*.-3,\*.+3p
                     62: .P2
                     63: prints from three lines before where you are now
                     64: (at line dot)
                     65: to three lines after,
                     66: thus giving you a bit of context.
                     67: By the way, the `+' can be omitted:
                     68: .P1
                     69: \&\*.-3,\*.3p
                     70: .P2
                     71: is absolutely identical in meaning.
                     72: .PP
                     73: Another area in which you can save typing effort
                     74: in specifying lines is to use `\-' and `+' as line numbers
                     75: by themselves.
                     76: .P1
                     77: -
                     78: .P2
                     79: by itself is a command to move back up one line in the file.
                     80: In fact, you can string several minus signs together to move
                     81: back up that many lines:
                     82: .P1
                     83: ---
                     84: .P2
                     85: moves up three lines, as does `\-3'.
                     86: Thus
                     87: .P1
                     88: -3,+3p
                     89: .P2
                     90: is also identical to the examples above.
                     91: .PP
                     92: Since `\-' is shorter than `\*.\-1',
                     93: constructions like
                     94: .P1
                     95: -,\*.s/bad/good/
                     96: .P2
                     97: are useful. This changes `bad' to `good' on the previous line and
                     98: on the current line.
                     99: .PP
                    100: `+' and `\-' can be used in combination with searches using `/.../' and `?...?',
                    101: and with `$'.
                    102: The search
                    103: .P1
                    104: /thing/--
                    105: .P2
                    106: finds the line containing `thing', and positions you
                    107: two lines before it.
                    108: .SH
                    109: Repeated Searches
                    110: .PP
                    111: Suppose you ask for the search
                    112: .P1
                    113: /horrible thing/
                    114: .P2
                    115: and when the line is printed you discover that it
                    116: isn't the horrible thing that you wanted,
                    117: so it is necessary to repeat the search again.
                    118: You don't have to re-type the search,
                    119: for the construction
                    120: .P1
                    121: //
                    122: .P2
                    123: is a shorthand for `the previous thing that was searched for',
                    124: whatever it was.
                    125: This can be repeated as many times as necessary.
                    126: You can also go backwards:
                    127: .P1
                    128: ??
                    129: .P2
                    130: searches for the same thing,
                    131: but in the reverse direction.
                    132: .PP
                    133: Not only can you repeat the search, but you can
                    134: use `//' as the left side of a substitute command,
                    135: to mean
                    136: `the most recent pattern'.
                    137: .P1
                    138: /horrible thing/
                    139: .ft I
                    140:  .... ed prints line with `horrible thing' ...
                    141: .ft R
                    142: s//good/p
                    143: .P2
                    144: To go backwards and change a line, say
                    145: .P1
                    146: ??s//good/
                    147: .P2
                    148: Of course, you can still use the `&' on the right hand side of a substitute to stand for
                    149: whatever got matched:
                    150: .P1
                    151: //s//&\*(BL&/p
                    152: .P2
                    153: finds the next occurrence of whatever you searched for last,
                    154: replaces it by two copies of itself,
                    155: then prints the line just to verify that it worked.
                    156: .SH
                    157: Default Line Numbers and the Value of Dot
                    158: .PP
                    159: One of the most effective ways to speed up your editing
                    160: is always to know what lines will be affected
                    161: by a command if you don't specify the lines it is to act on,
                    162: and on what line you will be positioned (i.e., the value of dot) when a command finishes.
                    163: If you can edit without specifying unnecessary
                    164: line numbers, you can save a lot of typing.
                    165: .PP
                    166: As the most obvious example, if you issue a search command
                    167: like
                    168: .P1
                    169: /thing/
                    170: .P2
                    171: you are left pointing at the next line that contains `thing'.
                    172: Then no address is required with commands like
                    173: .UL s
                    174: to make a substitution on that line,
                    175: or
                    176: .UL p
                    177: to print it,
                    178: or
                    179: .UL l
                    180: to list it,
                    181: or
                    182: .UL d
                    183: to delete it,
                    184: or
                    185: .UL a
                    186: to append text after it,
                    187: or
                    188: .UL c
                    189: to change it,
                    190: or
                    191: .UL i
                    192: to insert text before it.
                    193: .PP
                    194: What happens if there was no `thing'?
                    195: Then you are left right where you were _
                    196: dot is unchanged.
                    197: This is also true if you were sitting
                    198: on the only `thing' when you issued the command.
                    199: The same rules hold for searches that use
                    200: `?...?'; the only difference is the direction
                    201: in which you search.
                    202: .PP
                    203: The delete command
                    204: .UL d 
                    205: leaves dot pointing
                    206: at the line that followed the last deleted line.
                    207: When line `$' gets deleted,
                    208: however,
                    209: dot points at the
                    210: .ul
                    211: new
                    212: line `$'.
                    213: .PP
                    214: The line-changing commands
                    215: .UL a ,
                    216: .UL c
                    217: and
                    218: .UL i
                    219: by default all affect the current line _
                    220: if you give no line number with them,
                    221: .UL a
                    222: appends text after the current line,
                    223: .UL c
                    224: changes the current line,
                    225: and
                    226: .UL i
                    227: inserts text before the current line.
                    228: .PP
                    229: .UL a ,
                    230: .UL c ,
                    231: and
                    232: .UL i
                    233: behave identically in one respect _
                    234: when you stop appending, changing or inserting,
                    235: dot points at the last line entered.
                    236: This is exactly what you want for typing and editing on the fly.
                    237: For example, you can say
                    238: .P1
                    239: .ta 1.5i
                    240: a
                    241:  ... text ...
                    242:  ... botch ... (minor error)
                    243: \&\*.
                    244: s/botch/correct/       (fix botched line)
                    245: a
                    246:  ... more text ...
                    247: .P2
                    248: without specifying any line number for the substitute command or for
                    249: the second append command.
                    250: Or you can say
                    251: .P1 2
                    252: .ta 1.5i
                    253: a
                    254:  ... text ...
                    255:  ... horrible botch ...        (major error)
                    256: \&\*.
                    257: c      (replace entire line)
                    258:  ... fixed up line ...
                    259: .P2
                    260: .PP
                    261: You should experiment to determine what happens if you add
                    262: .ul
                    263: no
                    264: lines with
                    265: .UL a ,
                    266: .UL c
                    267: or
                    268: .UL i .
                    269: .PP
                    270: The
                    271: .UL r
                    272: command will read a file into the text being edited,
                    273: either at the end if you give no address,
                    274: or after the specified line if you do.
                    275: In either case, dot points at the last line read in.
                    276: Remember that you can even say
                    277: .UL 0r
                    278: to read a file in at the beginning of the text.
                    279: (You can also say
                    280: .UL 0a
                    281: or
                    282: .UL 1i
                    283: to start adding text at the beginning.)
                    284: .PP
                    285: The
                    286: .UL w
                    287: command writes out the entire file.
                    288: If you precede the command by one line number,
                    289: that line is written,
                    290: while if you precede it by two line numbers,
                    291: that range of lines is written.
                    292: The 
                    293: .UL w
                    294: command does
                    295: .ul
                    296: not
                    297: change dot:
                    298: the current line remains the same,
                    299: regardless of what lines are written.
                    300: This is true even if you say something like
                    301: .P1
                    302: /^\*e\*.AB/,/^\*e\*.AE/w abstract
                    303: .P2
                    304: which involves a context search.
                    305: .PP
                    306: Since the
                    307: .UL w
                    308: command is so easy to use,
                    309: you should save what you are editing regularly
                    310: as you go along
                    311: just in case the system crashes, or in case you do something foolish,
                    312: like clobbering what you're editing.
                    313: .PP
                    314: The least intuitive behavior, in a sense, is that of the
                    315: .UL s
                    316: command.
                    317: The rule is simple _
                    318: you are left sitting on the last line that got changed.
                    319: If there were no changes, then dot is unchanged.
                    320: .PP
                    321: To illustrate,
                    322: suppose that there are three lines in the buffer, and you are sitting on
                    323: the middle one:
                    324: .P1
                    325: x1
                    326: x2
                    327: x3
                    328: .P2
                    329: Then the command
                    330: .P1
                    331: \&-,+s/x/y/p
                    332: .P2
                    333: prints the third line, which is the last one changed.
                    334: But if the three lines had been
                    335: .P1
                    336: x1
                    337: y2
                    338: y3
                    339: .P2
                    340: and the same command had been issued while
                    341: dot pointed
                    342: at the second line, then the result
                    343: would be to change and print only the first line,
                    344: and that is where dot would be set.
                    345: .SH
                    346: Semicolon `;'
                    347: .PP
                    348: Searches with `/.../' and `?...?' start
                    349: at the current line and move
                    350: forward or backward respectively
                    351: until they either find the pattern or get back to the current line.
                    352: Sometimes this is not what is wanted.
                    353: Suppose, for example, that the buffer contains lines like this:
                    354: .P1
                    355:  \*.
                    356:  \*.
                    357:  \*.
                    358:  ab
                    359:  \*.
                    360:  \*.
                    361:  \*.
                    362:  bc
                    363:  \*. 
                    364:  \*.
                    365: .P2
                    366: Starting at line 1, one would expect that the command
                    367: .P1
                    368: /a/,/b/p
                    369: .P2
                    370: prints all the lines from the `ab' to the `bc' inclusive.
                    371: Actually this is not what happens.
                    372: .ul
                    373: Both
                    374: searches
                    375: (for `a' and for `b')
                    376: start from the same point, and thus they both find the line
                    377: that contains `ab'.
                    378: The result is to print a single line.
                    379: Worse, if there had been a line with a `b' in it
                    380: before the `ab' line, then the print command
                    381: would be in error, since the second line number
                    382: would be less than the first, and it is illegal to
                    383: try to print lines in reverse order.
                    384: .PP
                    385: This is because the comma separator
                    386: for line numbers doesn't set dot as each address is processed;
                    387: each search starts from the same place.
                    388: In 
                    389: .UL ed ,
                    390: the semicolon `;' can be used just like comma,
                    391: with the single difference that use of a semicolon
                    392: forces dot to be set at that point
                    393: as the line numbers are being evaluated.
                    394: In effect, the semicolon `moves' dot.
                    395: Thus in our example above, the command
                    396: .P1
                    397: /a/;/b/p
                    398: .P2
                    399: prints the range of lines from `ab' to `bc',
                    400: because after the `a' is found, dot is set to that line,
                    401: and then `b' is searched for, starting beyond that line.
                    402: .PP
                    403: This property is most often useful in a very simple situation.
                    404: Suppose you want to find the 
                    405: .ul
                    406: second
                    407: occurrence of `thing'.
                    408: You could say
                    409: .P1
                    410: /thing/
                    411: //
                    412: .P2
                    413: but this prints the first occurrence as well as the second,
                    414: and is a nuisance when you know very well that it is only
                    415: the second one you're interested in.
                    416: The solution is to say
                    417: .P1
                    418: /thing/;//
                    419: .P2
                    420: This says to find the first occurrence of `thing', set dot to that line, then find the second
                    421: and print only that.
                    422: .PP
                    423: Closely related is searching for the second previous
                    424: occurrence of something, as in
                    425: .P1
                    426: ?something?;??
                    427: .P2
                    428: Printing the third or fourth or ...
                    429: in either direction is left as an exercise.
                    430: .PP
                    431: Finally, bear in mind that if you want to find the first occurrence of
                    432: something in a file, starting at an arbitrary place within the file,
                    433: it is not sufficient to say
                    434: .P1
                    435: 1;/thing/
                    436: .P2
                    437: because this fails if `thing' occurs on line 1.
                    438: But it is possible to say
                    439: .P1
                    440: 0;/thing/
                    441: .P2
                    442: (one of the few places where 0 is a legal line number),
                    443: for this starts the search at line 1.
                    444: .SH
                    445: Interrupting the Editor
                    446: .PP
                    447: As a final note on what dot gets set to,
                    448: you should be aware that if you hit the interrupt or delete
                    449: or rubout or break key
                    450: while
                    451: .UL ed
                    452: is doing a command, things are put back together again and your state
                    453: is restored as much as possible to what it was before the command
                    454: began.
                    455: Naturally, some changes are irrevocable _
                    456: if you are reading or writing a file or making substitutions or deleting lines, these will be stopped
                    457: in some clean but unpredictable state in the middle
                    458: (which is why it is not usually wise to stop them).
                    459: Dot may or may not be changed.
                    460: .PP
                    461: Printing is more clear cut.
                    462: Dot is not changed until the printing is done.
                    463: Thus if you print until you see an interesting line,
                    464: then hit delete, you are
                    465: .ul
                    466: not
                    467: sitting on that line or even near it.
                    468: Dot is left where it was when the
                    469: .UL p
                    470: command was started.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.