|
|
1.1 root 1: .\" @(#)ae6 6.1 (Berkeley) 6/5/86
2: .\"
3: .NH
4: CUT AND PASTE WITH THE EDITOR
5: .PP
6: Now we move on to manipulating pieces of files _
7: individual lines or groups of lines.
8: This is another area where new users seem
9: unsure of themselves.
10: .SH
11: Filenames
12: .PP
13: The first step is to ensure that you know the
14: .UL ed
15: commands for reading and writing files.
16: Of course you can't go very far without knowing
17: .UL r
18: and
19: .UL w .
20: Equally useful, but less well known, is the `edit' command
21: .UL e .
22: Within
23: .UL ed ,
24: the command
25: .P1
26: e newfile
27: .P2
28: says `I want to edit a new file called
29: .ul
30: newfile,
31: without leaving the editor.'
32: The
33: .UL e
34: command discards whatever you're currently working on
35: and starts over on
36: .ul
37: newfile.
38: It's exactly the same as if you had quit with the
39: .UL q
40: command, then re-entered
41: .UL ed
42: with a new file name,
43: except that if you have a pattern remembered, then a command
44: like
45: .UL //
46: will still work.
47: .PP
48: If you enter
49: .UL ed
50: with the command
51: .P1
52: ed file
53: .P2
54: .UL ed
55: remembers the name of the file,
56: and any subsequent
57: .UL e ,
58: .UL r
59: or
60: .UL w
61: commands that don't contain a filename
62: will refer to this remembered file.
63: Thus
64: .P1 2
65: .ta .5i .6i .7i
66: ed file1
67: ... (editing) ...
68: w (writes back in file1)
69: e file2 (edit new file, without leaving editor)
70: ... (editing on file2) ...
71: w (writes back on file2)
72: .P2
73: (and so on) does a series of edits on various files
74: without ever leaving
75: .UL ed
76: and without typing the name of any file more than once.
77: (As an aside, if you examine the sequence of commands here,
78: you can see why many
79: UNIX
80: systems use
81: .UL e
82: as a synonym
83: for
84: .UL ed .)
85: .PP
86: You can find out the remembered file name at any time
87: with the
88: .UL f
89: command;
90: just type
91: .UL f
92: without a file name.
93: You can also change the name of the remembered file name with
94: .UL f ;
95: a useful sequence is
96: .P1
97: ed precious
98: f junk
99: ... (editing) ...
100: .P2
101: which gets a copy of a precious file,
102: then uses
103: .UL f
104: to guarantee that a careless
105: .UL w
106: command won't clobber the original.
107: .SH
108: Inserting One File into Another
109: .PP
110: Suppose you have a file called
111: `memo',
112: and you want the file called
113: `table'
114: to be inserted just after the reference to
115: Table 1.
116: That is, in
117: `memo'
118: somewhere is a line that says
119: .IP
120: Table 1 shows that ...
121: .LP
122: and the data contained in
123: `table'
124: has to go there,
125: probably so it will be formatted
126: properly by
127: .UL nroff
128: or
129: .UL troff .
130: Now what?
131: .PP
132: This one is easy.
133: Edit
134: `memo',
135: find
136: `Table 1',
137: and add the file
138: `table'
139: right there:
140: .P1
141: ed memo
142: /Table 1/
143: .ft I
144: Table 1 shows that ... [response from ed]
145: .ft
146: \&\*.r table
147: .P2
148: The critical line is the last one.
149: As we said earlier, the
150: .UL r
151: command reads a file;
152: here you asked for it to be read in right after
153: line dot.
154: An
155: .UL r
156: command without any address
157: adds lines at the end,
158: so it is the same as
159: .UL $r .
160: .SH
161: Writing out Part of a File
162: .PP
163: The other side of the coin is writing out part of
164: the document you're editing.
165: For example, maybe
166: you want to copy out into a separate file
167: that table from the previous example,
168: so it can be formatted and tested separately.
169: Suppose that in the file being edited
170: we have
171: .P1
172: \&\*.TS
173: ...[lots of stuff]
174: \&\*.TE
175: .P2
176: which is the way a table is set up for the
177: .UL tbl
178: program.
179: To isolate
180: the table
181: in a separate file called
182: `table',
183: first find the start of the table
184: (the `.TS' line), then write out the interesting part:
185: .P1
186: /^\*e\*.TS/
187: .ft I
188: \&\*.TS [ed prints the line it found]
189: .ft R
190: \&\*.,/^\*e\*.TE/w table
191: .P2
192: and the job is done.
193: If you are confident, you can do it all at once with
194: .P1
195: /^\*e\*.TS/;/^\*e\*.TE/w table
196: .P2
197: and now you have two copies, one in the file you're still editing,
198: one in the file `table' you've just written.
199: .PP
200: The point is that the
201: .UL w
202: command can
203: write out a group of lines, instead of the whole file.
204: In fact, you can write out a single line if you like;
205: just give one line number instead of two.
206: For example, if you have just typed a horribly complicated line
207: and you know that it (or something like it) is going to be needed later,
208: then save it _ don't re-type it.
209: In the editor, say
210: .P1
211: a
212: \&...lots of stuff...
213: \&...horrible line...
214: \&\*.
215: \&\*.w temp
216: a
217: \&\*.\*.\*.more stuff\*.\*.\*.
218: \&\*.
219: \&\*.r temp
220: a
221: \&\*.\*.\*.more stuff\*.\*.\*.
222: \&\*.
223: .P2
224: This last example is worth studying, to be sure you appreciate
225: what's going on.
226: .SH
227: Moving Lines Around
228: .PP
229: Suppose you want to
230: move a paragraph from its present position in a paper
231: to the end.
232: How would you do it?
233: As a concrete example, suppose each paragraph in the paper
234: begins with the formatting command
235: `.PP'.
236: Think about it and write down the details before reading on.
237: .PP
238: The brute force way
239: (not necessarily bad)
240: is to write the paragraph onto a temporary file,
241: delete it from its current position,
242: then read in the temporary file at the end.
243: Assuming that you are sitting on the
244: `.PP' command that begins
245: the paragraph, this is the sequence of commands:
246: .P1
247: \&\*.,/^\*e\*.PP/-w temp
248: \&\*.,//-d
249: $r temp
250: .P2
251: That is, from where you are now
252: (`\*.')
253: until one line before the next `\*.PP'
254: (`/^\*e\*.PP/\-')
255: write onto
256: `temp'.
257: Then delete the same lines.
258: Finally, read
259: `temp'
260: at the end.
261: .PP
262: As we said, that's the brute force way.
263: The easier way (often)
264: is to use the
265: .ul
266: move
267: command
268: .UL m
269: that
270: .UL ed
271: provides _
272: it lets you do the whole set of operations
273: at one crack,
274: without any temporary file.
275: .PP
276: The
277: .UL m
278: command
279: is like many other
280: .UL ed
281: commands in that it takes up to two line numbers in front
282: that tell what lines are to be affected.
283: It is also
284: .ul
285: followed
286: by a line number that tells where the lines are to go.
287: Thus
288: .P1
289: line1, line2 m line3
290: .P2
291: says to move all the lines between
292: `line1'
293: and
294: `line2'
295: after
296: `line3'.
297: Naturally, any of
298: `line1'
299: etc., can be patterns between slashes,
300: $
301: signs, or other ways to specify lines.
302: .PP
303: Suppose again that you're sitting at the first line of the
304: paragraph.
305: Then you can say
306: .P1
307: \&\*.,/^\*e\*.PP/-m$
308: .P2
309: That's all.
310: .PP
311: As another example of a frequent operation,
312: you can reverse the order of two adjacent lines
313: by moving the first one
314: to after the second.
315: Suppose that you are positioned at the first.
316: Then
317: .P1
318: m+
319: .P2
320: does it.
321: It says to move line dot to after one line after line dot.
322: If you are positioned on the second line,
323: .P1
324: m--
325: .P2
326: does the interchange.
327: .PP
328: As you can see, the
329: .UL m
330: command is more succinct and direct than
331: writing, deleting and re-reading.
332: When is brute force better anyway?
333: This is a matter of personal taste _
334: do what you have most confidence in.
335: The main difficulty with the
336: .UL m
337: command
338: is that if you use patterns to specify both the lines
339: you are moving and the target,
340: you have to take care that you specify them properly,
341: or you may well not move the lines you thought you did.
342: The result of a botched
343: .UL m
344: command can be a ghastly mess.
345: Doing the job a step at a time
346: makes it easier for you to verify at each step
347: that you accomplished what you wanted to.
348: It's also a good idea to issue a
349: .UL w
350: command
351: before doing anything complicated;
352: then if you goof, it's easy to back up
353: to where you were.
354: .SH
355: Marks
356: .PP
357: .UL ed
358: provides a facility for marking a line
359: with a particular name so you can later reference it
360: by name
361: regardless of its actual line number.
362: This can be handy for moving lines,
363: and for keeping track of them even after they've been moved.
364: The
365: .ul
366: mark
367: command is
368: .UL k ;
369: the command
370: .P1
371: kx
372: .P2
373: marks the current line with the name `x'.
374: If a line number precedes the
375: .UL k ,
376: that line is marked.
377: (The mark name must be a single lower case letter.)
378: Now you can refer to the marked line with the address
379: .P1
380: \(fmx
381: .P2
382: .PP
383: Marks are most useful for moving things around.
384: Find the first line of the block to be moved, and mark it
385: with
386: .ul
387: \(fma.
388: Then find the last line and mark it with
389: .ul
390: \(fmb.
391: Now position yourself at the place where the stuff is to go
392: and say
393: .P1
394: \(fma,\(fmbm\*.
395: .P2
396: .PP
397: Bear in mind that only one line can have a particular
398: mark name associated with it
399: at any given time.
400: .SH
401: Copying Lines
402: .PP
403: We mentioned earlier the idea of saving a line
404: that was hard to type or used often,
405: so as to cut down on typing time.
406: Of course this could be more than one line;
407: then the saving is presumably even greater.
408: .PP
409: .UL ed
410: provides another command,
411: called
412: .UL t
413: (for `transfer')
414: for making a copy of a group of one or more lines
415: at any point.
416: This is often easier than writing and reading.
417: .PP
418: The
419: .UL t
420: command is identical to the
421: .UL m
422: command, except that instead of moving lines
423: it simply duplicates them at the place you named.
424: Thus
425: .P1
426: 1,$t$
427: .P2
428: duplicates the entire contents that you are editing.
429: A more common use for
430: .UL t
431: is for creating a series of lines that differ only slightly.
432: For example, you can say
433: .P1
434: .ta 1i
435: a
436: \&.......... x ......... (long line)
437: \&\*.
438: t\*. (make a copy)
439: s/x/y/ (change it a bit)
440: t\*. (make third copy)
441: s/y/z/ (change it a bit)
442: .P2
443: and so on.
444: .SH
445: The Temporary Escape `!'
446: .PP
447: Sometimes it is convenient to be able
448: to temporarily escape from the editor to do
449: some other
450: .UX
451: command,
452: perhaps one of the file copy or move commands
453: discussed in section 5,
454: without leaving the editor.
455: The `escape' command
456: .UL !
457: provides a way to do this.
458: .PP
459: If you say
460: .P1
461: !any UNIX command
462: .P2
463: your current editing state is suspended,
464: and the
465: .UX
466: command you asked for is executed.
467: When the command finishes,
468: .UL ed
469: will signal you by printing another
470: .UL ! ;
471: at that point you can resume editing.
472: .PP
473: You can really do
474: .ul
475: any
476: .UX
477: command, including another
478: .UL ed .
479: (This is quite common, in fact.)
480: In this case, you can even do another
481: .UL ! .
482: .PP
483: On Berkeley
484: .UX
485: systems, there is an additional (and preferable) mechanism called
486: .ul
487: job control
488: which lets you suspend your edit session (or, for that matter,
489: any program), return to the shell from
490: which you invoked that program, and issue any commands, then resume
491: the program from the point where it was stopped. See
492: .ul
493: An Introduction to the C Shell
494: for more details.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.