Introduction
Introduction Statistics Contact Development Disclaimer Help
sam.tut.ms - sam - An updated version of the sam text editor.
git clone git://vernunftzentrum.de/sam.git
Log
Files
Refs
LICENSE
---
sam.tut.ms (40250B)
---
1 .de P1
2 .KS
3 .DS
4 .ft CW
5 .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n
6 ..
7 .de P2
8 .ft 1
9 .DE
10 .KE
11 ..
12 .de CW
13 .lg 0
14 \%\&\\$3\fB\\$1\fP\&\\$2
15 .lg
16 ..
17 .de WC
18 .lg 0
19 \%\&\\$3\fI\\$1\fP\&\\$2
20 .lg
21 ..
22 .TL
23 A tutorial for the
24 .CW sam
25 .B
26 command language
27 .AU
28 Rob Pike
29 .AI
30 .MH
31 .AB
32 .CW sam
33 is an interactive text editor with a command language that makes heavy u…
34 of regular expressions.
35 Although the language is syntactically similar to
36 .CW ed (1),
37 the details are interestingly different.
38 This tutorial introduces the command language, but does not discuss
39 the screen and mouse interface.
40 With apologies to those unfamiliar with the Ninth Edition Blit software,
41 it is assumed that the similarity of
42 .CW sam
43 to
44 .CW mux (9)
45 at this level makes
46 .CW sam 's
47 mouse language easy to learn.
48 .PP
49 The
50 .CW sam
51 command language applies identically to two environments:
52 when running
53 .CW sam
54 on an ordinary terminal
55 (\f2via\f1\f1
56 .CW sam\ -d ),
57 and in the command window of a
58 .I downloaded
59 .CW sam ,
60 that is, one using the bitmap display and mouse.
61 .AE
62 .SH
63 Introduction
64 .PP
65 This tutorial describes the command language of
66 .CW sam ,
67 an interactive text editor that runs on Blits and
68 some computers with bitmap displays.
69 For most editing tasks, the mouse-based editing features
70 are sufficient, and they are easy to use and to learn.
71 .PP
72 The command language is often useful, however, particularly
73 when making global changes.
74 Unlike the commands in
75 .CW ed ,
76 which are necessary to make changes,
77 .CW sam
78 commands tend to be used
79 only for complicated or repetitive editing tasks.
80 It is in these more involved uses that
81 the differences between
82 .CW sam
83 and other text editors are most evident.
84 .PP
85 .CW sam 's
86 language makes it easy to do some things that other editors,
87 including programs like
88 .CW sed
89 and
90 .CW awk ,
91 do not handle gracefully, so this tutorial serves partly as a
92 lesson in
93 .CW sam 's
94 manner of manipulating text.
95 The examples below therefore concentrate entirely on the language,
96 assuming that facility with the use of the mouse in
97 .CW sam
98 is at worst easy to pick up.
99 In fact,
100 .CW sam
101 can be run without the mouse at all (not
102 .I downloaded ),
103 by specifying the
104 .CW -d
105 flag, and it is this domain that the tutorial
106 occupies; the command language in these modes
107 are identical.
108 .PP
109 A word to the Unix adept:
110 although
111 .CW sam
112 is syntactically very similar to
113 .CW ed ,
114 it is fundamentally and deliberately different in design and detailed se…
115 You might use knowledge of
116 .CW ed
117 to predict how the substitute command works,
118 but you'd only be right if you had used some understanding of
119 .CW sam 's
120 workings to influence your prediction.
121 Be particularly careful about idioms.
122 Idioms form in curious nooks of languages and depend on
123 undependable peculiarities.
124 .CW ed
125 idioms simply don't work in
126 .CW sam :
127 .CW 1,$s/a/b/
128 makes one substitution in the whole file, not one per line.
129 .CW sam
130 has its own idioms.
131 Much of the purpose of this tutorial is to publish them
132 and make fluency in
133 .CW sam
134 a matter of learning, not cunning.
135 .PP
136 The tutorial depends on familiarity with regular expressions, although
137 some experience with a more traditional Unix editor may be helpful.
138 To aid readers familiar with
139 .CW ed ,
140 I have pointed out in square brackets [] some of
141 the relevant differences between
142 .CW ed
143 and
144 .CW sam .
145 Read these comments only if you wish
146 to understand the differences; the lesson is about
147 .CW sam ,
148 not
149 .CW sam
150 .I vs.
151 .CW ed .
152 Another typographic convention is that output appears in
153 .CW "this font,
154 while typed input appears as
155 .WC "slanty text.
156 .PP
157 Nomenclature:
158 .CW sam
159 keeps a copy of the text it is editing.
160 This copy is called a
161 .I file .
162 To avoid confusion, I have called the permanent storage on disc a
163 .I
164 Unix file.
165 .R
166 .SH
167 Text
168 .PP
169 To get started, we need some text to play with.
170 Any text will do; try something from
171 James Gosling's Emacs manual:
172 .P1
173 $ \fIsam -d
174 a
175 This manual is organized in a rather haphazard manner. The first
176 several sections were written hastily in an attempt to provide a
177 general introduction to the commands in Emacs and to try to show
178 the method in the madness that is the Emacs command structure.
179 \&.
180 .ft
181 .P2
182 .WC "sam -d
183 starts
184 .CW sam
185 running.
186 The
187 .CW a
188 command adds text until a line containing just a period, and sets the
189 .I
190 current text
191 .R
192 (also called
193 .I dot )
194 to what was typed \(em everything between the
195 .CW a
196 and the period.
197 .CW ed "" [
198 would leave dot set to only the last line.]
199 The
200 .CW p
201 command prints the current text:
202 .P1
203 .WC p
204 This manual is organized in a rather haphazard manner. The first
205 several sections were written hastily in an attempt to provide a
206 general introduction to the commands in Emacs and to try to show
207 the method in the madness that is the Emacs command structure.
208 .P2
209 [Again,
210 .CW ed
211 would print only the last line.]
212 The
213 .CW a
214 command adds its text
215 .I after
216 dot; the
217 .CW i
218 command is like
219 .CW a,
220 but adds the text
221 .I before
222 dot.
223 .P1
224 .ft I
225 i
226 Introduction
227 \&.
228 p
229 .ft
230 Introduction
231 .P2
232 There is also a
233 .CW c
234 command that changes (replaces) the current text,
235 and
236 .CW d
237 that deletes it; these are illustrated below.
238 .PP
239 To see all the text, we can specify what text to print;
240 for the moment, suffice it to say that
241 .WC 0,$
242 specifies the entire file.
243 .CW ed "" [
244 users would probably type
245 .WC 1,$ ,
246 which in practice is the same thing, but see below.]
247 .P1
248 .WC 0,$p
249 Introduction
250 This manual is organized in a rather haphazard manner. The first
251 several sections were written hastily in an attempt to provide a
252 general introduction to the commands in Emacs and to try to show
253 the method in the madness that is the Emacs command structure.
254 .P2
255 Except for the
256 .CW w
257 command described below,
258 .I all
259 commands,
260 including
261 .CW p ,
262 set dot to the text they touch.
263 Thus,
264 .CW a
265 and
266 .CW i
267 set dot to the new text,
268 .CW p
269 to the text printed, and so on.
270 Similarly, all commands
271 (except
272 .CW w )
273 by default operate on the current
274 text [unlike
275 .CW ed ,
276 for which some commands (such as
277 .CW g )
278 default to the entire file].
279 .PP
280 Things are not going to get very interesting until we can
281 set dot arbitrarily.
282 This is done by
283 .I addresses ,
284 which specify a piece of the file.
285 The address
286 .CW 1 ,
287 for example, sets dot to the first line of the file.
288 .P1
289 .WC 1p
290 Introduction
291 .WC c
292 .WC Preamble
293 .WC .
294 .P2
295 The
296 .CW c
297 command didn't need to specify dot; the
298 .CW p
299 left it on line one.
300 It's therefore easy to delete the first line utterly;
301 the last command left dot set to line one:
302 .P1
303 .WC d
304 .WC 1p
305 This manual is organized in a rather haphazard manner. The first
306 .P2
307 (Line numbers change
308 to reflect changes to the file.)
309 .PP
310 The address \f(CW/\f2text\f(CW/\f1
311 sets dot to the first appearance of
312 .I text ,
313 after dot.
314 .CW ed "" [
315 matches the first line containing
316 .I text .]
317 If
318 .I text
319 is not found, the search restarts at the beginning of the file
320 and continues until dot.
321 .P1
322 .WC /Emacs/p
323 Emacs
324 .P2
325 It's difficult to indicate typographically, but in this example no newli…
326 after
327 .CW Emacs :
328 the text to be printed is the string
329 .CW Emacs ', `
330 exactly.
331 (The final
332 .CW p
333 may be left off \(em it is the default command.
334 When downloaded, however, the default is instead to select the text,
335 to highlight it,
336 and to make it visible by moving the window on the file if necessary.
337 Thus,
338 .CW /Emacs/
339 indicates on the display the next occurrence of the text.)
340 .PP
341 Imagine we wanted to change the word
342 .CW haphazard
343 to
344 .CW thoughtless .
345 Obviously, what's needed is another
346 .CW c
347 command, but the method used so far to insert text includes a newline.
348 The syntax for including text without newlines is to surround the
349 text with slashes (which is the same as the syntax for
350 text searches, but what is going on should be clear from context).
351 The text must appear immediately after the
352 .CW c
353 (or
354 .CW a
355 or
356 .CW i ).
357 Given this, it is easy to make the required change:
358 .P1
359 .WC /haphazard/c/thoughtless/
360 1p
361 This manual is organized in a rather thoughtless manner. The first
362 .P2
363 [Changes can always be done with a
364 .CW c
365 command, even if the text is smaller than a line].
366 You'll find that this way of providing text to commands is much
367 more common than is the multiple-lines syntax.
368 If you want to include a slash
369 .CW /
370 in the text, just precede it with a backslash
371 .CW \e ,
372 and use a backslash to protect a backslash itself.
373 .P1
374 .WC /Emacs/c/Emacs\e\e360/
375 .WC 4p
376 general introduction to the commands in Emacs\e360 and to try to show
377 .P2
378 We could also make this particular change by
379 .P1
380 .WC /Emacs/a/\e\e360/
381 .P2
382 .PP
383 This is as good a place as any to introduce the
384 .CW u
385 command, which undoes the last command.
386 A second
387 .CW u
388 will undo the penultimate command, and so on.
389 .P1
390 .WC u
391 .WC 4p
392 general introduction to the commands in Emacs and to try to show
393 .WC u
394 .WC 3p
395 This manual is organized in a rather haphazard manner. The first
396 .P2
397 Undoing can only back up; there is no way to undo a previous
398 .CW u .
399 .SH
400 Addresses
401 .PP
402 We've seen the simplest forms of addresses, but there is more
403 to learn before we can get too much further.
404 An address selects a region in the file \(em a substring \(em
405 and therefore must define the beginning and the end of a region.
406 Thus, the address
407 .CW 13
408 selects from the beginning of line thirteen to the end of line thirteen,…
409 .CW /Emacs/
410 selects from the beginning of the word
411 .CW Emacs ' `
412 to the end.
413 .PP
414 Addresses may be combined with a comma:
415 .P1
416 13,15
417 .P2
418 selects lines thirteen through fifteen. The definition of the comma
419 operator is to select from the beginning of the left hand address (the
420 beginning of line 13) to the end of the right hand address (the
421 end of line 15).
422 .PP
423 A few special simple addresses come in handy:
424 .CW .
425 (a period) represents dot, the current text,
426 .CW 0
427 (line zero) selects the null string at the beginning of the file, and
428 .CW $
429 selects the null string at the end of the file
430 [not the last line of the file].
431 Therefore,
432 .P1
433 0,13
434 .P2
435 selects from the beginning of the file to the end of line thirteen,
436 .P1
437 \&.,$
438 .P2
439 selects from the beginning of the current text to the end of the file, a…
440 .P1
441 0,$
442 .P2
443 selects the whole file [that is, a single string containing the whole fi…
444 not a list of all the lines in the file].
445 .PP
446 These are all
447 .I absolute
448 addresses: they refer to specific places in the file.
449 .CW sam
450 also has relative addresses, which depend
451 on the value of dot,
452 and in fact we have already seen one form:
453 .CW /Emacs/
454 finds the first occurrence of
455 .CW Emacs
456 searching forwards from dot.
457 Which occurrence of
458 .CW Emacs
459 it finds depends on the value of dot.
460 What if you wanted the first occurrence
461 .CW before
462 dot? Just precede the pattern with a minus sign, which reverses the dir…
463 of the search:
464 .P1
465 -/Emacs/
466 .P2
467 In fact, the complete syntax for forward searching is
468 .P1
469 +/Emacs/
470 .P2
471 but the plus sign is the default, and in practice is rarely used.
472 Here is an example that includes it for clarity:
473 .P1
474 0+/Emacs/
475 .P2
476 selects the first occurrence of
477 .CW Emacs
478 in the file; read it as ``go to line 0, then search forwards for
479 .CW Emacs .''
480 Since the
481 .CW +
482 is optional, this can be written
483 .CW 0/Emacs/ .
484 Similarly,
485 .P1
486 $-/Emacs/
487 .P2
488 finds the last occurrence in the file, so
489 .P1
490 0/Emacs/,$-/Emacs/
491 .P2
492 selects the text from the first to last
493 .CW Emacs ,
494 inclusive.
495 Slightly more interesting:
496 .P1
497 /Emacs/+/Emacs/
498 .P2
499 (there is an implicit
500 .CW .+
501 at the beginning) selects the second
502 .CW Emacs
503 following dot.
504 .PP
505 Line numbers may also be relative.
506 .P1
507 -2
508 .P2
509 selects the second previous line, and
510 .P1
511 +5
512 .P2
513 selects the fifth following line (here the plus sign is obligatory).
514 .PP
515 Since addresses may select (and dot may be) more than one line,
516 we need a definition of `previous' and `following:'
517 `previous' means
518 .I
519 before the beginning
520 .R
521 of dot, and `following'
522 means
523 .I
524 after the end
525 .R
526 of dot.
527 For example, if the file contains \fBA\fIAA\fBA\f1,
528 with dot set to the middle two
529 .CW A 's
530 (the slanting characters),
531 .CW -/A/
532 sets dot to the first
533 .CW A ,
534 and
535 .CW +/A/
536 sets dot to the last
537 .CW A .
538 Except under odd circumstances (such as when the only occurrence of the
539 text in the file is already the current text), the text selected by a
540 search will be disjoint from dot.
541 .PP
542 To select the
543 .CW "troff -ms
544 paragraph containing dot, however long it is, use
545 .P1
546 -/.PP/,/.PP/-1
547 .P2
548 which will include the
549 .CW .PP
550 that begins the paragraph, and exclude the one that ends it.
551 .PP
552 When typing relative line number addresses, the default number is
553 .CW 1 ,
554 so the above could be written slightly more simply:
555 .P1
556 -/.PP/,/.PP/-
557 .P2
558 .PP
559 What does the address
560 .CW +1-1
561 or the equivalent
562 .CW +-
563 mean? It looks like it does nothing, but recall that dot need not be a
564 complete line of text.
565 .CW +1
566 selects the line after the end of the current text, and
567 .CW -1
568 selects the line before the beginning. Therefore
569 .CW +1-1
570 selects the line before the line after the end of dot, that is,
571 the complete line containing the end of dot.
572 We can use this construction to expand a selection to include a complete…
573 say the first line in the file containing
574 .CW Emacs :
575 .P1
576 .WC 0/Emacs/+-p
577 general introduction to the commands in Emacs and to try to show
578 .P2
579 The address
580 .CW +-
581 is an idiom.
582 .SH
583 Loops
584 .PP
585 Above, we changed one occurrence of
586 .CW Emacs
587 to
588 .CW Emacs\e360 ,
589 but if the name of the editor is really changing, it would be useful
590 to change
591 .I all
592 instances of the name in a single command.
593 .CW sam
594 provides a command,
595 .CW x
596 (extract), for just that job.
597 The syntax is
598 \f(CWx/\f2pattern\f(CW/\f2command\f1.
599 For each occurrence of the pattern in the selected text,
600 .CW x
601 sets dot to the occurrence and runs command.
602 For example, to change
603 .CW Emacs
604 to
605 .CW vi,
606 .P1
607 .WC 0,$x/Emacs/c/vi/
608 .WC 0,$p
609 This manual is organized in a rather haphazard manner. The first
610 several sections were written hastily in an attempt to provide a
611 general introduction to the commands in vi and to try to show
612 the method in the madness that is the vi command structure.
613 .P2
614 This
615 works by subdividing the current text
616 .CW 0,$ "" (
617 \(em the whole file) into appearances of its textual argument
618 .CW Emacs ), (
619 and then running the command that follows
620 .CW c/vi/ ) (
621 with dot set to the text.
622 We can read this example as, ``find all occurrences of
623 .CW Emacs
624 in the file, and for each one,
625 set the current text to the occurrence and run the command
626 .CW c/vi/ ,
627 which will replace the current text by
628 .CW vi. ''
629 [This command is somewhat similar to
630 .CW ed 's
631 .CW g
632 command. The differences will develop below, but note that the
633 default address, as always, is dot rather than the whole file.]
634 .PP
635 A single
636 .CW u
637 command is sufficient to undo an
638 .CW x
639 command, regardless of how many individual changes the
640 .CW x
641 makes.
642 .P1
643 .WC u
644 .WC 0,$p
645 This manual is organized in a rather haphazard manner. The first
646 several sections were written hastily in an attempt to provide a
647 general introduction to the commands in Emacs and to try to show
648 the method in the madness that is the Emacs command structure.
649 .P2
650 .PP
651 Of course,
652 .CW c
653 is not the only command
654 .CW x
655 can run. An
656 .CW a
657 command can be used to put proprietary markings on
658 .CW Emacs :
659 .P1
660 .WC 0,$x/Emacs/a/{TM}/
661 .WC /Emacs/+-p
662 general introduction to the commands in Emacs{TM} and to try to show
663 .P2
664 [There is no way to see the changes as they happen, as in
665 .CW ed 's
666 .CW g/Emacs/s//&{TM}/p ;
667 see the section on Multiple Changes, below.]
668 .PP
669 The
670 .CW p
671 command is also useful when driven by an
672 .CW x ,
673 but be careful that you say what you mean;
674 .P1
675 .WC 0,$x/Emacs/p
676 EmacsEmacs
677 .P2
678 since
679 .CW x
680 sets dot to the text in the slashes, printing only that text
681 is not going to be very
682 informative. But the command that
683 .CW x
684 runs can contain addresses. For example, if we want to print all
685 lines containing
686 .CW Emacs ,
687 just use
688 .CW +- :
689 .P1
690 .WC 0,$x/Emacs/+-p
691 general introduction to the commands in Emacs{TM} and to try to show
692 the method in the madness that is the Emacs{TM} command structure.
693 .P2
694 Finally, let's restore the state of the file with another
695 .CW x
696 command, and make use of a handy shorthand:
697 a comma in an address has its left side default to
698 .CW 0 ,
699 and its right side default to
700 .CW $ ,
701 so the easy-to-type address
702 .CW ,
703 refers to the whole file:
704 .P1
705 .WC ",x/Emacs/ /{TM}/d
706 .WC ,p
707 This manual is organized in a rather haphazard manner. The first
708 several sections were written hastily in an attempt to provide a
709 general introduction to the commands in Emacs and to try to show
710 the method in the madness that is the Emacs command structure.
711 .P2
712 Notice what this
713 .CW x
714 does: for each occurrence of Emacs,
715 find the
716 .CW {TM}
717 that follows, and delete it.
718 .PP
719 The `text'
720 .CW sam
721 accepts
722 for searches in addresses and in
723 .CW x
724 commands is not simple text, but rather
725 .I regular\ expressions.
726 Unix has several distinct interpretations of regular expressions.
727 The form used by
728 .CW sam
729 is that of
730 .CW regexp (6),
731 including parentheses
732 .CW ()
733 for grouping and an `or' operator
734 .CW |
735 for matching strings in parallel.
736 .CW sam
737 also matches the character sequence
738 .CW \en
739 with a newline character.
740 Replacement text, such as used in the
741 .CW a
742 and
743 .CW c
744 commands, is still plain text, but the sequence
745 .CW \en
746 represents newline in that context, too.
747 .PP
748 Here is an example. Say we wanted to double space the document, that is,
749 turn every newline into two newlines.
750 The following all do the job:
751 .P1
752 .WC ",x/\en/ a/\en/
753 .WC ",x/\en/ c/\en\en/
754 .WC ",x/$/ a/\en/
755 .WC ",x/^/ i/\en/
756 .P2
757 The last example is slightly different, because it puts a newline
758 .I before
759 each line; the other examples place it after.
760 The first two examples manipulate newlines directly
761 [something outside
762 .CW ed 's
763 ken]; the last two
764 use regular expressions:
765 .CW $
766 is the empty string at the end of a line, while
767 .CW ^
768 is the empty string at the beginning.
769 .PP
770 These solutions all have a possible drawback: if there is already a blan…
771 (that is, two consecutive newlines), they make it much larger (four
772 consecutive newlines).
773 A better method is to extend every group of newlines by one:
774 .P1
775 .WC ",x/\en+/ a/\en/
776 .P2
777 The regular expression operator
778 .CW +
779 means `one or more;'
780 .CW \en+
781 is identical to
782 .CW \en\en* .
783 Thus, this example
784 takes every sequence of newlines and adds another
785 to the end.
786 .PP
787 A more common example is indenting a block of text by a tab stop.
788 The following all work,
789 although the first is arguably the cleanest (the blank text in slashes i…
790 .P1
791 .WC ",x/^/a/ /
792 .WC ",x/^/c/ /
793 .WC ",x/.*\en/i/ /
794 .P2
795 The last example uses the pattern (idiom, really)
796 .CW .*\en
797 to match lines:
798 .CW .*
799 matches the longest possible string of non-newline characters.
800 Taking initial tabs away is just as easy:
801 .P1
802 .WC ",x/^ /d
803 .P2
804 In these examples I have specified an address (the whole file), but
805 in practice commands like these are more likely to be run without
806 an address, using the value of dot set by selecting text with the mouse.
807 .SH
808 Conditionals
809 .PP
810 The
811 .CW x
812 command is a looping construct:
813 for each match of a regular expression,
814 it extracts (sets dot to) the match and runs a command.
815 .CW sam
816 also has a conditional,
817 .CW g :
818 \f(CWg/\f2pattern\f(CW/\f2command\f1
819 runs the command if dot contains a match of the pattern
820 .I
821 without changing the value of dot.
822 .R
823 The inverse,
824 .CW v ,
825 runs the command if dot does
826 .I not
827 contain a match of the pattern.
828 (The letters
829 .CW g
830 and
831 .CW v
832 are historical and have no mnemonic significance. You might
833 think of
834 .CW g
835 as `guard.')
836 .CW ed "" [
837 users should read the above definitions very carefully; the
838 .CW g
839 command in
840 .CW sam
841 is fundamentally different from that in
842 .CW ed .]
843 Here is an example of the difference between
844 .CW x
845 and
846 .CW g:
847 .P1
848 ,x/Emacs/c/vi/
849 .P2
850 changes each occurrence of the word
851 .CW Emacs
852 in the file to the word
853 .CW vi ,
854 but
855 .P1
856 ,g/Emacs/c/vi/
857 .P2
858 changes the
859 .I "whole file
860 to
861 .CW vi
862 if there is the word
863 .CW Emacs
864 anywhere in the file.
865 .PP
866 Neither of these commands is particularly interesting in isolation,
867 but they are valuable when combined with
868 .CW x
869 and with themselves.
870 .SH
871 Composition
872 .PP
873 One way to think about the
874 .CW x
875 command is that, given a selection (a value of dot)
876 it iterates through interesting subselections (values of dot within).
877 In other words, it takes a piece of text and cuts it into smaller pieces.
878 But the text that it cuts up may already be a piece cut by a previous
879 .CW x
880 command or selected by a
881 .CW g .
882 .CW sam 's
883 most interesting property is the ability to define a sequence of commands
884 to perform a particular task.\(dg
885 .FS
886 \(dg
887 The obvious analogy with shell pipelines is only partially valid,
888 because the individual
889 .CW sam
890 commands are all working on the same text; it is only how the text is
891 sliced up that is changing.
892 .FE
893 A simple example is to change all occurrences of
894 .CW Emacs
895 to
896 .CW emacs ;
897 certainly the command
898 .P1
899 .WC ",x/Emacs/ c/emacs/
900 .P2
901 will work, but we can use an
902 .CW x
903 command to save retyping most of the word
904 .CW Emacs :
905 .P1
906 .WC ",x/Emacs/ x/E/ c/e/
907 .P2
908 (Blanks can be used
909 to separate commands on a line to make them easier to read.)
910 What this command does is find all occurrences of
911 .CW Emacs
912 .CW ,x/Emacs/ ), (
913 and then
914 .I
915 with dot set to that text,
916 .R
917 find all occurrences of the letter
918 .CW E
919 .CW x/E/ ), (
920 and then
921 .I
922 with dot set to that text,
923 .R
924 run the command
925 .CW c/e/
926 to change the character to lower case.
927 Note that the address for the command \(em the whole file, specified by …
928 \(em is only given to the leftmost
929 piece of the command; the rest of the pieces have dot set for them by
930 the execution of the pieces to their left.
931 .PP
932 As another simple example, consider a problem
933 solved above: printing all lines in the file containing the word
934 .CW Emacs:
935 .P1
936 .WC ",x/.*\en/ g/Emacs/p
937 general introduction to the commands in Emacs and to try to show
938 the method in the madness that is the Emacs command structure.
939 .P2
940 This command says to break the file into lines
941 .CW ,x/.*\en/ ), (
942 and for each line that contains the string
943 .CW Emacs
944 .CW g/Emacs/ ), (
945 run the command
946 .CW p
947 with dot set to the line (not the match of
948 .CW Emacs ),
949 which prints the line.
950 To save typing, because
951 .CW .*\en
952 is a common pattern in
953 .CW x
954 commands,
955 if the
956 .CW x
957 is followed immediately by a space, the pattern
958 .CW .*\en
959 is assumed.
960 Therefore, the above could be written more succinctly:
961 .P1
962 .WC ",x g/Emacs/p
963 .P2
964 The solution we used before was
965 .P1
966 .WC ,x/Emacs/+-p
967 .P2
968 which runs the command
969 .CW +-p
970 with dot set to each match of
971 .CW Emacs
972 in the file (recall that the idiom
973 .CW +-p
974 prints the line containing the end of dot).
975 .PP
976 The two commands usually produce the same result
977 (the
978 .CW +-p
979 form will print a line twice if it contains
980 .CW Emacs
981 twice). Which is better?
982 .CW ,x/Emacs/+-p
983 is easier to type and will be much faster if the file is large and
984 there are few occurrences of the string, but it is really an odd special…
985 .CW ",x/.*\en/ g/Emacs/p
986 is slower \(em it breaks each line out separately, then examines
987 it for a match \(em but is conceptually cleaner, and generalizes more ea…
988 For example, consider the following piece of the Emacs manual:
989 .P1
990 command name="append-to-file", key="[unbound]"
991 Takes the contents of the current buffer and appends it to the
992 named file. If the file doesn't exist, it will be created.
993
994 command name="apropos", key="ESC-?"
995 Prompts for a keyword and then prints a list of those commands
996 whose short description contains that keyword. For example,
997 if you forget which commands deal with windows, just type
998 "@b[ESC-?]@t[window]@b[ESC]".
999
1000 \&\f2and so on\f(CW
1001 .P2
1002 This text consists of groups of non-empty lines, with a simple format
1003 for the text within each group.
1004 Imagine that we wanted to find the description of the `apropos'
1005 command.
1006 The problem is to break the file into individual descriptions,
1007 and then to find the description of `apropos' and to print it.
1008 The solution is straightforward:
1009 .P1
1010 .WC ,x/(.+\en)+/\ g/command\ name="apropos"/p
1011 command name="apropos", key="ESC-?"
1012 Prompts for a keyword and then prints a list of those commands
1013 whose short description contains that keyword. For example,
1014 if you forget which commands deal with windows, just type
1015 "@b[ESC-?]@t[window]@b[ESC]".
1016 .P2
1017 The regular expression
1018 .CW (.+\en)+
1019 matches one or more lines with one or more characters each, that is,
1020 the text between blank lines, so
1021 .CW ,x/(.+\en)+/
1022 extracts each description; then
1023 .CW g/command\ name="apropos"/
1024 selects the description for `apropos' and
1025 .CW p
1026 prints it.
1027 .PP
1028 Imagine that we had a C program containing the variable
1029 .CW n ,
1030 but we wanted to change it to
1031 .CW num .
1032 This command is a first cut:
1033 .P1
1034 .WC ",x/n/ c/num/
1035 .P2
1036 but is obviously flawed: it will change all
1037 .CW n 's
1038 in the file, not just the
1039 .I identifier
1040 .CW n .
1041 A better solution is to use an
1042 .CW x
1043 command to extract the identifiers, and then use
1044 .CW g
1045 to find the
1046 .CW n 's:
1047 .P1
1048 .WC ",x/[a-zA-Z_][a-zA-Z_0-9]*/ g/n/ v/../ c/num/
1049 .P2
1050 It looks awful, but it's fairly easy to understand when read
1051 left to right.
1052 A C identifier is an alphabetic or underscore followed by zero or more
1053 alphanumerics or underscores, that is, matches of the regular expression
1054 .CW [a-zA-Z_][a-zA-Z_0-9]* .
1055 The
1056 .CW g
1057 command selects those identifiers containing
1058 .CW n ,
1059 and the
1060 .CW v
1061 is a trick: it rejects those identifiers containing more than one
1062 character. Hence the
1063 .CW c/num/
1064 applies only to free-standing
1065 .CW n 's.
1066 .PP
1067 There is still a problem here:
1068 we don't want to change
1069 .CW n 's
1070 that are part of the character constant
1071 .CW \en .
1072 There is a command
1073 .CW y ,
1074 complementary to
1075 .CW x ,
1076 that is just what we need:
1077 \f(CWy/\f2pattern\f(CW/\f2command\f1
1078 runs the command on the pieces of text
1079 .I between
1080 matches of the pattern;
1081 if
1082 .CW x
1083 selects,
1084 .CW y
1085 rejects.
1086 Here is the final command:
1087 .P1
1088 .WC ",y/\e\en/ x/[a-zA-Z_][a-zA-Z_0-9]*/ g/n/ v/../ c/num/
1089 .P2
1090 The
1091 .CW y/\e\en/
1092 (with backslash doubled to make it a literal character)
1093 removes the two-character sequence
1094 .CW \en
1095 from consideration, so the rest of the command will not touch it.
1096 There is more we could do here; for example, another
1097 .CW y
1098 could be prefixed to protect comments in the code.
1099 I won't elaborate the example any further, but you should have
1100 an idea of the way in which the looping and conditional commands
1101 in
1102 .CW sam
1103 may be composed to do interesting things.
1104 .SH
1105 Grouping
1106 .PP
1107 There is another way to arrange commands.
1108 By enclosing them in brace brackets
1109 .CW {} ,
1110 commands may be applied in parallel.
1111 This example uses the
1112 .CW =
1113 command, which reports the line and character numbers of dot,
1114 together with
1115 .CW p ,
1116 to report on appearances of
1117 .CW Emacs
1118 in our original file:
1119 .P1
1120 .WC ,p
1121 This manual is organized in a rather haphazard manner. The first
1122 several sections were written hastily in an attempt to provide a
1123 general introduction to the commands in Emacs and to try to show
1124 the method in the madness that is the Emacs command structure.
1125 .ft I
1126 ,x/Emacs/{
1127 =
1128 +-p
1129 }
1130 .ft
1131 3; #171,#176
1132 general introduction to the commands in Emacs and to try to show
1133 4; #234,#239
1134 the method in the madness that is the Emacs command structure.
1135 .P2
1136 (The number before the semicolon is the line number;
1137 the numbers beginning with
1138 .CW #
1139 are character numbers.)
1140 As a more interesting example, consider changing all occurrences of
1141 .CW Emacs
1142 to
1143 .CW vi
1144 and vice versa. We can type
1145 .P1
1146 .ft I
1147 ,x/Emacs|vi/{
1148 g/Emacs/ c/vi/
1149 g/vi/ c/Emacs/
1150 }
1151 .ft
1152 .P2
1153 or even
1154 .P1
1155 .ft I
1156 ,x/[a-zA-Z]+/{
1157 g/Emacs/ v/....../ c/vi/
1158 g/vi/ v/.../ c/Emacs/
1159 }
1160 .ft
1161 .P2
1162 to make sure we don't change strings embedded in words.
1163 .SH
1164 Multiple Changes
1165 .PP
1166 You might wonder why, once
1167 .CW Emacs
1168 has been changed to
1169 .CW vi
1170 in the above example,
1171 the second command in the braces doesn't put it back again.
1172 The reason is that the commands are run in parallel:
1173 within any top-level
1174 .CW sam
1175 command, all changes to the file refer to the state of the file
1176 before any of the changes in that command are made.
1177 After all the changes have been determined, they are all applied
1178 simultaneously.
1179 .PP
1180 This means, as mentioned, that commands within a compound
1181 command see the state of the file before any of the changes apply.
1182 This method of evaluation makes some things easier (such as the exchange…
1183 .CW Emacs
1184 and
1185 .CW vi ),
1186 and some things harder.
1187 For instance, it is impossible to use a
1188 .CW p
1189 command to print the changes as they happen,
1190 because they haven't happened when the
1191 .CW p
1192 is executed.
1193 An indirect ramification is that changes must occur in forward
1194 order through the file,
1195 and must not overlap.
1196 .SH
1197 Unix
1198 .PP
1199 .CW sam
1200 has a few commands to connect to Unix processes.
1201 The simplest is
1202 .CW ! ,
1203 which runs the command with input and output connected to the terminal.
1204 .P1
1205 .WC !date
1206 Wed May 28 23:25:21 EDT 1986
1207 !
1208 .P2
1209 (When downloaded, the input is connected to
1210 .CW /dev/null
1211 and only the first few lines of output are printed;
1212 any overflow is stored in
1213 .CW $HOME/sam.err .)
1214 The final
1215 .CW !
1216 is a prompt to indicate when the command completes.
1217 .PP
1218 Slightly more interesting is
1219 .CW > ,
1220 which provides the current text as standard input to the Unix command:
1221 .P1
1222 .WC "1,2 >wc
1223 2 22 131
1224 !
1225 .P2
1226 The complement of
1227 .CW >
1228 is, naturally,
1229 .CW < :
1230 it replaces the current text with the standard output of the Unix comman…
1231 .P1
1232 .WC "1 <date
1233 !
1234 .WC 1p
1235 Wed May 28 23:26:44 EDT 1986
1236 .P2
1237 The last command is
1238 .CW | ,
1239 which is a combination of
1240 .CW <
1241 and
1242 .CW > :
1243 the current text is provided as standard input to the Unix command,
1244 and the Unix command's standard output is collected and used to
1245 replace the original text.
1246 For example,
1247 .P1
1248 .WC ",| sort
1249 .P2
1250 runs
1251 .CW sort (1)
1252 on the file, sorting the lines of the text lexicographically.
1253 Note that
1254 .CW < ,
1255 .CW >
1256 and
1257 .CW |
1258 are
1259 .CW sam
1260 commands, not Unix shell operators.
1261 .PP
1262 The next example converts all appearances of
1263 .CW Emacs
1264 to upper case using
1265 .CW tr (1):
1266 .P1
1267 .WC ",x/Emacs/ | tr a-z A-Z
1268 .P2
1269 .CW tr
1270 is run once for each occurrence of
1271 .CW Emacs .
1272 Of course, you could do this example more efficiently with a simple
1273 .CW c
1274 command, but here's a trickier one:
1275 given a Unix mail box as input,
1276 convert all the
1277 .CW Subject
1278 headers to distinct fortunes:
1279 .P1
1280 .WC ",x/^Subject:.*\en/ x/[^:]*\en/ < /usr/games/fortune
1281 .P2
1282 (The regular expression
1283 .CW [^:]
1284 refers to any character
1285 .I except
1286 .CW :
1287 and newline; the negation operator
1288 .CW ^
1289 excludes newline from the list of characters.)
1290 Again,
1291 .CW /usr/games/fortune
1292 is run once for each
1293 .CW Subject
1294 line, so each
1295 .CW Subject
1296 line is changed to a different fortune.
1297 .SH
1298 A few other text commands
1299 .PP
1300 For completeness, I should mention three other commands that
1301 manipulate text. The
1302 .CW m
1303 command moves the current text to after the text specified by the
1304 (obligatory) address after the command.
1305 Thus
1306 .P1
1307 .WC "/Emacs/+- m 0
1308 .P2
1309 moves the next line containing
1310 .CW Emacs
1311 to the beginning of the file.
1312 Similarly,
1313 .CW t
1314 (another historic character) copies the text:
1315 .P1
1316 .WC "/Emacs/+- t 0
1317 .P2
1318 would make, at the beginning of the file, a copy of the next line
1319 containing
1320 .CW Emacs .
1321 .PP
1322 The third command is more interesting: it makes substitutions.
1323 Its syntax is
1324 \f(CWs/\f2pattern\f(CW/\f2replacement\f(CW/\f1.
1325 Within the current text, it finds the first occurrence of
1326 the pattern and replaces it by the replacement text,
1327 leaving dot set to the entire address of the substitution.
1328 .P1
1329 .WC 1p
1330 This manual is organized in a rather haphazard manner. The first
1331 .WC s/haphazard/thoughtless/
1332 .WC p
1333 This manual is organized in a rather thoughtless manner. The first
1334 .P2
1335 Occurrences of the character
1336 .CW &
1337 in the replacement text stand for the text matching the pattern.
1338 .P1
1339 .WC s/T/"&&&&"/
1340 .WC p
1341 "TTTT"his manual is organized in a rather thoughtless manner. The first
1342 .P2
1343 There are two variants. The first is that a number may be specified
1344 after the
1345 .CW s ,
1346 to indicate which occurrence of the pattern to substitute; the default
1347 is the first.
1348 .P1
1349 .WC s2/is/was/
1350 .WC p
1351 "TTTT"his manual was organized in a rather thoughtless manner. The first
1352 .P2
1353 The second is that suffixing a
1354 .CW g
1355 (global) causes replacement of all occurrences, not just the first.
1356 .P1
1357 .WC s/[a-zA-Z]/x/g
1358 .WC p
1359 "xxxx"xxx xxxxxx xxx xxxxxxxxx xx x xxxxxx xxxxxxxxxxx xxxxxxx xxx xxxxx
1360 .P2
1361 Notice that in all these examples
1362 dot is left
1363 set to the entire line.
1364 .PP
1365 [The substitute command is vital to
1366 .CW ed,
1367 because it is the only way to make changes within a line.
1368 It is less valuable in
1369 .CW sam ,
1370 in which the concept of a line is much less important.
1371 For example, many
1372 .CW ed
1373 substitution idioms are handled well by
1374 .CW sam 's
1375 basic commands. Consider the commands
1376 .P1
1377 s/good/bad/
1378 s/good//
1379 s/good/& bye/
1380 .P2
1381 which are equivalent in
1382 .CW sam
1383 to
1384 .P1
1385 /good/c/bad/
1386 /good/d
1387 /good/a/ bye/
1388 .P2
1389 and for which the context search is likely unnecessary because the desir…
1390 text is already dot.
1391 Also, beware this
1392 .CW ed
1393 idiom:
1394 .P1
1395 1,$s/good/bad/
1396 .P2
1397 which changes the first
1398 .CW good
1399 on each line; the same command in
1400 .CW sam
1401 will only change the first one in the whole file.
1402 The correct
1403 .CW sam
1404 version is
1405 .P1
1406 ,x s/good/bad/
1407 .P2
1408 but what is more likely meant is
1409 .P1
1410 ,x/good/ c/bad/
1411 .P2
1412 .CW sam
1413 operates under different rules.]
1414 .SH
1415 Files
1416 .PP
1417 So far, we have only been working with a single file,
1418 but
1419 .CW sam
1420 is a multi-file editor.
1421 Only one file may be edited at a time, but
1422 it is easy to change which file is the `current' file for editing.
1423 To see how to do this, we need a
1424 .CW sam
1425 with a few files;
1426 the easiest way to do this is to start it
1427 with a list of Unix file names to edit.
1428 .P1
1429 $ \fIecho *.ms\f(CW
1430 conquest.ms death.ms emacs.ms famine.ms slaughter.ms
1431 $ \fIsam -d *.ms\f(CW
1432 -. conquest.ms
1433 .P2
1434 (I'm sorry the Horsemen don't appear in liturgical order.)
1435 The line printed by
1436 .CW sam
1437 is an indication that the Unix file
1438 .CW conquest.ms
1439 has been read, and is now the current file.
1440 .CW sam
1441 does not read the Unix file until
1442 the associated
1443 .CW sam
1444 file becomes current.
1445 .PP
1446 The
1447 .CW n
1448 command prints the names of all the files:
1449 .P1
1450 .WC n
1451 -. conquest.ms
1452 - death.ms
1453 - emacs.ms
1454 - famine.ms
1455 - slaughter.ms
1456 .P2
1457 This list is also available in the menu on mouse button 3.
1458 The command
1459 .CW f
1460 tells the name of just the current file:
1461 .P1
1462 .WC f
1463 -. conquest.ms
1464 .P2
1465 The characters to the left of the file name encode helpful information a…
1466 the file.
1467 The minus sign becomes a plus sign if the file has a window open, and an
1468 asterisk if more than one is open.
1469 The period (another meaning of dot) identifies the current file.
1470 The leading blank changes to an apostrophe if the file is different
1471 from the contents of the associated Unix file, as far as
1472 .CW sam
1473 knows.
1474 This becomes evident if we make a change.
1475 .P1
1476 .WC 1d
1477 .WC f
1478 \&'-. conquest.ms
1479 .P2
1480 If the file is restored by an undo command, the apostrophe disappears.
1481 .P1
1482 .WC u
1483 .WC f
1484 -. conquest.ms
1485 .P2
1486 The file name may be changed by providing a new name with the
1487 .CW f
1488 command:
1489 .P1
1490 .CW "f pestilence.ms
1491 \&'-. pestilence.ms
1492 .P2
1493 .WC f
1494 prints the new status of the file,
1495 that is, it changes the name if one is provided, and prints the
1496 name regardless.
1497 A file name change may also be undone.
1498 .P1
1499 .WC u
1500 .WC f
1501 -. conquest.ms
1502 .P2
1503 .PP
1504 When
1505 .CW sam
1506 is downloaded, the current file may be changed simply by selecting
1507 the desired file from the menu (selecting the same file subsequently
1508 cycles through the windows opened on the file).
1509 Otherwise, the
1510 .CW b
1511 command can be used to choose the desired file:\(dg
1512 .FS
1513 \(dg A bug prevents the
1514 .CW b
1515 command from working when downloaded.
1516 Because the menu is more convenient anyway, and
1517 because the method
1518 of choosing files from the command language is slated to change,
1519 the bug hasn't been fixed.
1520 .FE
1521 .P1
1522 .WC "b emacs.ms
1523 -. emacs.ms
1524 .P2
1525 Again,
1526 .CW sam
1527 prints the name (actually, executes an implicit
1528 .CW f
1529 command) because the Unix file
1530 .CW emacs.ms
1531 is being read for the first time.
1532 It is an error to ask for a file
1533 .CW sam
1534 doesn't know about, but the
1535 .CW B
1536 command will prime
1537 .CW sam 's
1538 menu with a new file, and make it current.
1539 .P1
1540 .WC "b flood.pic
1541 ?no such file `flood.pic'
1542 .WC "B flood.pic
1543 -. flood.pic
1544 .WC n
1545 - conquest.ms
1546 - death.ms
1547 - emacs.ms
1548 - famine.ms
1549 -. flood.pic
1550 - slaughter.ms
1551 .P2
1552 Both
1553 .CW b
1554 and
1555 .CW B
1556 will accept a list of file names.
1557 .CW b
1558 simply takes the first file in the list, but
1559 .CW B
1560 loads them all.
1561 The list may be typed on one line \(em
1562 .P1
1563 .WC "B devil.tex satan.tex 666.tex emacs.tex
1564 .P2
1565 \(em or generated by a Unix command \(em
1566 .P1
1567 .WC "B <echo *.tex
1568 .P2
1569 The latter form requires a Unix command;
1570 .CW sam
1571 does not understand the shell file name metacharacters, so
1572 .CW "B *.tex
1573 attempts to load a single file named
1574 .CW *.tex .
1575 (The
1576 .CW <
1577 form is of course derived from
1578 .CW sam 's
1579 .CW <
1580 command.)
1581 .CW echo
1582 is not the only useful command to run subservient to
1583 .CW B ;
1584 for example,
1585 .P1
1586 .WC "B <grep -l Emacs *
1587 .P2
1588 will load only those files containing the string
1589 .CW Emacs .
1590 Finally, a special case: a
1591 .CW B
1592 with no arguments creates an empty, nameless file within
1593 .CW sam .
1594 .PP
1595 The complement of
1596 .CW B
1597 is
1598 .CW D :
1599 .P1
1600 .WC "D devil.tex satan.tex 666.tex emacs.tex
1601 .P2
1602 eradicates the files from
1603 .CW sam 's
1604 memory (not from the Unix machine's disc).
1605 .CW D
1606 without any file names removes the current file from
1607 .CW sam .
1608 .PP
1609 There are three other commands that relate the current file
1610 to Unix files.
1611 The
1612 .CW w
1613 command writes the file to disc;
1614 without arguments, it writes the entire file to the Unix file associated
1615 with the current file in
1616 .CW sam
1617 (it is the only command whose default address is not dot).
1618 Of course, you can specify an address to be written,
1619 and a different file name, with the obvious syntax:
1620 .P1
1621 .WC "1,2w /tmp/revelations
1622 /tmp/revelations: #44
1623 .P2
1624 .CW sam
1625 responds with the file name and the number of characters written to the …
1626 The
1627 .CW write
1628 command on the button 3 menu is identical in function to an unadorned
1629 .CW w
1630 command.
1631 .PP
1632 The other two commands,
1633 .CW e
1634 and
1635 .CW r ,
1636 read data from Unix files.
1637 The
1638 .CW e
1639 command clears out the current file,
1640 reads the data from the named file (or uses the current file's old name …
1641 none is explicitly provided), and sets the file name.
1642 It's much like a
1643 .CW B
1644 command, but puts the information in the current file instead of a new o…
1645 .CW e
1646 without any file name is therefore an easy way to refresh
1647 .CW sam 's
1648 copy of a Unix file.
1649 [Unlike in
1650 .CW ed ,
1651 .CW e
1652 doesn't complain if the file is modified. The principle is not
1653 to protect against things that can be undone if wrong.]
1654 Since its job is to replace the whole text,
1655 .CW e
1656 never takes an address.
1657 .PP
1658 The
1659 .CW r
1660 command is like
1661 .CW e ,
1662 but it doesn't clear the file:
1663 the text in the Unix file replaces dot, or the specified text if an
1664 address is given.
1665 .P1
1666 .WC "r emacs.ms
1667 .P2
1668 has essentially the effect of
1669 .P1
1670 .WC "<cat emacs.ms
1671 .P2
1672 The commands
1673 .CW r
1674 and
1675 .CW w
1676 will set the name of the file if the current file has no name already de…
1677 .CW e
1678 sets the name even if the file already has one.
1679 .PP
1680 There is a command, analogous to
1681 .CW x ,
1682 that iterates over files instead of pieces of text:
1683 .CW X
1684 (capital
1685 .CW x ).
1686 The syntax is easy; it's just like that of
1687 .CW x
1688 \(em \f(CWX/\f2pattern\f(CW/\f2command\f1.
1689 (The complementary command is
1690 .CW Y ,
1691 analogous to
1692 .CW y .)
1693 The effect is to run the command in each file whose menu entry
1694 (that is, whose line printed by an
1695 .CW f
1696 command) matches the pattern.
1697 For example, since an apostrophe identifies modified files,
1698 .P1
1699 .WC "X/'/ w
1700 .P2
1701 writes the changed files out to disc.
1702 Here is a longer example: find all uses of a particular variable
1703 in the C source files:
1704 .P1
1705 .WC "X/\e.c$/ ,x/variable/+-p
1706 .P2
1707 We can use an
1708 .CW f
1709 command to identify which file the variable appears in:
1710 .P1
1711 .ft I
1712 X/\e.c$/ ,g/variable/ {
1713 f
1714 ,x/variable/+-{
1715 =
1716 p
1717 }
1718 }
1719 .ft
1720 .P2
1721 Here, the
1722 .CW g
1723 command guarantees that only the names of files containing the variable
1724 will be printed (but beware that
1725 .CW sam
1726 may confuse matters by printing the names of files it reads in during
1727 the command).
1728 The
1729 .CW =
1730 command shows where in the file the variable appears, and the
1731 .CW p
1732 command prints the line.
1733 .PP
1734 The
1735 .CW D
1736 command is handy as the target of an
1737 .CW X .
1738 This example deletes from the menu all C files that do not contain
1739 a particular variable:
1740 .P1
1741 .WC "X/\e.c$/ ,v/variable/ D
1742 .P2
1743 If no pattern is provided for the
1744 .CW X ,
1745 the command (which defaults to
1746 .CW f )
1747 is run in all files, so
1748 .P1
1749 .WC "X D
1750 .P2
1751 cleans
1752 .CW sam
1753 up for a fresh start.
1754 .PP
1755 But rather than working any further, let's stop now:
1756 .P1
1757 .WC q
1758 $
1759 .P2
1760 .fi
1761 .PP
1762 Some of the file manipulating commands can be undone:
1763 undoing a
1764 .CW f ,
1765 .CW e ,
1766 or
1767 .CW r
1768 restores the previous state of the file,
1769 but
1770 .CW w ,
1771 .CW B
1772 and
1773 .CW D
1774 are irrevocable.
1775 And, of course, so is
1776 .CW q .
You are viewing proxied material from vernunftzentrum.de. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.