home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / riscbsd / 1_1_contri / usd / 13_edadv / ae3 < prev    next >
Encoding:
Text File  |  1986-05-22  |  10.5 KB  |  471 lines

  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.
  471.