xref: /plan9/sys/doc/sam/sam.tut (revision 6a5dc2224c39be050e950388971fcc3c57735be9)
13e12c5d1SDavid du Colombier.de P1
23e12c5d1SDavid du Colombier.KS
33e12c5d1SDavid du Colombier.DS
43e12c5d1SDavid du Colombier.ft CW
53e12c5d1SDavid du Colombier.ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n
63e12c5d1SDavid du Colombier..
73e12c5d1SDavid du Colombier.de P2
83e12c5d1SDavid du Colombier.ft 1
93e12c5d1SDavid du Colombier.DE
103e12c5d1SDavid du Colombier.KE
113e12c5d1SDavid du Colombier..
123e12c5d1SDavid du Colombier.de CW
133e12c5d1SDavid du Colombier.lg 0
143e12c5d1SDavid du Colombier\%\&\\$3\f(CW\\$1\fP\&\\$2
153e12c5d1SDavid du Colombier.lg
163e12c5d1SDavid du Colombier..
173e12c5d1SDavid du Colombier.de WC
183e12c5d1SDavid du Colombier.lg 0
19*6a5dc222SDavid du Colombier\%\&\\$3\f(CI\\$1\fP\&\\$2
203e12c5d1SDavid du Colombier.lg
213e12c5d1SDavid du Colombier..
223e12c5d1SDavid du Colombier.TL
233e12c5d1SDavid du ColombierA tutorial for the
243e12c5d1SDavid du Colombier.CW sam
253e12c5d1SDavid du Colombier.B
263e12c5d1SDavid du Colombiercommand language
273e12c5d1SDavid du Colombier.AU
283e12c5d1SDavid du ColombierRob Pike
293e12c5d1SDavid du Colombier.AI
303e12c5d1SDavid du Colombier.MH
313e12c5d1SDavid du Colombier.AB
323e12c5d1SDavid du Colombier.CW sam
333e12c5d1SDavid du Colombieris an interactive text editor with a command language that makes heavy use
343e12c5d1SDavid du Colombierof regular expressions.
353e12c5d1SDavid du ColombierAlthough the language is syntactically similar to
363e12c5d1SDavid du Colombier.CW ed (1),
373e12c5d1SDavid du Colombierthe details are interestingly different.
383e12c5d1SDavid du ColombierThis tutorial introduces the command language, but does not discuss
393e12c5d1SDavid du Colombierthe screen and mouse interface.
403e12c5d1SDavid du ColombierWith apologies to those unfamiliar with the Ninth Edition Blit software,
413e12c5d1SDavid du Colombierit is assumed that the similarity of
423e12c5d1SDavid du Colombier.CW sam
433e12c5d1SDavid du Colombierto
443e12c5d1SDavid du Colombier.CW mux (9)
453e12c5d1SDavid du Colombierat this level makes
463e12c5d1SDavid du Colombier.CW sam 's
473e12c5d1SDavid du Colombiermouse language easy to learn.
483e12c5d1SDavid du Colombier.PP
493e12c5d1SDavid du ColombierThe
503e12c5d1SDavid du Colombier.CW sam
513e12c5d1SDavid du Colombiercommand language applies identically to two environments:
523e12c5d1SDavid du Colombierwhen running
533e12c5d1SDavid du Colombier.CW sam
543e12c5d1SDavid du Colombieron an ordinary terminal
553e12c5d1SDavid du Colombier(\f2via\f1\f1
563e12c5d1SDavid du Colombier.CW sam\ -d ),
573e12c5d1SDavid du Colombierand in the command window of a
583e12c5d1SDavid du Colombier.I downloaded
593e12c5d1SDavid du Colombier.CW sam ,
603e12c5d1SDavid du Colombierthat is, one using the bitmap display and mouse.
613e12c5d1SDavid du Colombier.AE
623e12c5d1SDavid du Colombier.SH
633e12c5d1SDavid du ColombierIntroduction
643e12c5d1SDavid du Colombier.PP
653e12c5d1SDavid du ColombierThis tutorial describes the command language of
663e12c5d1SDavid du Colombier.CW sam ,
673e12c5d1SDavid du Colombieran interactive text editor that runs on Blits and
683e12c5d1SDavid du Colombiersome computers with bitmap displays.
693e12c5d1SDavid du ColombierFor most editing tasks, the mouse-based editing features
703e12c5d1SDavid du Colombierare sufficient, and they are easy to use and to learn.
713e12c5d1SDavid du Colombier.PP
723e12c5d1SDavid du ColombierThe command language is often useful, however, particularly
733e12c5d1SDavid du Colombierwhen making global changes.
743e12c5d1SDavid du ColombierUnlike the commands in
753e12c5d1SDavid du Colombier.CW ed ,
763e12c5d1SDavid du Colombierwhich are necessary to make changes,
773e12c5d1SDavid du Colombier.CW sam
783e12c5d1SDavid du Colombiercommands tend to be used
793e12c5d1SDavid du Colombieronly for complicated or repetitive editing tasks.
803e12c5d1SDavid du ColombierIt is in these more involved uses that
813e12c5d1SDavid du Colombierthe differences between
823e12c5d1SDavid du Colombier.CW sam
833e12c5d1SDavid du Colombierand other text editors are most evident.
843e12c5d1SDavid du Colombier.PP
853e12c5d1SDavid du Colombier.CW sam 's
863e12c5d1SDavid du Colombierlanguage makes it easy to do some things that other editors,
873e12c5d1SDavid du Colombierincluding programs like
883e12c5d1SDavid du Colombier.CW sed
893e12c5d1SDavid du Colombierand
903e12c5d1SDavid du Colombier.CW awk ,
913e12c5d1SDavid du Colombierdo not handle gracefully, so this tutorial serves partly as a
923e12c5d1SDavid du Colombierlesson in
933e12c5d1SDavid du Colombier.CW sam 's
943e12c5d1SDavid du Colombiermanner of manipulating text.
953e12c5d1SDavid du ColombierThe examples below therefore concentrate entirely on the language,
963e12c5d1SDavid du Colombierassuming that facility with the use of the mouse in
973e12c5d1SDavid du Colombier.CW sam
983e12c5d1SDavid du Colombieris at worst easy to pick up.
993e12c5d1SDavid du ColombierIn fact,
1003e12c5d1SDavid du Colombier.CW sam
1013e12c5d1SDavid du Colombiercan be run without the mouse at all (not
1023e12c5d1SDavid du Colombier.I downloaded ),
1033e12c5d1SDavid du Colombierby specifying the
1043e12c5d1SDavid du Colombier.CW -d
1053e12c5d1SDavid du Colombierflag, and it is this domain that the tutorial
1063e12c5d1SDavid du Colombieroccupies; the command language in these modes
1073e12c5d1SDavid du Colombierare identical.
1083e12c5d1SDavid du Colombier.PP
1093e12c5d1SDavid du ColombierA word to the Unix adept:
1103e12c5d1SDavid du Colombieralthough
1113e12c5d1SDavid du Colombier.CW sam
1123e12c5d1SDavid du Colombieris syntactically very similar to
1133e12c5d1SDavid du Colombier.CW ed ,
1143e12c5d1SDavid du Colombierit is fundamentally and deliberately different in design and detailed semantics.
1153e12c5d1SDavid du ColombierYou might use knowledge of
1163e12c5d1SDavid du Colombier.CW ed
1173e12c5d1SDavid du Colombierto predict how the substitute command works,
1183e12c5d1SDavid du Colombierbut you'd only be right if you had used some understanding of
1193e12c5d1SDavid du Colombier.CW sam 's
1203e12c5d1SDavid du Colombierworkings to influence your prediction.
1213e12c5d1SDavid du ColombierBe particularly careful about idioms.
1223e12c5d1SDavid du ColombierIdioms form in curious nooks of languages and depend on
1233e12c5d1SDavid du Colombierundependable peculiarities.
1243e12c5d1SDavid du Colombier.CW ed
1253e12c5d1SDavid du Colombieridioms simply don't work in
1263e12c5d1SDavid du Colombier.CW sam :
1273e12c5d1SDavid du Colombier.CW 1,$s/a/b/
1283e12c5d1SDavid du Colombiermakes one substitution in the whole file, not one per line.
1293e12c5d1SDavid du Colombier.CW sam
1303e12c5d1SDavid du Colombierhas its own idioms.
1313e12c5d1SDavid du ColombierMuch of the purpose of this tutorial is to publish them
1323e12c5d1SDavid du Colombierand make fluency in
1333e12c5d1SDavid du Colombier.CW sam
1343e12c5d1SDavid du Colombiera matter of learning, not cunning.
1353e12c5d1SDavid du Colombier.PP
1363e12c5d1SDavid du ColombierThe tutorial depends on familiarity with regular expressions, although
1373e12c5d1SDavid du Colombiersome experience with a more traditional Unix editor may be helpful.
1383e12c5d1SDavid du ColombierTo aid readers familiar with
1393e12c5d1SDavid du Colombier.CW ed ,
1403e12c5d1SDavid du ColombierI have pointed out in square brackets [] some of
1413e12c5d1SDavid du Colombierthe relevant differences between
1423e12c5d1SDavid du Colombier.CW ed
1433e12c5d1SDavid du Colombierand
1443e12c5d1SDavid du Colombier.CW sam .
1453e12c5d1SDavid du ColombierRead these comments only if you wish
1463e12c5d1SDavid du Colombierto understand the differences; the lesson is about
1473e12c5d1SDavid du Colombier.CW sam ,
1483e12c5d1SDavid du Colombiernot
1493e12c5d1SDavid du Colombier.CW sam
1503e12c5d1SDavid du Colombier.I vs.
1513e12c5d1SDavid du Colombier.CW ed .
1523e12c5d1SDavid du ColombierAnother typographic convention is that output appears in
1533e12c5d1SDavid du Colombier.CW "this font,
1543e12c5d1SDavid du Colombierwhile typed input appears as
1553e12c5d1SDavid du Colombier.WC "slanty text.
1563e12c5d1SDavid du Colombier.PP
1573e12c5d1SDavid du ColombierNomenclature:
1583e12c5d1SDavid du Colombier.CW sam
1593e12c5d1SDavid du Colombierkeeps a copy of the text it is editing.
1603e12c5d1SDavid du ColombierThis copy is called a
1613e12c5d1SDavid du Colombier.I file .
1623e12c5d1SDavid du ColombierTo avoid confusion, I have called the permanent storage on disc a
1633e12c5d1SDavid du Colombier.I
1643e12c5d1SDavid du ColombierUnix file.
1653e12c5d1SDavid du Colombier.R
1663e12c5d1SDavid du Colombier.SH
1673e12c5d1SDavid du ColombierText
1683e12c5d1SDavid du Colombier.PP
1693e12c5d1SDavid du ColombierTo get started, we need some text to play with.
1703e12c5d1SDavid du ColombierAny text will do; try something from
1713e12c5d1SDavid du ColombierJames Gosling's Emacs manual:
1723e12c5d1SDavid du Colombier.P1
173*6a5dc222SDavid du Colombier$ \f(CIsam -d
1743e12c5d1SDavid du Colombiera
1753e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
1763e12c5d1SDavid du Colombierseveral sections were written hastily in an attempt to provide a
1773e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
1783e12c5d1SDavid du Colombierthe method in the madness that is the Emacs command structure.
1793e12c5d1SDavid du Colombier\&.
1803e12c5d1SDavid du Colombier.ft
1813e12c5d1SDavid du Colombier.P2
1823e12c5d1SDavid du Colombier.WC "sam -d
1833e12c5d1SDavid du Colombierstarts
1843e12c5d1SDavid du Colombier.CW sam
1853e12c5d1SDavid du Colombierrunning.
1863e12c5d1SDavid du ColombierThe
1873e12c5d1SDavid du Colombier.CW a
1883e12c5d1SDavid du Colombiercommand adds text until a line containing just a period, and sets the
1893e12c5d1SDavid du Colombier.I
1903e12c5d1SDavid du Colombiercurrent text
1913e12c5d1SDavid du Colombier.R
1923e12c5d1SDavid du Colombier(also called
1933e12c5d1SDavid du Colombier.I dot )
1943e12c5d1SDavid du Colombierto what was typed \(em everything between the
1953e12c5d1SDavid du Colombier.CW a
1963e12c5d1SDavid du Colombierand the period.
1973e12c5d1SDavid du Colombier.CW ed "" [
1983e12c5d1SDavid du Colombierwould leave dot set to only the last line.]
1993e12c5d1SDavid du ColombierThe
2003e12c5d1SDavid du Colombier.CW p
2013e12c5d1SDavid du Colombiercommand prints the current text:
2023e12c5d1SDavid du Colombier.P1
2033e12c5d1SDavid du Colombier.WC p
2043e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
2053e12c5d1SDavid du Colombierseveral sections were written hastily in an attempt to provide a
2063e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
2073e12c5d1SDavid du Colombierthe method in the madness that is the Emacs command structure.
2083e12c5d1SDavid du Colombier.P2
2093e12c5d1SDavid du Colombier[Again,
2103e12c5d1SDavid du Colombier.CW ed
2113e12c5d1SDavid du Colombierwould print only the last line.]
2123e12c5d1SDavid du ColombierThe
2133e12c5d1SDavid du Colombier.CW a
2143e12c5d1SDavid du Colombiercommand adds its text
2153e12c5d1SDavid du Colombier.I after
2163e12c5d1SDavid du Colombierdot; the
2173e12c5d1SDavid du Colombier.CW i
2183e12c5d1SDavid du Colombiercommand is like
2193e12c5d1SDavid du Colombier.CW a,
2203e12c5d1SDavid du Colombierbut adds the text
2213e12c5d1SDavid du Colombier.I before
2223e12c5d1SDavid du Colombierdot.
2233e12c5d1SDavid du Colombier.P1
224*6a5dc222SDavid du Colombier.ft CI
2253e12c5d1SDavid du Colombieri
2263e12c5d1SDavid du ColombierIntroduction
2273e12c5d1SDavid du Colombier\&.
2283e12c5d1SDavid du Colombierp
2293e12c5d1SDavid du Colombier.ft
2303e12c5d1SDavid du ColombierIntroduction
2313e12c5d1SDavid du Colombier.P2
2323e12c5d1SDavid du ColombierThere is also a
2333e12c5d1SDavid du Colombier.CW c
2343e12c5d1SDavid du Colombiercommand that changes (replaces) the current text,
2353e12c5d1SDavid du Colombierand
2363e12c5d1SDavid du Colombier.CW d
2373e12c5d1SDavid du Colombierthat deletes it; these are illustrated below.
2383e12c5d1SDavid du Colombier.PP
2393e12c5d1SDavid du ColombierTo see all the text, we can specify what text to print;
2403e12c5d1SDavid du Colombierfor the moment, suffice it to say that
2413e12c5d1SDavid du Colombier.WC 0,$
2423e12c5d1SDavid du Colombierspecifies the entire file.
2433e12c5d1SDavid du Colombier.CW ed "" [
2443e12c5d1SDavid du Colombierusers would probably type
2453e12c5d1SDavid du Colombier.WC 1,$ ,
2463e12c5d1SDavid du Colombierwhich in practice is the same thing, but see below.]
2473e12c5d1SDavid du Colombier.P1
2483e12c5d1SDavid du Colombier.WC 0,$p
2493e12c5d1SDavid du ColombierIntroduction
2503e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
2513e12c5d1SDavid du Colombierseveral sections were written hastily in an attempt to provide a
2523e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
2533e12c5d1SDavid du Colombierthe method in the madness that is the Emacs command structure.
2543e12c5d1SDavid du Colombier.P2
2553e12c5d1SDavid du ColombierExcept for the
2563e12c5d1SDavid du Colombier.CW w
2573e12c5d1SDavid du Colombiercommand described below,
2583e12c5d1SDavid du Colombier.I all
2593e12c5d1SDavid du Colombiercommands,
2603e12c5d1SDavid du Colombierincluding
2613e12c5d1SDavid du Colombier.CW p ,
2623e12c5d1SDavid du Colombierset dot to the text they touch.
2633e12c5d1SDavid du ColombierThus,
2643e12c5d1SDavid du Colombier.CW a
2653e12c5d1SDavid du Colombierand
2663e12c5d1SDavid du Colombier.CW i
2673e12c5d1SDavid du Colombierset dot to the new text,
2683e12c5d1SDavid du Colombier.CW p
2693e12c5d1SDavid du Colombierto the text printed, and so on.
2703e12c5d1SDavid du ColombierSimilarly, all commands
2713e12c5d1SDavid du Colombier(except
2723e12c5d1SDavid du Colombier.CW w )
2733e12c5d1SDavid du Colombierby default operate on the current
2743e12c5d1SDavid du Colombiertext [unlike
2753e12c5d1SDavid du Colombier.CW ed ,
2763e12c5d1SDavid du Colombierfor which some commands (such as
2773e12c5d1SDavid du Colombier.CW g )
2783e12c5d1SDavid du Colombierdefault to the entire file].
2793e12c5d1SDavid du Colombier.PP
2803e12c5d1SDavid du ColombierThings are not going to get very interesting until we can
2813e12c5d1SDavid du Colombierset dot arbitrarily.
2823e12c5d1SDavid du ColombierThis is done by
2833e12c5d1SDavid du Colombier.I addresses ,
2843e12c5d1SDavid du Colombierwhich specify a piece of the file.
2853e12c5d1SDavid du ColombierThe address
2863e12c5d1SDavid du Colombier.CW 1 ,
2873e12c5d1SDavid du Colombierfor example, sets dot to the first line of the file.
2883e12c5d1SDavid du Colombier.P1
2893e12c5d1SDavid du Colombier.WC 1p
2903e12c5d1SDavid du ColombierIntroduction
2913e12c5d1SDavid du Colombier.WC c
2923e12c5d1SDavid du Colombier.WC Preamble
2933e12c5d1SDavid du Colombier.WC .
2943e12c5d1SDavid du Colombier.P2
2953e12c5d1SDavid du ColombierThe
2963e12c5d1SDavid du Colombier.CW c
2973e12c5d1SDavid du Colombiercommand didn't need to specify dot; the
2983e12c5d1SDavid du Colombier.CW p
2993e12c5d1SDavid du Colombierleft it on line one.
3003e12c5d1SDavid du ColombierIt's therefore easy to delete the first line utterly;
3013e12c5d1SDavid du Colombierthe last command left dot set to line one:
3023e12c5d1SDavid du Colombier.P1
3033e12c5d1SDavid du Colombier.WC d
3043e12c5d1SDavid du Colombier.WC 1p
3053e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
3063e12c5d1SDavid du Colombier.P2
3073e12c5d1SDavid du Colombier(Line numbers change
3083e12c5d1SDavid du Colombierto reflect changes to the file.)
3093e12c5d1SDavid du Colombier.PP
3103e12c5d1SDavid du ColombierThe address \f(CW/\f2text\f(CW/\f1
3113e12c5d1SDavid du Colombiersets dot to the first appearance of
3123e12c5d1SDavid du Colombier.I text ,
3133e12c5d1SDavid du Colombierafter dot.
3143e12c5d1SDavid du Colombier.CW ed "" [
3153e12c5d1SDavid du Colombiermatches the first line containing
3163e12c5d1SDavid du Colombier.I text .]
3173e12c5d1SDavid du ColombierIf
3183e12c5d1SDavid du Colombier.I text
3193e12c5d1SDavid du Colombieris not found, the search restarts at the beginning of the file
3203e12c5d1SDavid du Colombierand continues until dot.
3213e12c5d1SDavid du Colombier.P1
3223e12c5d1SDavid du Colombier.WC /Emacs/p
3233e12c5d1SDavid du ColombierEmacs
3243e12c5d1SDavid du Colombier.P2
3253e12c5d1SDavid du ColombierIt's difficult to indicate typographically, but in this example no newline appears
3263e12c5d1SDavid du Colombierafter
3273e12c5d1SDavid du Colombier.CW Emacs :
3283e12c5d1SDavid du Colombierthe text to be printed is the string
3293e12c5d1SDavid du Colombier.CW Emacs ', `
3303e12c5d1SDavid du Colombierexactly.
3313e12c5d1SDavid du Colombier(The final
3323e12c5d1SDavid du Colombier.CW p
3333e12c5d1SDavid du Colombiermay be left off \(em it is the default command.
3343e12c5d1SDavid du ColombierWhen downloaded, however, the default is instead to select the text,
3353e12c5d1SDavid du Colombierto highlight it,
3363e12c5d1SDavid du Colombierand to make it visible by moving the window on the file if necessary.
3373e12c5d1SDavid du ColombierThus,
3383e12c5d1SDavid du Colombier.CW /Emacs/
3393e12c5d1SDavid du Colombierindicates on the display the next occurrence of the text.)
3403e12c5d1SDavid du Colombier.PP
3413e12c5d1SDavid du ColombierImagine we wanted to change the word
3423e12c5d1SDavid du Colombier.CW haphazard
3433e12c5d1SDavid du Colombierto
3443e12c5d1SDavid du Colombier.CW thoughtless .
3453e12c5d1SDavid du ColombierObviously, what's needed is another
3463e12c5d1SDavid du Colombier.CW c
3473e12c5d1SDavid du Colombiercommand, but the method used so far to insert text includes a newline.
3483e12c5d1SDavid du ColombierThe syntax for including text without newlines is to surround the
3493e12c5d1SDavid du Colombiertext with slashes (which is the same as the syntax for
3503e12c5d1SDavid du Colombiertext searches, but what is going on should be clear from context).
3513e12c5d1SDavid du ColombierThe text must appear immediately after the
3523e12c5d1SDavid du Colombier.CW c
3533e12c5d1SDavid du Colombier(or
3543e12c5d1SDavid du Colombier.CW a
3553e12c5d1SDavid du Colombieror
3563e12c5d1SDavid du Colombier.CW i ).
3573e12c5d1SDavid du ColombierGiven this, it is easy to make the required change:
3583e12c5d1SDavid du Colombier.P1
3593e12c5d1SDavid du Colombier.WC /haphazard/c/thoughtless/
3603e12c5d1SDavid du Colombier.WC 1p
3613e12c5d1SDavid du ColombierThis manual is organized in a rather thoughtless manner.  The first
3623e12c5d1SDavid du Colombier.P2
3633e12c5d1SDavid du Colombier[Changes can always be done with a
3643e12c5d1SDavid du Colombier.CW c
3653e12c5d1SDavid du Colombiercommand, even if the text is smaller than a line].
3663e12c5d1SDavid du ColombierYou'll find that this way of providing text to commands is much
3673e12c5d1SDavid du Colombiermore common than is the multiple-lines syntax.
3683e12c5d1SDavid du ColombierIf you want to include a slash
3693e12c5d1SDavid du Colombier.CW /
3703e12c5d1SDavid du Colombierin the text, just precede it with a backslash
3713e12c5d1SDavid du Colombier.CW \e ,
3723e12c5d1SDavid du Colombierand use a backslash to protect a backslash itself.
3733e12c5d1SDavid du Colombier.P1
3743e12c5d1SDavid du Colombier.WC /Emacs/c/Emacs\e\e360/
3753e12c5d1SDavid du Colombier.WC 4p
3763e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs\e360 and to try to show
3773e12c5d1SDavid du Colombier.P2
3783e12c5d1SDavid du ColombierWe could also make this particular change by
3793e12c5d1SDavid du Colombier.P1
3803e12c5d1SDavid du Colombier.WC /Emacs/a/\e\e360/
3813e12c5d1SDavid du Colombier.P2
3823e12c5d1SDavid du Colombier.PP
3833e12c5d1SDavid du ColombierThis is as good a place as any to introduce the
3843e12c5d1SDavid du Colombier.CW u
3853e12c5d1SDavid du Colombiercommand, which undoes the last command.
3863e12c5d1SDavid du ColombierA second
3873e12c5d1SDavid du Colombier.CW u
3883e12c5d1SDavid du Colombierwill undo the penultimate command, and so on.
3893e12c5d1SDavid du Colombier.P1
3903e12c5d1SDavid du Colombier.WC u
3913e12c5d1SDavid du Colombier.WC 4p
3923e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
3933e12c5d1SDavid du Colombier.WC u
3943e12c5d1SDavid du Colombier.WC 3p
3953e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
3963e12c5d1SDavid du Colombier.P2
3973e12c5d1SDavid du ColombierUndoing can only back up; there is no way to undo a previous
3983e12c5d1SDavid du Colombier.CW u .
3993e12c5d1SDavid du Colombier.SH
4003e12c5d1SDavid du ColombierAddresses
4013e12c5d1SDavid du Colombier.PP
4023e12c5d1SDavid du ColombierWe've seen the simplest forms of addresses, but there is more
4033e12c5d1SDavid du Colombierto learn before we can get too much further.
4043e12c5d1SDavid du ColombierAn address selects a region in the file \(em a substring \(em
4053e12c5d1SDavid du Colombierand therefore must define the beginning and the end of a region.
4063e12c5d1SDavid du ColombierThus, the address
4073e12c5d1SDavid du Colombier.CW 13
4083e12c5d1SDavid du Colombierselects from the beginning of line thirteen to the end of line thirteen, and
4093e12c5d1SDavid du Colombier.CW /Emacs/
4103e12c5d1SDavid du Colombierselects from the beginning of the word
4113e12c5d1SDavid du Colombier.CW Emacs ' `
4123e12c5d1SDavid du Colombierto the end.
4133e12c5d1SDavid du Colombier.PP
4143e12c5d1SDavid du ColombierAddresses may be combined with a comma:
4153e12c5d1SDavid du Colombier.P1
4163e12c5d1SDavid du Colombier13,15
4173e12c5d1SDavid du Colombier.P2
4183e12c5d1SDavid du Colombierselects lines thirteen through fifteen.  The definition of the comma
4193e12c5d1SDavid du Colombieroperator is to select from the beginning of the left hand address (the
4203e12c5d1SDavid du Colombierbeginning of line 13) to the end of the right hand address (the
4213e12c5d1SDavid du Colombierend of line 15).
4223e12c5d1SDavid du Colombier.PP
4233e12c5d1SDavid du ColombierA few special simple addresses come in handy:
4243e12c5d1SDavid du Colombier.CW .
4253e12c5d1SDavid du Colombier(a period) represents dot, the current text,
4263e12c5d1SDavid du Colombier.CW 0
4273e12c5d1SDavid du Colombier(line zero) selects the null string at the beginning of the file, and
4283e12c5d1SDavid du Colombier.CW $
4293e12c5d1SDavid du Colombierselects the null string at the end of the file
4303e12c5d1SDavid du Colombier[not the last line of the file].
4313e12c5d1SDavid du ColombierTherefore,
4323e12c5d1SDavid du Colombier.P1
4333e12c5d1SDavid du Colombier0,13
4343e12c5d1SDavid du Colombier.P2
4353e12c5d1SDavid du Colombierselects from the beginning of the file to the end of line thirteen,
4363e12c5d1SDavid du Colombier.P1
4373e12c5d1SDavid du Colombier\&.,$
4383e12c5d1SDavid du Colombier.P2
4393e12c5d1SDavid du Colombierselects from the beginning of the current text to the end of the file, and
4403e12c5d1SDavid du Colombier.P1
4413e12c5d1SDavid du Colombier0,$
4423e12c5d1SDavid du Colombier.P2
4433e12c5d1SDavid du Colombierselects the whole file [that is, a single string containing the whole file,
4443e12c5d1SDavid du Colombiernot a list of all the lines in the file].
4453e12c5d1SDavid du Colombier.PP
4463e12c5d1SDavid du ColombierThese are all
4473e12c5d1SDavid du Colombier.I absolute
4483e12c5d1SDavid du Colombieraddresses: they refer to specific places in the file.
4493e12c5d1SDavid du Colombier.CW sam
4503e12c5d1SDavid du Colombieralso has relative addresses, which depend
4513e12c5d1SDavid du Colombieron the value of dot,
4523e12c5d1SDavid du Colombierand in fact we have already seen one form:
4533e12c5d1SDavid du Colombier.CW /Emacs/
4543e12c5d1SDavid du Colombierfinds the first occurrence of
4553e12c5d1SDavid du Colombier.CW Emacs
4563e12c5d1SDavid du Colombiersearching forwards from dot.
4573e12c5d1SDavid du ColombierWhich occurrence of
4583e12c5d1SDavid du Colombier.CW Emacs
4593e12c5d1SDavid du Colombierit finds depends on the value of dot.
4603e12c5d1SDavid du ColombierWhat if you wanted the first occurrence
4613e12c5d1SDavid du Colombier.CW before
4623e12c5d1SDavid du Colombierdot?  Just precede the pattern with a minus sign, which reverses the direction
4633e12c5d1SDavid du Colombierof the search:
4643e12c5d1SDavid du Colombier.P1
4653e12c5d1SDavid du Colombier-/Emacs/
4663e12c5d1SDavid du Colombier.P2
4673e12c5d1SDavid du ColombierIn fact, the complete syntax for forward searching is
4683e12c5d1SDavid du Colombier.P1
4693e12c5d1SDavid du Colombier+/Emacs/
4703e12c5d1SDavid du Colombier.P2
4713e12c5d1SDavid du Colombierbut the plus sign is the default, and in practice is rarely used.
4723e12c5d1SDavid du ColombierHere is an example that includes it for clarity:
4733e12c5d1SDavid du Colombier.P1
4743e12c5d1SDavid du Colombier0+/Emacs/
4753e12c5d1SDavid du Colombier.P2
4763e12c5d1SDavid du Colombierselects the first occurrence of
4773e12c5d1SDavid du Colombier.CW Emacs
4783e12c5d1SDavid du Colombierin the file; read it as ``go to line 0, then search forwards for
4793e12c5d1SDavid du Colombier.CW Emacs .''
4803e12c5d1SDavid du ColombierSince the
4813e12c5d1SDavid du Colombier.CW +
4823e12c5d1SDavid du Colombieris optional, this can be written
4833e12c5d1SDavid du Colombier.CW 0/Emacs/ .
4843e12c5d1SDavid du ColombierSimilarly,
4853e12c5d1SDavid du Colombier.P1
4863e12c5d1SDavid du Colombier$-/Emacs/
4873e12c5d1SDavid du Colombier.P2
4883e12c5d1SDavid du Colombierfinds the last occurrence in the file, so
4893e12c5d1SDavid du Colombier.P1
4903e12c5d1SDavid du Colombier0/Emacs/,$-/Emacs/
4913e12c5d1SDavid du Colombier.P2
4923e12c5d1SDavid du Colombierselects the text from the first to last
4933e12c5d1SDavid du Colombier.CW Emacs ,
4943e12c5d1SDavid du Colombierinclusive.
4953e12c5d1SDavid du ColombierSlightly more interesting:
4963e12c5d1SDavid du Colombier.P1
4973e12c5d1SDavid du Colombier/Emacs/+/Emacs/
4983e12c5d1SDavid du Colombier.P2
4993e12c5d1SDavid du Colombier(there is an implicit
5003e12c5d1SDavid du Colombier.CW .+
5013e12c5d1SDavid du Colombierat the beginning) selects the second
5023e12c5d1SDavid du Colombier.CW Emacs
5033e12c5d1SDavid du Colombierfollowing dot.
5043e12c5d1SDavid du Colombier.PP
5053e12c5d1SDavid du ColombierLine numbers may also be relative.
5063e12c5d1SDavid du Colombier.P1
5073e12c5d1SDavid du Colombier-2
5083e12c5d1SDavid du Colombier.P2
5093e12c5d1SDavid du Colombierselects the second previous line, and
5103e12c5d1SDavid du Colombier.P1
5113e12c5d1SDavid du Colombier+5
5123e12c5d1SDavid du Colombier.P2
5133e12c5d1SDavid du Colombierselects the fifth following line (here the plus sign is obligatory).
5143e12c5d1SDavid du Colombier.PP
5153e12c5d1SDavid du ColombierSince addresses may select (and dot may be) more than one line,
5163e12c5d1SDavid du Colombierwe need a definition of `previous' and `following:'
5173e12c5d1SDavid du Colombier`previous' means
5183e12c5d1SDavid du Colombier.I
5193e12c5d1SDavid du Colombierbefore the beginning
5203e12c5d1SDavid du Colombier.R
5213e12c5d1SDavid du Colombierof dot, and `following'
5223e12c5d1SDavid du Colombiermeans
5233e12c5d1SDavid du Colombier.I
5243e12c5d1SDavid du Colombierafter the end
5253e12c5d1SDavid du Colombier.R
5263e12c5d1SDavid du Colombierof dot.
527*6a5dc222SDavid du ColombierFor example, if the file contains \f(CWA\f(CIAA\f(CWA\f1,
5283e12c5d1SDavid du Colombierwith dot set to the middle two
5293e12c5d1SDavid du Colombier.CW A 's
5303e12c5d1SDavid du Colombier(the slanting characters),
5313e12c5d1SDavid du Colombier.CW -/A/
5323e12c5d1SDavid du Colombiersets dot to the first
5333e12c5d1SDavid du Colombier.CW A ,
5343e12c5d1SDavid du Colombierand
5353e12c5d1SDavid du Colombier.CW +/A/
5363e12c5d1SDavid du Colombiersets dot to the last
5373e12c5d1SDavid du Colombier.CW A .
5383e12c5d1SDavid du ColombierExcept under odd circumstances (such as when the only occurrence of the
5393e12c5d1SDavid du Colombiertext in the file is already the current text), the text selected by a
5403e12c5d1SDavid du Colombiersearch will be disjoint from dot.
5413e12c5d1SDavid du Colombier.PP
5423e12c5d1SDavid du ColombierTo select the
5433e12c5d1SDavid du Colombier.CW "troff -ms
5443e12c5d1SDavid du Colombierparagraph containing dot, however long it is, use
5453e12c5d1SDavid du Colombier.P1
5463e12c5d1SDavid du Colombier-/.PP/,/.PP/-1
5473e12c5d1SDavid du Colombier.P2
5483e12c5d1SDavid du Colombierwhich will include the
5493e12c5d1SDavid du Colombier.CW .PP
5503e12c5d1SDavid du Colombierthat begins the paragraph, and exclude the one that ends it.
5513e12c5d1SDavid du Colombier.PP
5523e12c5d1SDavid du ColombierWhen typing relative line number addresses, the default number is
5533e12c5d1SDavid du Colombier.CW 1 ,
5543e12c5d1SDavid du Colombierso the above could be written slightly more simply:
5553e12c5d1SDavid du Colombier.P1
5563e12c5d1SDavid du Colombier-/.PP/,/.PP/-
5573e12c5d1SDavid du Colombier.P2
5583e12c5d1SDavid du Colombier.PP
5593e12c5d1SDavid du ColombierWhat does the address
5603e12c5d1SDavid du Colombier.CW +1-1
5613e12c5d1SDavid du Colombieror the equivalent
5623e12c5d1SDavid du Colombier.CW +-
5633e12c5d1SDavid du Colombiermean?  It looks like it does nothing, but recall that dot need not be a
5643e12c5d1SDavid du Colombiercomplete line of text.
5653e12c5d1SDavid du Colombier.CW +1
5663e12c5d1SDavid du Colombierselects the line after the end of the current text, and
5673e12c5d1SDavid du Colombier.CW -1
5683e12c5d1SDavid du Colombierselects the line before the beginning.  Therefore
5693e12c5d1SDavid du Colombier.CW +1-1
5703e12c5d1SDavid du Colombierselects the line before the line after the end of dot, that is,
5713e12c5d1SDavid du Colombierthe complete line containing the end of dot.
5723e12c5d1SDavid du ColombierWe can use this construction to expand a selection to include a complete line,
5733e12c5d1SDavid du Colombiersay the first line in the file containing
5743e12c5d1SDavid du Colombier.CW Emacs :
5753e12c5d1SDavid du Colombier.P1
5763e12c5d1SDavid du Colombier.WC 0/Emacs/+-p
5773e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
5783e12c5d1SDavid du Colombier.P2
5793e12c5d1SDavid du ColombierThe address
5803e12c5d1SDavid du Colombier.CW +-
5813e12c5d1SDavid du Colombieris an idiom.
5823e12c5d1SDavid du Colombier.SH
5833e12c5d1SDavid du ColombierLoops
5843e12c5d1SDavid du Colombier.PP
5853e12c5d1SDavid du ColombierAbove, we changed one occurrence of
5863e12c5d1SDavid du Colombier.CW Emacs
5873e12c5d1SDavid du Colombierto
5883e12c5d1SDavid du Colombier.CW Emacs\e360 ,
5893e12c5d1SDavid du Colombierbut if the name of the editor is really changing, it would be useful
5903e12c5d1SDavid du Colombierto change
5913e12c5d1SDavid du Colombier.I all
5923e12c5d1SDavid du Colombierinstances of the name in a single command.
5933e12c5d1SDavid du Colombier.CW sam
5943e12c5d1SDavid du Colombierprovides a command,
5953e12c5d1SDavid du Colombier.CW x
5963e12c5d1SDavid du Colombier(extract), for just that job.
5973e12c5d1SDavid du ColombierThe syntax is
5983e12c5d1SDavid du Colombier\f(CWx/\f2pattern\f(CW/\f2command\f1.
5993e12c5d1SDavid du ColombierFor each occurrence of the pattern in the selected text,
6003e12c5d1SDavid du Colombier.CW x
6013e12c5d1SDavid du Colombiersets dot to the occurrence and runs command.
6023e12c5d1SDavid du ColombierFor example, to change
6033e12c5d1SDavid du Colombier.CW Emacs
6043e12c5d1SDavid du Colombierto
6053e12c5d1SDavid du Colombier.CW vi,
6063e12c5d1SDavid du Colombier.P1
6073e12c5d1SDavid du Colombier.WC 0,$x/Emacs/c/vi/
6083e12c5d1SDavid du Colombier.WC 0,$p
6093e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
6103e12c5d1SDavid du Colombierseveral sections were written hastily in an attempt to provide a
6113e12c5d1SDavid du Colombiergeneral introduction to the commands in vi and to try to show
6123e12c5d1SDavid du Colombierthe method in the madness that is the vi command structure.
6133e12c5d1SDavid du Colombier.P2
6143e12c5d1SDavid du ColombierThis
6153e12c5d1SDavid du Colombierworks by subdividing the current text
6163e12c5d1SDavid du Colombier.CW 0,$ "" (
6173e12c5d1SDavid du Colombier\(em the whole file) into appearances of its textual argument
6183e12c5d1SDavid du Colombier.CW Emacs ), (
6193e12c5d1SDavid du Colombierand then running the command that follows
6203e12c5d1SDavid du Colombier.CW c/vi/ ) (
6213e12c5d1SDavid du Colombierwith dot set to the text.
6223e12c5d1SDavid du ColombierWe can read this example as, ``find all occurrences of
6233e12c5d1SDavid du Colombier.CW Emacs
6243e12c5d1SDavid du Colombierin the file, and for each one,
6253e12c5d1SDavid du Colombierset the current text to the occurrence and run the command
6263e12c5d1SDavid du Colombier.CW c/vi/ ,
6273e12c5d1SDavid du Colombierwhich will replace the current text by
6283e12c5d1SDavid du Colombier.CW vi. ''
6293e12c5d1SDavid du Colombier[This command is somewhat similar to
6303e12c5d1SDavid du Colombier.CW ed 's
6313e12c5d1SDavid du Colombier.CW g
6323e12c5d1SDavid du Colombiercommand.  The differences will develop below, but note that the
6333e12c5d1SDavid du Colombierdefault address, as always, is dot rather than the whole file.]
6343e12c5d1SDavid du Colombier.PP
6353e12c5d1SDavid du ColombierA single
6363e12c5d1SDavid du Colombier.CW u
6373e12c5d1SDavid du Colombiercommand is sufficient to undo an
6383e12c5d1SDavid du Colombier.CW x
6393e12c5d1SDavid du Colombiercommand, regardless of how many individual changes the
6403e12c5d1SDavid du Colombier.CW x
6413e12c5d1SDavid du Colombiermakes.
6423e12c5d1SDavid du Colombier.P1
6433e12c5d1SDavid du Colombier.WC u
6443e12c5d1SDavid du Colombier.WC 0,$p
6453e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
6463e12c5d1SDavid du Colombierseveral sections were written hastily in an attempt to provide a
6473e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
6483e12c5d1SDavid du Colombierthe method in the madness that is the Emacs command structure.
6493e12c5d1SDavid du Colombier.P2
6503e12c5d1SDavid du Colombier.PP
6513e12c5d1SDavid du ColombierOf course,
6523e12c5d1SDavid du Colombier.CW c
6533e12c5d1SDavid du Colombieris not the only command
6543e12c5d1SDavid du Colombier.CW x
6553e12c5d1SDavid du Colombiercan run.  An
6563e12c5d1SDavid du Colombier.CW a
6573e12c5d1SDavid du Colombiercommand can be used to put proprietary markings on
6583e12c5d1SDavid du Colombier.CW Emacs :
6593e12c5d1SDavid du Colombier.P1
6603e12c5d1SDavid du Colombier.WC 0,$x/Emacs/a/{TM}/
6613e12c5d1SDavid du Colombier.WC /Emacs/+-p
6623e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs{TM} and to try to show
6633e12c5d1SDavid du Colombier.P2
6643e12c5d1SDavid du Colombier[There is no way to see the changes as they happen, as in
6653e12c5d1SDavid du Colombier.CW ed 's
6663e12c5d1SDavid du Colombier.CW g/Emacs/s//&{TM}/p ;
6673e12c5d1SDavid du Colombiersee the section on Multiple Changes, below.]
6683e12c5d1SDavid du Colombier.PP
6693e12c5d1SDavid du ColombierThe
6703e12c5d1SDavid du Colombier.CW p
6713e12c5d1SDavid du Colombiercommand is also useful when driven by an
6723e12c5d1SDavid du Colombier.CW x ,
6733e12c5d1SDavid du Colombierbut be careful that you say what you mean;
6743e12c5d1SDavid du Colombier.P1
6753e12c5d1SDavid du Colombier.WC 0,$x/Emacs/p
6763e12c5d1SDavid du ColombierEmacsEmacs
6773e12c5d1SDavid du Colombier.P2
6783e12c5d1SDavid du Colombiersince
6793e12c5d1SDavid du Colombier.CW x
6803e12c5d1SDavid du Colombiersets dot to the text in the slashes, printing only that text
6813e12c5d1SDavid du Colombieris not going to be very
6823e12c5d1SDavid du Colombierinformative.  But the command that
6833e12c5d1SDavid du Colombier.CW x
6843e12c5d1SDavid du Colombierruns can contain addresses.  For example, if we want to print all
6853e12c5d1SDavid du Colombierlines containing
6863e12c5d1SDavid du Colombier.CW Emacs ,
6873e12c5d1SDavid du Colombierjust use
6883e12c5d1SDavid du Colombier.CW +- :
6893e12c5d1SDavid du Colombier.P1
6903e12c5d1SDavid du Colombier.WC 0,$x/Emacs/+-p
6913e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs{TM} and to try to show
6923e12c5d1SDavid du Colombierthe method in the madness that is the Emacs{TM} command structure.
6933e12c5d1SDavid du Colombier.P2
6943e12c5d1SDavid du ColombierFinally, let's restore the state of the file with another
6953e12c5d1SDavid du Colombier.CW x
6963e12c5d1SDavid du Colombiercommand, and make use of a handy shorthand:
6973e12c5d1SDavid du Colombiera comma in an address has its left side default to
6983e12c5d1SDavid du Colombier.CW 0 ,
6993e12c5d1SDavid du Colombierand its right side default to
7003e12c5d1SDavid du Colombier.CW $ ,
7013e12c5d1SDavid du Colombierso the easy-to-type address
7023e12c5d1SDavid du Colombier.CW ,
7033e12c5d1SDavid du Colombierrefers to the whole file:
7043e12c5d1SDavid du Colombier.P1
7053e12c5d1SDavid du Colombier.WC ",x/Emacs/ /{TM}/d
7063e12c5d1SDavid du Colombier.WC ,p
7073e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
7083e12c5d1SDavid du Colombierseveral sections were written hastily in an attempt to provide a
7093e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
7103e12c5d1SDavid du Colombierthe method in the madness that is the Emacs command structure.
7113e12c5d1SDavid du Colombier.P2
7123e12c5d1SDavid du ColombierNotice what this
7133e12c5d1SDavid du Colombier.CW x
7143e12c5d1SDavid du Colombierdoes: for each occurrence of Emacs,
7153e12c5d1SDavid du Colombierfind the
7163e12c5d1SDavid du Colombier.CW {TM}
7173e12c5d1SDavid du Colombierthat follows, and delete it.
7183e12c5d1SDavid du Colombier.PP
7193e12c5d1SDavid du ColombierThe `text'
7203e12c5d1SDavid du Colombier.CW sam
7213e12c5d1SDavid du Colombieraccepts
7223e12c5d1SDavid du Colombierfor searches in addresses and in
7233e12c5d1SDavid du Colombier.CW x
7243e12c5d1SDavid du Colombiercommands is not simple text, but rather
7253e12c5d1SDavid du Colombier.I regular\ expressions.
7263e12c5d1SDavid du ColombierUnix has several distinct interpretations of regular expressions.
7273e12c5d1SDavid du ColombierThe form used by
7283e12c5d1SDavid du Colombier.CW sam
7293e12c5d1SDavid du Colombieris that of
7303e12c5d1SDavid du Colombier.CW egrep (1),
7313e12c5d1SDavid du Colombierincluding parentheses
7323e12c5d1SDavid du Colombier.CW ()
7333e12c5d1SDavid du Colombierfor grouping and an `or' operator
7343e12c5d1SDavid du Colombier.CW |
7353e12c5d1SDavid du Colombierfor matching strings in parallel.
7363e12c5d1SDavid du Colombier.CW sam
7373e12c5d1SDavid du Colombiermakes two extensions:
7383e12c5d1SDavid du Colombieralthough
7393e12c5d1SDavid du Colombier.CW .
7403e12c5d1SDavid du Colombier(the most overloaded character in Unix) matches any character
7413e12c5d1SDavid du Colombier.I except
7423e12c5d1SDavid du Colombiernewline, the regular expression
7433e12c5d1SDavid du Colombier.CW @
7443e12c5d1SDavid du Colombier(think of it as a big dot) matches any character, even newlines;
7453e12c5d1SDavid du Colombierand the character sequence
7463e12c5d1SDavid du Colombier.CW \en
7473e12c5d1SDavid du Colombiermatches a newline character.
7483e12c5d1SDavid du ColombierReplacement text, such as used in the
7493e12c5d1SDavid du Colombier.CW a
7503e12c5d1SDavid du Colombierand
7513e12c5d1SDavid du Colombier.CW c
7523e12c5d1SDavid du Colombiercommands, is still plain text, but the sequence
7533e12c5d1SDavid du Colombier.CW \en
7543e12c5d1SDavid du Colombierrepresents newline in that context, too.
7553e12c5d1SDavid du Colombier.PP
7563e12c5d1SDavid du ColombierHere is an example.  Say we wanted to double space the document, that is,
7573e12c5d1SDavid du Colombierturn every newline into two newlines.
7583e12c5d1SDavid du ColombierThe following all do the job:
7593e12c5d1SDavid du Colombier.P1
7603e12c5d1SDavid du Colombier.WC ",x/\en/ a/\en/
7613e12c5d1SDavid du Colombier.WC ",x/\en/ c/\en\en/
7623e12c5d1SDavid du Colombier.WC ",x/$/ a/\en/
7633e12c5d1SDavid du Colombier.WC ",x/^/ i/\en/
7643e12c5d1SDavid du Colombier.P2
7653e12c5d1SDavid du ColombierThe last example is slightly different, because it puts a newline
7663e12c5d1SDavid du Colombier.I before
7673e12c5d1SDavid du Colombiereach line; the other examples place it after.
7683e12c5d1SDavid du ColombierThe first two examples manipulate newlines directly
7693e12c5d1SDavid du Colombier[something outside
7703e12c5d1SDavid du Colombier.CW ed 's
7713e12c5d1SDavid du Colombierken]; the last two
7723e12c5d1SDavid du Colombieruse regular expressions:
7733e12c5d1SDavid du Colombier.CW $
7743e12c5d1SDavid du Colombieris the empty string at the end of a line, while
7753e12c5d1SDavid du Colombier.CW ^
7763e12c5d1SDavid du Colombieris the empty string at the beginning.
7773e12c5d1SDavid du Colombier.PP
7783e12c5d1SDavid du ColombierThese solutions all have a possible drawback: if there is already a blank line
7793e12c5d1SDavid du Colombier(that is, two consecutive newlines), they make it much larger (four
7803e12c5d1SDavid du Colombierconsecutive newlines).
7813e12c5d1SDavid du ColombierA better method is to extend every group of newlines by one:
7823e12c5d1SDavid du Colombier.P1
7833e12c5d1SDavid du Colombier.WC ",x/\en+/ a/\en/
7843e12c5d1SDavid du Colombier.P2
7853e12c5d1SDavid du ColombierThe regular expression operator
7863e12c5d1SDavid du Colombier.CW +
7873e12c5d1SDavid du Colombiermeans `one or more;'
7883e12c5d1SDavid du Colombier.CW \en+
7893e12c5d1SDavid du Colombieris identical to
7903e12c5d1SDavid du Colombier.CW \en\en* .
7913e12c5d1SDavid du ColombierThus, this example
7923e12c5d1SDavid du Colombiertakes every sequence of newlines and adds another
7933e12c5d1SDavid du Colombierto the end.
7943e12c5d1SDavid du Colombier.PP
7953e12c5d1SDavid du ColombierA more common example is indenting a block of text by a tab stop.
7963e12c5d1SDavid du ColombierThe following all work,
7973e12c5d1SDavid du Colombieralthough the first is arguably the cleanest (the blank text in slashes is a tab):
7983e12c5d1SDavid du Colombier.P1
7993e12c5d1SDavid du Colombier.WC ",x/^/a/	 /
8003e12c5d1SDavid du Colombier.WC ",x/^/c/	 /
8013e12c5d1SDavid du Colombier.WC ",x/.*\en/i/	 /
8023e12c5d1SDavid du Colombier.P2
8033e12c5d1SDavid du ColombierThe last example uses the pattern (idiom, really)
8043e12c5d1SDavid du Colombier.CW .*\en
8053e12c5d1SDavid du Colombierto match lines:
8063e12c5d1SDavid du Colombier.CW .*
8073e12c5d1SDavid du Colombiermatches the longest possible string of non-newline characters.
8083e12c5d1SDavid du ColombierTaking initial tabs away is just as easy:
8093e12c5d1SDavid du Colombier.P1
8103e12c5d1SDavid du Colombier.WC ",x/^    /d
8113e12c5d1SDavid du Colombier.P2
8123e12c5d1SDavid du ColombierIn these examples I have specified an address (the whole file), but
8133e12c5d1SDavid du Colombierin practice commands like these are more likely to be run without
8143e12c5d1SDavid du Colombieran address, using the value of dot set by selecting text with the mouse.
8153e12c5d1SDavid du Colombier.SH
8163e12c5d1SDavid du ColombierConditionals
8173e12c5d1SDavid du Colombier.PP
8183e12c5d1SDavid du ColombierThe
8193e12c5d1SDavid du Colombier.CW x
8203e12c5d1SDavid du Colombiercommand is a looping construct:
8213e12c5d1SDavid du Colombierfor each match of a regular expression,
8223e12c5d1SDavid du Colombierit extracts (sets dot to) the match and runs a command.
8233e12c5d1SDavid du Colombier.CW sam
8243e12c5d1SDavid du Colombieralso has a conditional,
8253e12c5d1SDavid du Colombier.CW g :
8263e12c5d1SDavid du Colombier\f(CWg/\f2pattern\f(CW/\f2command\f1
8273e12c5d1SDavid du Colombierruns the command if dot contains a match of the pattern
8283e12c5d1SDavid du Colombier.I
8293e12c5d1SDavid du Colombierwithout changing the value of dot.
8303e12c5d1SDavid du Colombier.R
8313e12c5d1SDavid du ColombierThe inverse,
8323e12c5d1SDavid du Colombier.CW v ,
8333e12c5d1SDavid du Colombierruns the command if dot does
8343e12c5d1SDavid du Colombier.I not
8353e12c5d1SDavid du Colombiercontain a match of the pattern.
8363e12c5d1SDavid du Colombier(The letters
8373e12c5d1SDavid du Colombier.CW g
8383e12c5d1SDavid du Colombierand
8393e12c5d1SDavid du Colombier.CW v
8403e12c5d1SDavid du Colombierare historical and have no mnemonic significance.  You might
8413e12c5d1SDavid du Colombierthink of
8423e12c5d1SDavid du Colombier.CW g
8433e12c5d1SDavid du Colombieras `guard.')
8443e12c5d1SDavid du Colombier.CW ed "" [
8453e12c5d1SDavid du Colombierusers should read the above definitions very carefully; the
8463e12c5d1SDavid du Colombier.CW g
8473e12c5d1SDavid du Colombiercommand in
8483e12c5d1SDavid du Colombier.CW sam
8493e12c5d1SDavid du Colombieris fundamentally different from that in
8503e12c5d1SDavid du Colombier.CW ed .]
8513e12c5d1SDavid du ColombierHere is an example of the difference between
8523e12c5d1SDavid du Colombier.CW x
8533e12c5d1SDavid du Colombierand
8543e12c5d1SDavid du Colombier.CW g:
8553e12c5d1SDavid du Colombier.P1
8563e12c5d1SDavid du Colombier,x/Emacs/c/vi/
8573e12c5d1SDavid du Colombier.P2
8583e12c5d1SDavid du Colombierchanges each occurrence of the word
8593e12c5d1SDavid du Colombier.CW Emacs
8603e12c5d1SDavid du Colombierin the file to the word
8613e12c5d1SDavid du Colombier.CW vi ,
8623e12c5d1SDavid du Colombierbut
8633e12c5d1SDavid du Colombier.P1
8643e12c5d1SDavid du Colombier,g/Emacs/c/vi/
8653e12c5d1SDavid du Colombier.P2
8663e12c5d1SDavid du Colombierchanges the
8673e12c5d1SDavid du Colombier.I "whole file
8683e12c5d1SDavid du Colombierto
8693e12c5d1SDavid du Colombier.CW vi
8703e12c5d1SDavid du Colombierif there is the word
8713e12c5d1SDavid du Colombier.CW Emacs
8723e12c5d1SDavid du Colombieranywhere in the file.
8733e12c5d1SDavid du Colombier.PP
8743e12c5d1SDavid du ColombierNeither of these commands is particularly interesting in isolation,
8753e12c5d1SDavid du Colombierbut they are valuable when combined with
8763e12c5d1SDavid du Colombier.CW x
8773e12c5d1SDavid du Colombierand with themselves.
8783e12c5d1SDavid du Colombier.SH
8793e12c5d1SDavid du ColombierComposition
8803e12c5d1SDavid du Colombier.PP
8813e12c5d1SDavid du ColombierOne way to think about the
8823e12c5d1SDavid du Colombier.CW x
8833e12c5d1SDavid du Colombiercommand is that, given a selection (a value of dot)
8843e12c5d1SDavid du Colombierit iterates through interesting subselections (values of dot within).
8853e12c5d1SDavid du ColombierIn other words, it takes a piece of text and cuts it into smaller pieces.
8863e12c5d1SDavid du ColombierBut the text that it cuts up may already be a piece cut by a previous
8873e12c5d1SDavid du Colombier.CW x
8883e12c5d1SDavid du Colombiercommand or selected by a
8893e12c5d1SDavid du Colombier.CW g .
8903e12c5d1SDavid du Colombier.CW sam 's
8913e12c5d1SDavid du Colombiermost interesting property is the ability to define a sequence of commands
8923e12c5d1SDavid du Colombierto perform a particular task.\(dg
8933e12c5d1SDavid du Colombier.FS
8943e12c5d1SDavid du Colombier\(dg
8953e12c5d1SDavid du ColombierThe obvious analogy with shell pipelines is only partially valid,
8963e12c5d1SDavid du Colombierbecause the individual
8973e12c5d1SDavid du Colombier.CW sam
8983e12c5d1SDavid du Colombiercommands are all working on the same text; it is only how the text is
8993e12c5d1SDavid du Colombiersliced up that is changing.
9003e12c5d1SDavid du Colombier.FE
9013e12c5d1SDavid du ColombierA simple example is to change all occurrences of
9023e12c5d1SDavid du Colombier.CW Emacs
9033e12c5d1SDavid du Colombierto
9043e12c5d1SDavid du Colombier.CW emacs ;
9053e12c5d1SDavid du Colombiercertainly the command
9063e12c5d1SDavid du Colombier.P1
9073e12c5d1SDavid du Colombier.WC ",x/Emacs/ c/emacs/
9083e12c5d1SDavid du Colombier.P2
9093e12c5d1SDavid du Colombierwill work, but we can use an
9103e12c5d1SDavid du Colombier.CW x
9113e12c5d1SDavid du Colombiercommand to save retyping most of the word
9123e12c5d1SDavid du Colombier.CW Emacs :
9133e12c5d1SDavid du Colombier.P1
9143e12c5d1SDavid du Colombier.WC ",x/Emacs/ x/E/ c/e/
9153e12c5d1SDavid du Colombier.P2
9163e12c5d1SDavid du Colombier(Blanks can be used
9173e12c5d1SDavid du Colombierto separate commands on a line to make them easier to read.)
9183e12c5d1SDavid du ColombierWhat this command does is find all occurrences of
9193e12c5d1SDavid du Colombier.CW Emacs
9203e12c5d1SDavid du Colombier.CW ,x/Emacs/ ), (
9213e12c5d1SDavid du Colombierand then
9223e12c5d1SDavid du Colombier.I
9233e12c5d1SDavid du Colombierwith dot set to that text,
9243e12c5d1SDavid du Colombier.R
9253e12c5d1SDavid du Colombierfind all occurrences of the letter
9263e12c5d1SDavid du Colombier.CW E
9273e12c5d1SDavid du Colombier.CW x/E/ ), (
9283e12c5d1SDavid du Colombierand then
9293e12c5d1SDavid du Colombier.I
9303e12c5d1SDavid du Colombierwith dot set to that text,
9313e12c5d1SDavid du Colombier.R
9323e12c5d1SDavid du Colombierrun the command
9333e12c5d1SDavid du Colombier.CW c/e/
9343e12c5d1SDavid du Colombierto change the character to lower case.
9353e12c5d1SDavid du ColombierNote that the address for the command \(em the whole file, specified by a comma
9363e12c5d1SDavid du Colombier\(em is only given to the leftmost
9373e12c5d1SDavid du Colombierpiece of the command; the rest of the pieces have dot set for them by
9383e12c5d1SDavid du Colombierthe execution of the pieces to their left.
9393e12c5d1SDavid du Colombier.PP
9403e12c5d1SDavid du ColombierAs another simple example, consider a problem
9413e12c5d1SDavid du Colombiersolved above: printing all lines in the file containing the word
9423e12c5d1SDavid du Colombier.CW Emacs:
9433e12c5d1SDavid du Colombier.P1
9443e12c5d1SDavid du Colombier.WC ",x/.*\en/ g/Emacs/p
9453e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
9463e12c5d1SDavid du Colombierthe method in the madness that is the Emacs command structure.
9473e12c5d1SDavid du Colombier.P2
9483e12c5d1SDavid du ColombierThis command says to break the file into lines
9493e12c5d1SDavid du Colombier.CW ,x/.*\en/ ), (
9503e12c5d1SDavid du Colombierand for each line that contains the string
9513e12c5d1SDavid du Colombier.CW Emacs
9523e12c5d1SDavid du Colombier.CW g/Emacs/ ), (
9533e12c5d1SDavid du Colombierrun the command
9543e12c5d1SDavid du Colombier.CW p
9553e12c5d1SDavid du Colombierwith dot set to the line (not the match of
9563e12c5d1SDavid du Colombier.CW Emacs ),
9573e12c5d1SDavid du Colombierwhich prints the line.
9583e12c5d1SDavid du ColombierTo save typing, because
9593e12c5d1SDavid du Colombier.CW .*\en
9603e12c5d1SDavid du Colombieris a common pattern in
9613e12c5d1SDavid du Colombier.CW x
9623e12c5d1SDavid du Colombiercommands,
9633e12c5d1SDavid du Colombierif the
9643e12c5d1SDavid du Colombier.CW x
9653e12c5d1SDavid du Colombieris followed immediately by a space, the pattern
9663e12c5d1SDavid du Colombier.CW .*\en
9673e12c5d1SDavid du Colombieris assumed.
9683e12c5d1SDavid du ColombierTherefore, the above could be written more succinctly:
9693e12c5d1SDavid du Colombier.P1
9703e12c5d1SDavid du Colombier.WC ",x g/Emacs/p
9713e12c5d1SDavid du Colombier.P2
9723e12c5d1SDavid du ColombierThe solution we used before was
9733e12c5d1SDavid du Colombier.P1
9743e12c5d1SDavid du Colombier.WC ,x/Emacs/+-p
9753e12c5d1SDavid du Colombier.P2
9763e12c5d1SDavid du Colombierwhich runs the command
9773e12c5d1SDavid du Colombier.CW +-p
9783e12c5d1SDavid du Colombierwith dot set to each match of
9793e12c5d1SDavid du Colombier.CW Emacs
9803e12c5d1SDavid du Colombierin the file (recall that the idiom
9813e12c5d1SDavid du Colombier.CW +-p
9823e12c5d1SDavid du Colombierprints the line containing the end of dot).
9833e12c5d1SDavid du Colombier.PP
9843e12c5d1SDavid du ColombierThe two commands usually produce the same result
9853e12c5d1SDavid du Colombier(the
9863e12c5d1SDavid du Colombier.CW +-p
9873e12c5d1SDavid du Colombierform will print a line twice if it contains
9883e12c5d1SDavid du Colombier.CW Emacs
9893e12c5d1SDavid du Colombiertwice).  Which is better?
9903e12c5d1SDavid du Colombier.CW ,x/Emacs/+-p
9913e12c5d1SDavid du Colombieris easier to type and will be much faster if the file is large and
9923e12c5d1SDavid du Colombierthere are few occurrences of the string, but it is really an odd special case.
9933e12c5d1SDavid du Colombier.CW ",x/.*\en/ g/Emacs/p
9943e12c5d1SDavid du Colombieris slower \(em it breaks each line out separately, then examines
9953e12c5d1SDavid du Colombierit for a match \(em but is conceptually cleaner, and generalizes more easily.
9963e12c5d1SDavid du ColombierFor example, consider the following piece of the Emacs manual:
9973e12c5d1SDavid du Colombier.P1
9983e12c5d1SDavid du Colombiercommand name="append-to-file", key="[unbound]"
9993e12c5d1SDavid du ColombierTakes the contents of the current buffer and appends it to the
10003e12c5d1SDavid du Colombiernamed file. If the files doesn't exist, it will be created.
10013e12c5d1SDavid du Colombier
10023e12c5d1SDavid du Colombiercommand name="apropos", key="ESC-?"
10033e12c5d1SDavid du ColombierPrompts for a keyword and then prints a list of those commands
10043e12c5d1SDavid du Colombierwhose short description contains that keyword.  For example,
10053e12c5d1SDavid du Colombierif you forget which commands deal with windows, just type
10063e12c5d1SDavid du Colombier"@b[ESC-?]@t[window]@b[ESC]".
10073e12c5d1SDavid du Colombier
10083e12c5d1SDavid du Colombier\&\f2and so on\f(CW
10093e12c5d1SDavid du Colombier.P2
10103e12c5d1SDavid du ColombierThis text consists of groups of non-empty lines, with a simple format
10113e12c5d1SDavid du Colombierfor the text within each group.
10123e12c5d1SDavid du ColombierImagine that we wanted to find the description of the `apropos'
10133e12c5d1SDavid du Colombiercommand.
10143e12c5d1SDavid du ColombierThe problem is to break the file into individual descriptions,
10153e12c5d1SDavid du Colombierand then to find the description of `apropos' and to print it.
10163e12c5d1SDavid du ColombierThe solution is straightforward:
10173e12c5d1SDavid du Colombier.P1
10183e12c5d1SDavid du Colombier.WC ,x/(.+\en)+/\ g/command\ name="apropos"/p
10193e12c5d1SDavid du Colombiercommand name="apropos", key="ESC-?"
10203e12c5d1SDavid du ColombierPrompts for a keyword and then prints a list of those commands
10213e12c5d1SDavid du Colombierwhose short description contains that keyword.  For example,
10223e12c5d1SDavid du Colombierif you forget which commands deal with windows, just type
10233e12c5d1SDavid du Colombier"@b[ESC-?]@t[window]@b[ESC]".
10243e12c5d1SDavid du Colombier.P2
10253e12c5d1SDavid du ColombierThe regular expression
10263e12c5d1SDavid du Colombier.CW (.+\en)+
10273e12c5d1SDavid du Colombiermatches one or more lines with one or more characters each, that is,
10283e12c5d1SDavid du Colombierthe text between blank lines, so
10293e12c5d1SDavid du Colombier.CW ,x/(.+\en)+/
10303e12c5d1SDavid du Colombierextracts each description; then
10313e12c5d1SDavid du Colombier.CW g/command\ name="apropos"/
10323e12c5d1SDavid du Colombierselects the description for `apropos' and
10333e12c5d1SDavid du Colombier.CW p
10343e12c5d1SDavid du Colombierprints it.
10353e12c5d1SDavid du Colombier.PP
10363e12c5d1SDavid du ColombierImagine that we had a C program containing the variable
10373e12c5d1SDavid du Colombier.CW n ,
10383e12c5d1SDavid du Colombierbut we wanted to change it to
10393e12c5d1SDavid du Colombier.CW num .
10403e12c5d1SDavid du ColombierThis command is a first cut:
10413e12c5d1SDavid du Colombier.P1
10423e12c5d1SDavid du Colombier.WC ",x/n/ c/num/
10433e12c5d1SDavid du Colombier.P2
10443e12c5d1SDavid du Colombierbut is obviously flawed: it will change all
10453e12c5d1SDavid du Colombier.CW n 's
10463e12c5d1SDavid du Colombierin the file, not just the
10473e12c5d1SDavid du Colombier.I identifier
10483e12c5d1SDavid du Colombier.CW n .
10493e12c5d1SDavid du ColombierA better solution is to use an
10503e12c5d1SDavid du Colombier.CW x
10513e12c5d1SDavid du Colombiercommand to extract the identifiers, and then use
10523e12c5d1SDavid du Colombier.CW g
10533e12c5d1SDavid du Colombierto find the
10543e12c5d1SDavid du Colombier.CW n 's:
10553e12c5d1SDavid du Colombier.P1
10563e12c5d1SDavid du Colombier.WC ",x/[a-zA-Z_][a-zA-Z_0-9]*/ g/n/ v/../ c/num/
10573e12c5d1SDavid du Colombier.P2
10583e12c5d1SDavid du ColombierIt looks awful, but it's fairly easy to understand when read
10593e12c5d1SDavid du Colombierleft to right.
10603e12c5d1SDavid du ColombierA C identifier is an alphabetic or underscore followed by zero or more
10613e12c5d1SDavid du Colombieralphanumerics or underscores, that is, matches of the regular expression
10623e12c5d1SDavid du Colombier.CW [a-zA-Z_][a-zA-Z_0-9]* .
10633e12c5d1SDavid du ColombierThe
10643e12c5d1SDavid du Colombier.CW g
10653e12c5d1SDavid du Colombiercommand selects those identifiers containing
10663e12c5d1SDavid du Colombier.CW n ,
10673e12c5d1SDavid du Colombierand the
10683e12c5d1SDavid du Colombier.CW v
10693e12c5d1SDavid du Colombieris a trick: it rejects those identifiers containing more than one
10703e12c5d1SDavid du Colombiercharacter.  Hence the
10713e12c5d1SDavid du Colombier.CW c/num/
10723e12c5d1SDavid du Colombierapplies only to free-standing
10733e12c5d1SDavid du Colombier.CW n 's.
10743e12c5d1SDavid du Colombier.PP
10753e12c5d1SDavid du ColombierThere is still a problem here:
10763e12c5d1SDavid du Colombierwe don't want to change
10773e12c5d1SDavid du Colombier.CW n 's
10783e12c5d1SDavid du Colombierthat are part of the character constant
10793e12c5d1SDavid du Colombier.CW \en .
10803e12c5d1SDavid du ColombierThere is a command
10813e12c5d1SDavid du Colombier.CW y ,
10823e12c5d1SDavid du Colombiercomplementary to
10833e12c5d1SDavid du Colombier.CW x ,
10843e12c5d1SDavid du Colombierthat is just what we need:
10853e12c5d1SDavid du Colombier\f(CWy/\f2pattern\f(CW/\f2command\f1
10863e12c5d1SDavid du Colombierruns the command on the pieces of text
10873e12c5d1SDavid du Colombier.I between
10883e12c5d1SDavid du Colombiermatches of the pattern;
10893e12c5d1SDavid du Colombierif
10903e12c5d1SDavid du Colombier.CW x
10913e12c5d1SDavid du Colombierselects,
10923e12c5d1SDavid du Colombier.CW y
10933e12c5d1SDavid du Colombierrejects.
10943e12c5d1SDavid du ColombierHere is the final command:
10953e12c5d1SDavid du Colombier.P1
10963e12c5d1SDavid du Colombier.WC ",y/\e\en/ x/[a-zA-Z_][a-zA-Z_0-9]*/ g/n/ v/../ c/num/
10973e12c5d1SDavid du Colombier.P2
10983e12c5d1SDavid du ColombierThe
10993e12c5d1SDavid du Colombier.CW y/\e\en/
11003e12c5d1SDavid du Colombier(with backslash doubled to make it a literal character)
11013e12c5d1SDavid du Colombierremoves the two-character sequence
11023e12c5d1SDavid du Colombier.CW \en
11033e12c5d1SDavid du Colombierfrom consideration, so the rest of the command will not touch it.
11043e12c5d1SDavid du ColombierThere is more we could do here; for example, another
11053e12c5d1SDavid du Colombier.CW y
11063e12c5d1SDavid du Colombiercould be prefixed to protect comments in the code.
11073e12c5d1SDavid du ColombierI won't elaborate the example any further, but you should have
11083e12c5d1SDavid du Colombieran idea of the way in which the looping and conditional commands
11093e12c5d1SDavid du Colombierin
11103e12c5d1SDavid du Colombier.CW sam
11113e12c5d1SDavid du Colombiermay be composed to do interesting things.
11123e12c5d1SDavid du Colombier.SH
11133e12c5d1SDavid du ColombierGrouping
11143e12c5d1SDavid du Colombier.PP
11153e12c5d1SDavid du ColombierThere is another way to arrange commands.
11163e12c5d1SDavid du ColombierBy enclosing them in brace brackets
11173e12c5d1SDavid du Colombier.CW {} ,
11183e12c5d1SDavid du Colombiercommands may be applied in parallel.
11193e12c5d1SDavid du ColombierThis example uses the
11203e12c5d1SDavid du Colombier.CW =
11213e12c5d1SDavid du Colombiercommand, which reports the line and character numbers of dot,
11223e12c5d1SDavid du Colombiertogether with
11233e12c5d1SDavid du Colombier.CW p ,
11243e12c5d1SDavid du Colombierto report on appearances of
11253e12c5d1SDavid du Colombier.CW Emacs
11263e12c5d1SDavid du Colombierin our original file:
11273e12c5d1SDavid du Colombier.P1
11283e12c5d1SDavid du Colombier.WC ,p
11293e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
11303e12c5d1SDavid du Colombierseveral sections were written hastily in an attempt to provide a
11313e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
11323e12c5d1SDavid du Colombierthe method in the madness that is the Emacs command structure.
1133*6a5dc222SDavid du Colombier.ft CI
11343e12c5d1SDavid du Colombier,x/Emacs/{
11353e12c5d1SDavid du Colombier	=
11363e12c5d1SDavid du Colombier	+-p
11373e12c5d1SDavid du Colombier}
11383e12c5d1SDavid du Colombier.ft
11393e12c5d1SDavid du Colombier3; #171,#176
11403e12c5d1SDavid du Colombiergeneral introduction to the commands in Emacs and to try to show
11413e12c5d1SDavid du Colombier4; #234,#239
11423e12c5d1SDavid du Colombierthe method in the madness that is the Emacs command structure.
11433e12c5d1SDavid du Colombier.P2
11443e12c5d1SDavid du Colombier(The number before the semicolon is the line number;
11453e12c5d1SDavid du Colombierthe numbers beginning with
11463e12c5d1SDavid du Colombier.CW #
11473e12c5d1SDavid du Colombierare character numbers.)
11483e12c5d1SDavid du ColombierAs a more interesting example, consider changing all occurrences of
11493e12c5d1SDavid du Colombier.CW Emacs
11503e12c5d1SDavid du Colombierto
11513e12c5d1SDavid du Colombier.CW vi
11523e12c5d1SDavid du Colombierand vice versa.  We can type
11533e12c5d1SDavid du Colombier.P1
1154*6a5dc222SDavid du Colombier.ft CI
11553e12c5d1SDavid du Colombier,x/Emacs|vi/{
11563e12c5d1SDavid du Colombier	g/Emacs/ c/vi/
11573e12c5d1SDavid du Colombier	g/vi/ c/Emacs/
11583e12c5d1SDavid du Colombier}
11593e12c5d1SDavid du Colombier.ft
11603e12c5d1SDavid du Colombier.P2
11613e12c5d1SDavid du Colombieror even
11623e12c5d1SDavid du Colombier.P1
1163*6a5dc222SDavid du Colombier.ft CI
11643e12c5d1SDavid du Colombier,x/[a-zA-Z]+/{
11653e12c5d1SDavid du Colombier	g/Emacs/ v/....../ c/vi/
11663e12c5d1SDavid du Colombier	g/vi/ v/.../ c/Emacs/
11673e12c5d1SDavid du Colombier}
11683e12c5d1SDavid du Colombier.ft
11693e12c5d1SDavid du Colombier.P2
11703e12c5d1SDavid du Colombierto make sure we don't change strings embedded in words.
11713e12c5d1SDavid du Colombier.SH
11723e12c5d1SDavid du ColombierMultiple Changes
11733e12c5d1SDavid du Colombier.PP
11743e12c5d1SDavid du ColombierYou might wonder why, once
11753e12c5d1SDavid du Colombier.CW Emacs
11763e12c5d1SDavid du Colombierhas been changed to
11773e12c5d1SDavid du Colombier.CW vi
11783e12c5d1SDavid du Colombierin the above example,
11793e12c5d1SDavid du Colombierthe second command in the braces doesn't put it back again.
11803e12c5d1SDavid du ColombierThe reason is that the commands are run in parallel:
11813e12c5d1SDavid du Colombierwithin any top-level
11823e12c5d1SDavid du Colombier.CW sam
11833e12c5d1SDavid du Colombiercommand, all changes to the file refer to the state of the file
11843e12c5d1SDavid du Colombierbefore any of the changes in that command are made.
11853e12c5d1SDavid du ColombierAfter all the changes have been determined, they are all applied
11863e12c5d1SDavid du Colombiersimultaneously.
11873e12c5d1SDavid du Colombier.PP
11883e12c5d1SDavid du ColombierThis means, as mentioned, that commands within a compound
11893e12c5d1SDavid du Colombiercommand see the state of the file before any of the changes apply.
11903e12c5d1SDavid du ColombierThis method of evaluation makes some things easier (such as the exchange of
11913e12c5d1SDavid du Colombier.CW Emacs
11923e12c5d1SDavid du Colombierand
11933e12c5d1SDavid du Colombier.CW vi ),
11943e12c5d1SDavid du Colombierand some things harder.
11953e12c5d1SDavid du ColombierFor instance, it is impossible to use a
11963e12c5d1SDavid du Colombier.CW p
11973e12c5d1SDavid du Colombiercommand to print the changes as they happen,
11983e12c5d1SDavid du Colombierbecause they haven't happened when the
11993e12c5d1SDavid du Colombier.CW p
12003e12c5d1SDavid du Colombieris executed.
12013e12c5d1SDavid du ColombierAn indirect ramification is that changes must occur in forward
12023e12c5d1SDavid du Colombierorder through the file,
12033e12c5d1SDavid du Colombierand must not overlap.
12043e12c5d1SDavid du Colombier.SH
12053e12c5d1SDavid du ColombierUnix
12063e12c5d1SDavid du Colombier.PP
12073e12c5d1SDavid du Colombier.CW sam
12083e12c5d1SDavid du Colombierhas a few commands to connect to Unix processes.
12093e12c5d1SDavid du ColombierThe simplest is
12103e12c5d1SDavid du Colombier.CW ! ,
12113e12c5d1SDavid du Colombierwhich runs the command with input and output connected to the terminal.
12123e12c5d1SDavid du Colombier.P1
12133e12c5d1SDavid du Colombier.WC !date
12143e12c5d1SDavid du ColombierWed May 28 23:25:21 EDT 1986
12153e12c5d1SDavid du Colombier!
12163e12c5d1SDavid du Colombier.P2
12173e12c5d1SDavid du Colombier(When downloaded, the input is connected to
12183e12c5d1SDavid du Colombier.CW /dev/null
12193e12c5d1SDavid du Colombierand only the first few lines of output are printed;
12203e12c5d1SDavid du Colombierany overflow is stored in
12213e12c5d1SDavid du Colombier.CW $HOME/sam.err .)
12223e12c5d1SDavid du ColombierThe final
12233e12c5d1SDavid du Colombier.CW !
12243e12c5d1SDavid du Colombieris a prompt to indicate when the command completes.
12253e12c5d1SDavid du Colombier.PP
12263e12c5d1SDavid du ColombierSlightly more interesting is
12273e12c5d1SDavid du Colombier.CW > ,
12283e12c5d1SDavid du Colombierwhich provides the current text as standard input to the Unix command:
12293e12c5d1SDavid du Colombier.P1
12303e12c5d1SDavid du Colombier.WC "1,2 >wc
12313e12c5d1SDavid du Colombier      2       22      131
12323e12c5d1SDavid du Colombier!
12333e12c5d1SDavid du Colombier.P2
12343e12c5d1SDavid du ColombierThe complement of
12353e12c5d1SDavid du Colombier.CW >
12363e12c5d1SDavid du Colombieris, naturally,
12373e12c5d1SDavid du Colombier.CW < :
12383e12c5d1SDavid du Colombierit replaces the current text with the standard output of the Unix command:
12393e12c5d1SDavid du Colombier.P1
12403e12c5d1SDavid du Colombier.WC "1 <date
12413e12c5d1SDavid du Colombier!
12423e12c5d1SDavid du Colombier.WC 1p
12433e12c5d1SDavid du ColombierWed May 28 23:26:44 EDT 1986
12443e12c5d1SDavid du Colombier.P2
12453e12c5d1SDavid du ColombierThe last command is
12463e12c5d1SDavid du Colombier.CW | ,
12473e12c5d1SDavid du Colombierwhich is a combination of
12483e12c5d1SDavid du Colombier.CW <
12493e12c5d1SDavid du Colombierand
12503e12c5d1SDavid du Colombier.CW > :
12513e12c5d1SDavid du Colombierthe current text is provided as standard input to the Unix command,
12523e12c5d1SDavid du Colombierand the Unix command's standard output is collected and used to
12533e12c5d1SDavid du Colombierreplace the original text.
12543e12c5d1SDavid du ColombierFor example,
12553e12c5d1SDavid du Colombier.P1
12563e12c5d1SDavid du Colombier.WC ",| sort
12573e12c5d1SDavid du Colombier.P2
12583e12c5d1SDavid du Colombierruns
12593e12c5d1SDavid du Colombier.CW sort (1)
12603e12c5d1SDavid du Colombieron the file, sorting the lines of the text lexicographically.
12613e12c5d1SDavid du ColombierNote that
12623e12c5d1SDavid du Colombier.CW < ,
12633e12c5d1SDavid du Colombier.CW >
12643e12c5d1SDavid du Colombierand
12653e12c5d1SDavid du Colombier.CW |
12663e12c5d1SDavid du Colombierare
12673e12c5d1SDavid du Colombier.CW sam
12683e12c5d1SDavid du Colombiercommands, not Unix shell operators.
12693e12c5d1SDavid du Colombier.PP
12703e12c5d1SDavid du ColombierThe next example converts all appearances of
12713e12c5d1SDavid du Colombier.CW Emacs
12723e12c5d1SDavid du Colombierto upper case using
12733e12c5d1SDavid du Colombier.CW tr (1):
12743e12c5d1SDavid du Colombier.P1
12753e12c5d1SDavid du Colombier.WC ",x/Emacs/ | tr a-z A-Z
12763e12c5d1SDavid du Colombier.P2
12773e12c5d1SDavid du Colombier.CW tr
12783e12c5d1SDavid du Colombieris run once for each occurrence of
12793e12c5d1SDavid du Colombier.CW Emacs .
12803e12c5d1SDavid du ColombierOf course, you could do this example more efficiently with a simple
12813e12c5d1SDavid du Colombier.CW c
12823e12c5d1SDavid du Colombiercommand, but here's a trickier one:
12833e12c5d1SDavid du Colombiergiven a Unix mail box as input,
12843e12c5d1SDavid du Colombierconvert all the
12853e12c5d1SDavid du Colombier.CW Subject
12863e12c5d1SDavid du Colombierheaders to distinct fortunes:
12873e12c5d1SDavid du Colombier.P1
12883e12c5d1SDavid du Colombier.WC ",x/^Subject:.*\en/ x/[^:]*\en/ < /usr/games/fortune
12893e12c5d1SDavid du Colombier.P2
12903e12c5d1SDavid du Colombier(The regular expression
12913e12c5d1SDavid du Colombier.CW [^:]
12923e12c5d1SDavid du Colombierrefers to any character
12933e12c5d1SDavid du Colombier.I except
12943e12c5d1SDavid du Colombier.CW :
12953e12c5d1SDavid du Colombierand newline; the negation operator
12963e12c5d1SDavid du Colombier.CW ^
12973e12c5d1SDavid du Colombierexcludes newline from the list of characters.)
12983e12c5d1SDavid du ColombierAgain,
12993e12c5d1SDavid du Colombier.CW /usr/games/fortune
13003e12c5d1SDavid du Colombieris run once for each
13013e12c5d1SDavid du Colombier.CW Subject
13023e12c5d1SDavid du Colombierline, so each
13033e12c5d1SDavid du Colombier.CW Subject
13043e12c5d1SDavid du Colombierline is changed to a different fortune.
13053e12c5d1SDavid du Colombier.SH
13063e12c5d1SDavid du ColombierA few other text commands
13073e12c5d1SDavid du Colombier.PP
13083e12c5d1SDavid du ColombierFor completeness, I should mention three other commands that
13093e12c5d1SDavid du Colombiermanipulate text.  The
13103e12c5d1SDavid du Colombier.CW m
13113e12c5d1SDavid du Colombiercommand moves the current text to after the text specified by the
13123e12c5d1SDavid du Colombier(obligatory) address after the command.
13133e12c5d1SDavid du ColombierThus
13143e12c5d1SDavid du Colombier.P1
13153e12c5d1SDavid du Colombier.WC "/Emacs/+- m 0
13163e12c5d1SDavid du Colombier.P2
13173e12c5d1SDavid du Colombiermoves the next line containing
13183e12c5d1SDavid du Colombier.CW Emacs
13193e12c5d1SDavid du Colombierto the beginning of the file.
13203e12c5d1SDavid du ColombierSimilarly,
13213e12c5d1SDavid du Colombier.CW t
13223e12c5d1SDavid du Colombier(another historic character) copies the text:
13233e12c5d1SDavid du Colombier.P1
13243e12c5d1SDavid du Colombier.WC "/Emacs/+- t 0
13253e12c5d1SDavid du Colombier.P2
13263e12c5d1SDavid du Colombierwould make, at the beginning of the file, a copy of the next line
13273e12c5d1SDavid du Colombiercontaining
13283e12c5d1SDavid du Colombier.CW Emacs .
13293e12c5d1SDavid du Colombier.PP
13303e12c5d1SDavid du ColombierThe third command is more interesting: it makes substitutions.
13313e12c5d1SDavid du ColombierIts syntax is
13323e12c5d1SDavid du Colombier\f(CWs/\f2pattern\f(CW/\f2replacement\f(CW/\f1.
13333e12c5d1SDavid du ColombierWithin the current text, it finds the first occurrence of
13343e12c5d1SDavid du Colombierthe pattern and replaces it by the replacement text,
13353e12c5d1SDavid du Colombierleaving dot set to the entire address of the substitution.
13363e12c5d1SDavid du Colombier.P1
13373e12c5d1SDavid du Colombier.WC 1p
13383e12c5d1SDavid du ColombierThis manual is organized in a rather haphazard manner.  The first
13393e12c5d1SDavid du Colombier.WC s/haphazard/thoughtless/
13403e12c5d1SDavid du Colombier.WC p
13413e12c5d1SDavid du ColombierThis manual is organized in a rather thoughtless manner.  The first
13423e12c5d1SDavid du Colombier.P2
13433e12c5d1SDavid du ColombierOccurrences of the character
13443e12c5d1SDavid du Colombier.CW &
13453e12c5d1SDavid du Colombierin the replacement text stand for the text matching the pattern.
13463e12c5d1SDavid du Colombier.P1
13473e12c5d1SDavid du Colombier.WC s/T/"&&&&"/
13483e12c5d1SDavid du Colombier.WC p
13493e12c5d1SDavid du Colombier"TTTT"his manual is organized in a rather thoughtless manner.  The first
13503e12c5d1SDavid du Colombier.P2
13513e12c5d1SDavid du ColombierThere are two variants.  The first is that a number may be specified
13523e12c5d1SDavid du Colombierafter the
13533e12c5d1SDavid du Colombier.CW s ,
13543e12c5d1SDavid du Colombierto indicate which occurrence of the pattern to substitute; the default
13553e12c5d1SDavid du Colombieris the first.
13563e12c5d1SDavid du Colombier.P1
13573e12c5d1SDavid du Colombier.WC s2/is/was/
13583e12c5d1SDavid du Colombier.WC p
13593e12c5d1SDavid du Colombier"TTTT"his manual was organized in a rather thoughtless manner.  The first
13603e12c5d1SDavid du Colombier.P2
13613e12c5d1SDavid du ColombierThe second is that suffixing a
13623e12c5d1SDavid du Colombier.CW g
13633e12c5d1SDavid du Colombier(global) causes replacement of all occurrences, not just the first.
13643e12c5d1SDavid du Colombier.P1
13653e12c5d1SDavid du Colombier.WC s/[a-zA-Z]/x/g
13663e12c5d1SDavid du Colombier.WC p
13673e12c5d1SDavid du Colombier"xxxx"xxx xxxxxx xxx xxxxxxxxx xx x xxxxxx xxxxxxxxxxx xxxxxxx  xxx xxxxx
13683e12c5d1SDavid du Colombier.P2
13693e12c5d1SDavid du ColombierNotice that in all these examples
13703e12c5d1SDavid du Colombierdot is left
13713e12c5d1SDavid du Colombierset to the entire line.
13723e12c5d1SDavid du Colombier.PP
13733e12c5d1SDavid du Colombier[The substitute command is vital to
13743e12c5d1SDavid du Colombier.CW ed,
13753e12c5d1SDavid du Colombierbecause it is the only way to make changes within a line.
13763e12c5d1SDavid du ColombierIt is less valuable in
13773e12c5d1SDavid du Colombier.CW sam ,
13783e12c5d1SDavid du Colombierin which the concept of a line is much less important.
13793e12c5d1SDavid du ColombierFor example, many
13803e12c5d1SDavid du Colombier.CW ed
13813e12c5d1SDavid du Colombiersubstitution idioms are handled well by
13823e12c5d1SDavid du Colombier.CW sam 's
13833e12c5d1SDavid du Colombierbasic commands. Consider the commands
13843e12c5d1SDavid du Colombier.P1
13853e12c5d1SDavid du Colombiers/good/bad/
13863e12c5d1SDavid du Colombiers/good//
13873e12c5d1SDavid du Colombiers/good/& bye/
13883e12c5d1SDavid du Colombier.P2
13893e12c5d1SDavid du Colombierwhich are equivalent in
13903e12c5d1SDavid du Colombier.CW sam
13913e12c5d1SDavid du Colombierto
13923e12c5d1SDavid du Colombier.P1
13933e12c5d1SDavid du Colombier/good/c/bad/
13943e12c5d1SDavid du Colombier/good/d
13953e12c5d1SDavid du Colombier/good/a/ bye/
13963e12c5d1SDavid du Colombier.P2
13973e12c5d1SDavid du Colombierand for which the context search is likely unnecessary because the desired
13983e12c5d1SDavid du Colombiertext is already dot.
13993e12c5d1SDavid du ColombierAlso, beware this
14003e12c5d1SDavid du Colombier.CW ed
14013e12c5d1SDavid du Colombieridiom:
14023e12c5d1SDavid du Colombier.P1
14033e12c5d1SDavid du Colombier1,$s/good/bad/
14043e12c5d1SDavid du Colombier.P2
14053e12c5d1SDavid du Colombierwhich changes the first
14063e12c5d1SDavid du Colombier.CW good
14073e12c5d1SDavid du Colombieron each line; the same command in
14083e12c5d1SDavid du Colombier.CW sam
14093e12c5d1SDavid du Colombierwill only change the first one in the whole file.
14103e12c5d1SDavid du ColombierThe correct
14113e12c5d1SDavid du Colombier.CW sam
14123e12c5d1SDavid du Colombierversion is
14133e12c5d1SDavid du Colombier.P1
14143e12c5d1SDavid du Colombier,x s/good/bad/
14153e12c5d1SDavid du Colombier.P2
14163e12c5d1SDavid du Colombierbut what is more likely meant is
14173e12c5d1SDavid du Colombier.P1
14183e12c5d1SDavid du Colombier,x/good/ c/bad/
14193e12c5d1SDavid du Colombier.P2
14203e12c5d1SDavid du Colombier.CW sam
14213e12c5d1SDavid du Colombieroperates under different rules.]
14223e12c5d1SDavid du Colombier.SH
14233e12c5d1SDavid du ColombierFiles
14243e12c5d1SDavid du Colombier.PP
14253e12c5d1SDavid du ColombierSo far, we have only been working with a single file,
14263e12c5d1SDavid du Colombierbut
14273e12c5d1SDavid du Colombier.CW sam
14283e12c5d1SDavid du Colombieris a multi-file editor.
14293e12c5d1SDavid du ColombierOnly one file may be edited at a time, but
14303e12c5d1SDavid du Colombierit is easy to change which file is the `current' file for editing.
14313e12c5d1SDavid du ColombierTo see how to do this, we need a
14323e12c5d1SDavid du Colombier.CW sam
14333e12c5d1SDavid du Colombierwith a few files;
14343e12c5d1SDavid du Colombierthe easiest way to do this is to start it
14353e12c5d1SDavid du Colombierwith a list of Unix file names to edit.
14363e12c5d1SDavid du Colombier.P1
1437*6a5dc222SDavid du Colombier$ \f(CIecho *.ms\f(CW
14383e12c5d1SDavid du Colombierconquest.ms death.ms emacs.ms famine.ms slaughter.ms
1439*6a5dc222SDavid du Colombier$ \f(CIsam -d *.ms\f(CW
14403e12c5d1SDavid du Colombier -. conquest.ms
14413e12c5d1SDavid du Colombier.P2
14423e12c5d1SDavid du Colombier(I'm sorry the Horsemen don't appear in liturgical order.)
14433e12c5d1SDavid du ColombierThe line printed by
14443e12c5d1SDavid du Colombier.CW sam
14453e12c5d1SDavid du Colombieris an indication that the Unix file
14463e12c5d1SDavid du Colombier.CW conquest.ms
14473e12c5d1SDavid du Colombierhas been read, and is now the current file.
14483e12c5d1SDavid du Colombier.CW sam
14493e12c5d1SDavid du Colombierdoes not read the Unix file until
14503e12c5d1SDavid du Colombierthe associated
14513e12c5d1SDavid du Colombier.CW sam
14523e12c5d1SDavid du Colombierfile becomes current.
14533e12c5d1SDavid du Colombier.PP
14543e12c5d1SDavid du ColombierThe
14553e12c5d1SDavid du Colombier.CW n
14563e12c5d1SDavid du Colombiercommand prints the names of all the files:
14573e12c5d1SDavid du Colombier.P1
14583e12c5d1SDavid du Colombier.WC n
14593e12c5d1SDavid du Colombier -. conquest.ms
14603e12c5d1SDavid du Colombier -  death.ms
14613e12c5d1SDavid du Colombier -  emacs.ms
14623e12c5d1SDavid du Colombier -  famine.ms
14633e12c5d1SDavid du Colombier -  slaughter.ms
14643e12c5d1SDavid du Colombier.P2
14653e12c5d1SDavid du ColombierThis list is also available in the menu on mouse button 3.
14663e12c5d1SDavid du ColombierThe command
14673e12c5d1SDavid du Colombier.CW f
14683e12c5d1SDavid du Colombiertells the name of just the current file:
14693e12c5d1SDavid du Colombier.P1
14703e12c5d1SDavid du Colombier.WC f
14713e12c5d1SDavid du Colombier -. conquest.ms
14723e12c5d1SDavid du Colombier.P2
14733e12c5d1SDavid du ColombierThe characters to the left of the file name encode helpful information about
14743e12c5d1SDavid du Colombierthe file.
14753e12c5d1SDavid du ColombierThe minus sign becomes a plus sign if the file has a window open, and an
14763e12c5d1SDavid du Colombierasterisk if more than one is open.
14773e12c5d1SDavid du ColombierThe period (another meaning of dot) identifies the current file.
14783e12c5d1SDavid du ColombierThe leading blank changes to an apostrophe if the file is different
14793e12c5d1SDavid du Colombierfrom the contents of the associated Unix file, as far as
14803e12c5d1SDavid du Colombier.CW sam
14813e12c5d1SDavid du Colombierknows.
14823e12c5d1SDavid du ColombierThis becomes evident if we make a change.
14833e12c5d1SDavid du Colombier.P1
14843e12c5d1SDavid du Colombier.WC 1d
14853e12c5d1SDavid du Colombier.WC f
14863e12c5d1SDavid du Colombier\&'-. conquest.ms
14873e12c5d1SDavid du Colombier.P2
14883e12c5d1SDavid du ColombierIf the file is restored by an undo command, the apostrophe disappears.
14893e12c5d1SDavid du Colombier.P1
14903e12c5d1SDavid du Colombier.WC u
14913e12c5d1SDavid du Colombier.WC f
14923e12c5d1SDavid du Colombier -. conquest.ms
14933e12c5d1SDavid du Colombier.P2
14943e12c5d1SDavid du ColombierThe file name may be changed by providing a new name with the
14953e12c5d1SDavid du Colombier.CW f
14963e12c5d1SDavid du Colombiercommand:
14973e12c5d1SDavid du Colombier.P1
14983e12c5d1SDavid du Colombier.CW "f pestilence.ms
14993e12c5d1SDavid du Colombier\&'-. pestilence.ms
15003e12c5d1SDavid du Colombier.P2
15013e12c5d1SDavid du Colombier.WC f
15023e12c5d1SDavid du Colombierprints the new status of the file,
15033e12c5d1SDavid du Colombierthat is, it changes the name if one is provided, and prints the
15043e12c5d1SDavid du Colombiername regardless.
15053e12c5d1SDavid du ColombierA file name change may also be undone.
15063e12c5d1SDavid du Colombier.P1
15073e12c5d1SDavid du Colombier.WC u
15083e12c5d1SDavid du Colombier.WC f
15093e12c5d1SDavid du Colombier -. conquest.ms
15103e12c5d1SDavid du Colombier.P2
15113e12c5d1SDavid du Colombier.PP
15123e12c5d1SDavid du ColombierWhen
15133e12c5d1SDavid du Colombier.CW sam
15143e12c5d1SDavid du Colombieris downloaded, the current file may be changed simply by selecting
15153e12c5d1SDavid du Colombierthe desired file from the menu (selecting the same file subsequently
15163e12c5d1SDavid du Colombiercycles through the windows opened on the file).
15173e12c5d1SDavid du ColombierOtherwise, the
15183e12c5d1SDavid du Colombier.CW b
15193e12c5d1SDavid du Colombiercommand can be used to choose the desired file:\(dg
15203e12c5d1SDavid du Colombier.FS
15213e12c5d1SDavid du Colombier\(dg A bug prevents the
15223e12c5d1SDavid du Colombier.CW b
15233e12c5d1SDavid du Colombiercommand from working when downloaded.
15243e12c5d1SDavid du ColombierBecause the menu is more convenient anyway, and
15253e12c5d1SDavid du Colombierbecause the method
15263e12c5d1SDavid du Colombierof choosing files from the command language is slated to change,
15273e12c5d1SDavid du Colombierthe bug hasn't been fixed.
15283e12c5d1SDavid du Colombier.FE
15293e12c5d1SDavid du Colombier.P1
15303e12c5d1SDavid du Colombier.WC "b emacs.ms
15313e12c5d1SDavid du Colombier -. emacs.ms
15323e12c5d1SDavid du Colombier.P2
15333e12c5d1SDavid du ColombierAgain,
15343e12c5d1SDavid du Colombier.CW sam
15353e12c5d1SDavid du Colombierprints the name (actually, executes an implicit
15363e12c5d1SDavid du Colombier.CW f
15373e12c5d1SDavid du Colombiercommand) because the Unix file
15383e12c5d1SDavid du Colombier.CW emacs.ms
15393e12c5d1SDavid du Colombieris being read for the first time.
15403e12c5d1SDavid du ColombierIt is an error to ask for a file
15413e12c5d1SDavid du Colombier.CW sam
15423e12c5d1SDavid du Colombierdoesn't know about, but the
15433e12c5d1SDavid du Colombier.CW B
15443e12c5d1SDavid du Colombiercommand will prime
15453e12c5d1SDavid du Colombier.CW sam 's
15463e12c5d1SDavid du Colombiermenu with a new file, and make it current.
15473e12c5d1SDavid du Colombier.P1
15483e12c5d1SDavid du Colombier.WC "b flood.pic
15493e12c5d1SDavid du Colombier?no such file `flood.pic'
15503e12c5d1SDavid du Colombier.WC "B flood.pic
15513e12c5d1SDavid du Colombier -. flood.pic
15523e12c5d1SDavid du Colombier.WC n
15533e12c5d1SDavid du Colombier -  conquest.ms
15543e12c5d1SDavid du Colombier -  death.ms
15553e12c5d1SDavid du Colombier -  emacs.ms
15563e12c5d1SDavid du Colombier -  famine.ms
15573e12c5d1SDavid du Colombier -. flood.pic
15583e12c5d1SDavid du Colombier -  slaughter.ms
15593e12c5d1SDavid du Colombier.P2
15603e12c5d1SDavid du ColombierBoth
15613e12c5d1SDavid du Colombier.CW b
15623e12c5d1SDavid du Colombierand
15633e12c5d1SDavid du Colombier.CW B
15643e12c5d1SDavid du Colombierwill accept a list of file names.
15653e12c5d1SDavid du Colombier.CW b
15663e12c5d1SDavid du Colombiersimply takes the first file in the list, but
15673e12c5d1SDavid du Colombier.CW B
15683e12c5d1SDavid du Colombierloads them all.
15693e12c5d1SDavid du ColombierThe list may be typed on one line \(em
15703e12c5d1SDavid du Colombier.P1
15713e12c5d1SDavid du Colombier.WC "B devil.tex satan.tex 666.tex emacs.tex
15723e12c5d1SDavid du Colombier.P2
15733e12c5d1SDavid du Colombier\(em or generated by a Unix command \(em
15743e12c5d1SDavid du Colombier.P1
15753e12c5d1SDavid du Colombier.WC "B <echo *.tex
15763e12c5d1SDavid du Colombier.P2
15773e12c5d1SDavid du ColombierThe latter form requires a Unix command;
15783e12c5d1SDavid du Colombier.CW sam
15793e12c5d1SDavid du Colombierdoes not understand the shell file name metacharacters, so
15803e12c5d1SDavid du Colombier.CW "B *.tex
15813e12c5d1SDavid du Colombierattempts to load a single file named
15823e12c5d1SDavid du Colombier.CW *.tex .
15833e12c5d1SDavid du Colombier(The
15843e12c5d1SDavid du Colombier.CW <
15853e12c5d1SDavid du Colombierform is of course derived from
15863e12c5d1SDavid du Colombier.CW sam 's
15873e12c5d1SDavid du Colombier.CW <
15883e12c5d1SDavid du Colombiercommand.)
15893e12c5d1SDavid du Colombier.CW echo
15903e12c5d1SDavid du Colombieris not the only useful command to run subservient to
15913e12c5d1SDavid du Colombier.CW B ;
15923e12c5d1SDavid du Colombierfor example,
15933e12c5d1SDavid du Colombier.P1
15943e12c5d1SDavid du Colombier.WC "B <grep -l Emacs *
15953e12c5d1SDavid du Colombier.P2
15963e12c5d1SDavid du Colombierwill load only those files containing the string
15973e12c5d1SDavid du Colombier.CW Emacs .
15983e12c5d1SDavid du ColombierFinally, a special case: a
15993e12c5d1SDavid du Colombier.CW B
16003e12c5d1SDavid du Colombierwith no arguments creates an empty, nameless file within
16013e12c5d1SDavid du Colombier.CW sam .
16023e12c5d1SDavid du Colombier.PP
16033e12c5d1SDavid du ColombierThe complement of
16043e12c5d1SDavid du Colombier.CW B
16053e12c5d1SDavid du Colombieris
16063e12c5d1SDavid du Colombier.CW D :
16073e12c5d1SDavid du Colombier.P1
16083e12c5d1SDavid du Colombier.WC "D devil.tex satan.tex 666.tex emacs.tex
16093e12c5d1SDavid du Colombier.P2
16103e12c5d1SDavid du Colombiereradicates the files from
16113e12c5d1SDavid du Colombier.CW sam 's
16123e12c5d1SDavid du Colombiermemory (not from the Unix machine's disc).
16133e12c5d1SDavid du Colombier.CW D
16143e12c5d1SDavid du Colombierwithout any file names removes the current file from
16153e12c5d1SDavid du Colombier.CW sam .
16163e12c5d1SDavid du Colombier.PP
16173e12c5d1SDavid du ColombierThere are three other commands that relate the current file
16183e12c5d1SDavid du Colombierto Unix files.
16193e12c5d1SDavid du ColombierThe
16203e12c5d1SDavid du Colombier.CW w
16213e12c5d1SDavid du Colombiercommand writes the file to disc;
16223e12c5d1SDavid du Colombierwithout arguments, it writes the entire file to the Unix file associated
16233e12c5d1SDavid du Colombierwith the current file in
16243e12c5d1SDavid du Colombier.CW sam
16253e12c5d1SDavid du Colombier(it is the only command whose default address is not dot).
16263e12c5d1SDavid du ColombierOf course, you can specify an address to be written,
16273e12c5d1SDavid du Colombierand a different file name, with the obvious syntax:
16283e12c5d1SDavid du Colombier.P1
16293e12c5d1SDavid du Colombier.WC "1,2w /tmp/revelations
16303e12c5d1SDavid du Colombier/tmp/revelations: #44
16313e12c5d1SDavid du Colombier.P2
16323e12c5d1SDavid du Colombier.CW sam
16333e12c5d1SDavid du Colombierresponds with the file name and the number of characters written to the file.
16343e12c5d1SDavid du ColombierThe
16353e12c5d1SDavid du Colombier.CW write
16363e12c5d1SDavid du Colombiercommand on the button 3 menu is identical in function to an unadorned
16373e12c5d1SDavid du Colombier.CW w
16383e12c5d1SDavid du Colombiercommand.
16393e12c5d1SDavid du Colombier.PP
16403e12c5d1SDavid du ColombierThe other two commands,
16413e12c5d1SDavid du Colombier.CW e
16423e12c5d1SDavid du Colombierand
16433e12c5d1SDavid du Colombier.CW r ,
16443e12c5d1SDavid du Colombierread data from Unix files.
16453e12c5d1SDavid du ColombierThe
16463e12c5d1SDavid du Colombier.CW e
16473e12c5d1SDavid du Colombiercommand clears out the current file,
16483e12c5d1SDavid du Colombierreads the data from the named file (or uses the current file's old name if
16493e12c5d1SDavid du Colombiernone is explicitly provided), and sets the file name.
16503e12c5d1SDavid du ColombierIt's much like a
16513e12c5d1SDavid du Colombier.CW B
16523e12c5d1SDavid du Colombiercommand, but puts the information in the current file instead of a new one.
16533e12c5d1SDavid du Colombier.CW e
16543e12c5d1SDavid du Colombierwithout any file name is therefore an easy way to refresh
16553e12c5d1SDavid du Colombier.CW sam 's
16563e12c5d1SDavid du Colombiercopy of a Unix file.
16573e12c5d1SDavid du Colombier[Unlike in
16583e12c5d1SDavid du Colombier.CW ed ,
16593e12c5d1SDavid du Colombier.CW e
16603e12c5d1SDavid du Colombierdoesn't complain if the file is modified.  The principle is not
16613e12c5d1SDavid du Colombierto protect against things that can be undone if wrong.]
16623e12c5d1SDavid du ColombierSince its job is to replace the whole text,
16633e12c5d1SDavid du Colombier.CW e
16643e12c5d1SDavid du Colombiernever takes an address.
16653e12c5d1SDavid du Colombier.PP
16663e12c5d1SDavid du ColombierThe
16673e12c5d1SDavid du Colombier.CW r
16683e12c5d1SDavid du Colombiercommand is like
16693e12c5d1SDavid du Colombier.CW e ,
16703e12c5d1SDavid du Colombierbut it doesn't clear the file:
16713e12c5d1SDavid du Colombierthe text in the Unix file replaces dot, or the specified text if an
16723e12c5d1SDavid du Colombieraddress is given.
16733e12c5d1SDavid du Colombier.P1
16743e12c5d1SDavid du Colombier.WC "r emacs.ms
16753e12c5d1SDavid du Colombier.P2
16763e12c5d1SDavid du Colombierhas essentially the effect of
16773e12c5d1SDavid du Colombier.P1
16783e12c5d1SDavid du Colombier.WC "<cat emacs.ms
16793e12c5d1SDavid du Colombier.P2
16803e12c5d1SDavid du ColombierThe commands
16813e12c5d1SDavid du Colombier.CW r
16823e12c5d1SDavid du Colombierand
16833e12c5d1SDavid du Colombier.CW w
16843e12c5d1SDavid du Colombierwill set the name of the file if the current file has no name already defined;
16853e12c5d1SDavid du Colombier.CW e
16863e12c5d1SDavid du Colombiersets the name even if the file already has one.
16873e12c5d1SDavid du Colombier.PP
16883e12c5d1SDavid du ColombierThere is a command, analogous to
16893e12c5d1SDavid du Colombier.CW x ,
16903e12c5d1SDavid du Colombierthat iterates over files instead of pieces of text:
16913e12c5d1SDavid du Colombier.CW X
16923e12c5d1SDavid du Colombier(capital
16933e12c5d1SDavid du Colombier.CW x ).
16943e12c5d1SDavid du ColombierThe syntax is easy; it's just like that of
16953e12c5d1SDavid du Colombier.CW x
16963e12c5d1SDavid du Colombier\(em \f(CWX/\f2pattern\f(CW/\f2command\f1.
16973e12c5d1SDavid du Colombier(The complementary command is
16983e12c5d1SDavid du Colombier.CW Y ,
16993e12c5d1SDavid du Colombieranalogous to
17003e12c5d1SDavid du Colombier.CW y .)
17013e12c5d1SDavid du ColombierThe effect is to run the command in each file whose menu entry
17023e12c5d1SDavid du Colombier(that is, whose line printed by an
17033e12c5d1SDavid du Colombier.CW f
17043e12c5d1SDavid du Colombiercommand) matches the pattern.
17053e12c5d1SDavid du ColombierFor example, since an apostrophe identifies modified files,
17063e12c5d1SDavid du Colombier.P1
17073e12c5d1SDavid du Colombier.WC "X/'/ w
17083e12c5d1SDavid du Colombier.P2
17093e12c5d1SDavid du Colombierwrites the changed files out to disc.
17103e12c5d1SDavid du ColombierHere is a longer example: find all uses of a particular variable
17113e12c5d1SDavid du Colombierin the C source files:
17123e12c5d1SDavid du Colombier.P1
17133e12c5d1SDavid du Colombier.WC "X/\e.c$/ ,x/variable/+-p
17143e12c5d1SDavid du Colombier.P2
17153e12c5d1SDavid du ColombierWe can use an
17163e12c5d1SDavid du Colombier.CW f
17173e12c5d1SDavid du Colombiercommand to identify which file the variable appears in:
17183e12c5d1SDavid du Colombier.P1
1719*6a5dc222SDavid du Colombier.ft CI
17203e12c5d1SDavid du ColombierX/\e.c$/ ,g/variable/ {
17213e12c5d1SDavid du Colombier	f
17223e12c5d1SDavid du Colombier	,x/variable/+-{
17233e12c5d1SDavid du Colombier		=
17243e12c5d1SDavid du Colombier		p
17253e12c5d1SDavid du Colombier	}
17263e12c5d1SDavid du Colombier}
17273e12c5d1SDavid du Colombier.ft
17283e12c5d1SDavid du Colombier.P2
17293e12c5d1SDavid du ColombierHere, the
17303e12c5d1SDavid du Colombier.CW g
17313e12c5d1SDavid du Colombiercommand guarantees that only the names of files containing the variable
17323e12c5d1SDavid du Colombierwill be printed (but beware that
17333e12c5d1SDavid du Colombier.CW sam
17343e12c5d1SDavid du Colombiermay confuse matters by printing the names of files it reads in during
17353e12c5d1SDavid du Colombierthe command).
17363e12c5d1SDavid du ColombierThe
17373e12c5d1SDavid du Colombier.CW =
17383e12c5d1SDavid du Colombiercommand shows where in the file the variable appears, and the
17393e12c5d1SDavid du Colombier.CW p
17403e12c5d1SDavid du Colombiercommand prints the line.
17413e12c5d1SDavid du Colombier.PP
17423e12c5d1SDavid du ColombierThe
17433e12c5d1SDavid du Colombier.CW D
17443e12c5d1SDavid du Colombiercommand is handy as the target of an
17453e12c5d1SDavid du Colombier.CW X .
17463e12c5d1SDavid du ColombierThis example deletes from the menu all C files that do not contain
17473e12c5d1SDavid du Colombiera particular variable:
17483e12c5d1SDavid du Colombier.P1
17493e12c5d1SDavid du Colombier.WC "X/\e.c$/ ,v/variable/ D
17503e12c5d1SDavid du Colombier.P2
17513e12c5d1SDavid du ColombierIf no pattern is provided for the
17523e12c5d1SDavid du Colombier.CW X ,
17533e12c5d1SDavid du Colombierthe command (which defaults to
17543e12c5d1SDavid du Colombier.CW f )
17553e12c5d1SDavid du Colombieris run in all files, so
17563e12c5d1SDavid du Colombier.P1
17573e12c5d1SDavid du Colombier.WC "X D
17583e12c5d1SDavid du Colombier.P2
17593e12c5d1SDavid du Colombiercleans
17603e12c5d1SDavid du Colombier.CW sam
17613e12c5d1SDavid du Colombierup for a fresh start.
17623e12c5d1SDavid du Colombier.PP
17633e12c5d1SDavid du ColombierBut rather than working any further, let's stop now:
17643e12c5d1SDavid du Colombier.P1
17653e12c5d1SDavid du Colombier.WC q
17663e12c5d1SDavid du Colombier$
17673e12c5d1SDavid du Colombier.P2
17683e12c5d1SDavid du Colombier.fi
17693e12c5d1SDavid du Colombier.PP
17703e12c5d1SDavid du ColombierSome of the file manipulating commands can be undone:
17713e12c5d1SDavid du Colombierundoing a
17723e12c5d1SDavid du Colombier.CW f ,
17733e12c5d1SDavid du Colombier.CW e ,
17743e12c5d1SDavid du Colombieror
17753e12c5d1SDavid du Colombier.CW r
17763e12c5d1SDavid du Colombierrestores the previous state of the file,
17773e12c5d1SDavid du Colombierbut
17783e12c5d1SDavid du Colombier.CW w ,
17793e12c5d1SDavid du Colombier.CW B
17803e12c5d1SDavid du Colombierand
17813e12c5d1SDavid du Colombier.CW D
17823e12c5d1SDavid du Colombierare irrevocable.
17833e12c5d1SDavid du ColombierAnd, of course, so is
17843e12c5d1SDavid du Colombier.CW q .
1785