Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
.TH SAM 1
2
.ds a \fR*\ \fP
3
.SH NAME
4
sam, B, sam.save, samterm \- screen editor with structural regular expressions 
5
.SH SYNOPSIS
6
.B sam
7
[
8
.I option ...
9
] [
10
.I files
11
]
12
.PP
13
.B sam
14
.B -r
15
.I machine
16
.PP
17
.B sam.save
18
.PP
19
.B B
20
[
21
.BI -nnnn
22
]
23
.I file ...
24
.SH DESCRIPTION
25
.I Sam
26
is a multi-file editor.
27
It modifies a local copy of an external file.
28
The copy is here called a
29
.IR file .
30
The files are listed in a menu available through mouse button 3
31
or the
32
.B n
33
command.
34
Each file has an associated name, usually the name of the
35
external file from which it was read, and a `modified' bit that indicates whether
36
the editor's file agrees with the external file.
37
The external file is not read into
38
the editor's file until it first becomes the current file\(emthat to
39
which editing commands apply\(emwhereupon its menu entry is printed.
40
The options are
41
.TF -rmachine
42
.TP
43
.B -a
44
Autoindent.  In this mode, when a newline character is typed
45
in the terminal interface,
46
.I samterm
47
copies leading white space on the current line to the new line.
48
.TP
49
.B -d
50
Do not `download' the terminal part of
51
.IR sam .
52
Editing will be done with the command language only, as in
53
.IR ed (1).
54
.TP
55
.BI -r " machine
56
Run the host part remotely
57
on the specified machine, the terminal part locally.
58
.TP
59
.BI -s " path
60
Start the host part from the specified file on the remote host.
61
Only meaningful with the
62
.BI -r
63
option.
64
.TP
65
.BI -t " path
66
Start the terminal part from the specified file.  Useful
67
for debugging.
68
.PD
69
.SS Regular expressions
70
Regular expressions are as in
71
.IR regexp (6)
72
with the addition of
73
.BR \en
74
to represent newlines.
75
A regular expression may never contain a literal newline character.
76
The empty
77
regular expression stands for the last complete expression encountered.
78
A regular expression in
79
.I sam
80
matches the longest leftmost substring formally
81
matched by the expression.
82
Searching in the reverse direction is equivalent
83
to searching backwards with the catenation operations reversed in
84
the expression.
85
.SS Addresses
86
An address identifies a substring in a file.
87
In the following, `character
88
.IR n '
89
means the null string
90
after the
91
.IR n -th
92
character in the file, with 1 the
93
first character in the file.
94
`Line
95
.IR n '
96
means the
97
.IR n -th
98
match,
99
starting at the beginning of the file, of the regular expression
100
.LR .*\en? .
101
All files always have a current substring, called dot,
102
that is the default address.
103
.SS Simple Addresses
104
.PD 0
105
.TP
106
.BI # n
107
The empty string after character
108
.IR n ;
109
.B #0
110
is the beginning of the file.
111
.TP
112
.I n
113
Line
114
.IR n ;
115
.B 0
116
is the beginning of the file.
117
.TP
118
.BI  / regexp /
119
.PD 0
120
.TP
121
.BI ? regexp ?
122
The substring that matches the regular expression,
123
found by looking toward the end 
124
.RB ( / )
125
or beginning
126
.RB ( ? )
127
of the file,
128
and if necessary continuing the search from the other end to the
129
starting point of the search.
130
The matched substring may straddle
131
the starting point.
132
When entering a pattern containing a literal question mark
133
for a backward search, the question mark should be
134
specified as a member of a class.
135
.PD
136
.TP
137
.B 0
138
The string before the first full line.
139
This is not necessarily
140
the null string; see
141
.B +
142
and
143
.B -
144
below.
145
.TP
146
.B $
147
The null string at the end of the file.
148
.TP
149
.B .
150
Dot.
151
.TP
152
.B \&'
153
The mark in the file (see the
154
.B k
155
command below).
156
.TP
157
\fB"\f2regexp\fB"\f1\f1
158
Preceding a simple address (default
159
.BR . ),
160
refers to the address evaluated in the unique file whose menu line
161
matches the regular expression.
162
.PD
163
.SS Compound Addresses
164
In the following,
165
.I a1
166
and
167
.I a2
168
are addresses.
169
.TF a1+a2
170
.TP
171
.IB a1 + a2
172
The address
173
.I a2
174
evaluated starting at the end of
175
.IR a1 .
176
.TP
177
.IB a1 - a2
178
The address
179
.I a2
180
evaluated looking in the reverse direction
181
starting at the beginning of
182
.IR a1 .
183
.TP
184
.IB a1 , a2
185
The substring from the beginning of
186
.I a1
187
to the end of
188
.IR a2 .
189
If
190
.I a1
191
is missing,
192
.B 0
193
is substituted.
194
If
195
.I a2
196
is missing,
197
.B $
198
is substituted.
199
.TP
200
.IB  a1 ; a2
201
Like
202
.IB a1 , a2\f1,
203
but with
204
.I a2
205
evaluated at the end of, and dot set to,
206
.IR a1 .
207
.PD
208
.PP
209
The operators
210
.B +
211
and
212
.B -
213
are high precedence, while
214
.B ,
215
and
216
.B ;
217
are low precedence.
218
.PP
219
In both
220
.B +
221
and
222
.B -
223
forms, if
224
.I a2
225
is a line or character address with a missing
226
number, the number defaults to 1.
227
If
228
.I a1
229
is missing,
230
.L .
231
is substituted.
232
If both
233
.I a1
234
and
235
.I a2
236
are present and distinguishable,
237
.B +
238
may be elided.
239
.I a2
240
may be a regular
241
expression; if it is delimited by
242
.LR ? 's,
243
the effect of the
244
.B +
245
or
246
.B -
247
is reversed.
248
.PP
249
It is an error for a compound address to represent a malformed substring.
250
Some useful idioms: 
251
.IB a1 +-
252
\%(\f2a1\fB-+\f1)
253
selects the line containing
254
the end (beginning) of a1.
255
.BI 0/ regexp /
256
locates the first match of the expression in the file.
257
(The form
258
.B 0;//
259
sets dot unnecessarily.)
260
.BI ./ regexp /// 
261
finds the second following occurrence of the expression,
262
and
263
.BI .,/ regexp /
264
extends dot.
265
.SS Commands
266
In the following, text demarcated by slashes represents text delimited
267
by any printable
268
character except alphanumerics.
269
Any number of
270
trailing delimiters may be elided, with multiple elisions then representing
271
null strings, but the first delimiter must always
272
be present.
273
In any delimited text,
274
newline may not appear literally;
275
.B \en
276
may be typed for newline; and
277
.B \e/
278
quotes the delimiter, here 
279
.LR / .
280
Backslash is otherwise interpreted literally, except in
281
.B s
282
commands.
283
.PP
284
Most commands may be prefixed by an address to indicate their range
285
of operation.
286
Those that may not are marked with a 
287
.L *
288
below.
289
If a command takes
290
an address and none is supplied, dot is used.
291
The sole exception is
292
the
293
.B w
294
command, which defaults to
295
.BR 0,$ .
296
In the description, `range' is used
297
to represent whatever address is supplied.
298
Many commands set the
299
value of dot as a side effect.
300
If so, it is always set to the `result'
301
of the change: the empty string for a deletion, the new text for an
302
insertion, etc. (but see the
303
.B s
304
and
305
.B e
306
commands).
307
.br
308
.ne 1.2i
309
.SS Text commands
310
.PD 0
311
.TP
312
.BI a/ text /
313
.TP
314
or
315
.TP
316
.B  a
317
.TP
318
.I lines of text
319
.TP
320
.B .
321
Insert the text into the file after the range.
322
Set dot.
323
.PD
324
.TP
325
.B c\fP
326
.br
327
.ns
328
.TP
329
.B i\fP
330
Same as
331
.BR a ,
332
but
333
.B c
334
replaces the text, while
335
.B i
336
inserts
337
.I before
338
the range.
339
.TP
340
.B d
341
Delete the text in the range.
342
Set dot.
343
.TP
344
.BI s/ regexp / text /
345
Substitute
346
.I text
347
for the first match to the regular expression in the range.
348
Set dot to the modified range.
349
In 
350
.I text
351
the character
352
.B &
353
stands for the string
354
that matched the expression. 
355
Backslash behaves as usual unless followed by
356
a digit:
357
.BI \e d
358
stands for the string that matched the
359
subexpression begun by the
360
.IR d -th
361
left parenthesis.
362
If
363
.I s
364
is followed immediately by a
365
number
366
.IR n ,
367
as in
368
.BR s2/x/y/ ,
369
the
370
.IR n -th
371
match in the range is substituted.
372
If the
373
command is followed by a
374
.BR g ,
375
as in
376
.BR s/x/y/g ,
377
all matches in the range
378
are substituted.
379
.TP
380
.BI m " a1
381
.br
382
.ns
383
.TP
384
.BI t " a1
385
Move
386
.RB ( m )
387
or copy
388
.RB ( t )
389
the range to after
390
.IR a1 .
391
Set dot.
392
.SS Display commands
393
.PD 0
394
.TP
395
.B p
396
Print the text in the range.
397
Set dot.
398
.TP
399
.B =
400
Print the line address and character address of the range.
401
.TP
402
.B =#
403
Print just the character address of the range.
404
.PD
405
.SS File commands
406
.PD 0
407
.TP
408
.BI \*ab " file-list
409
Set the current file to the first file named in the list
410
that
411
.I sam
412
also has in its menu.
413
The list may be expressed
414
.BI < "Plan 9 command"
415
in which case the file names are taken as words (in the shell sense)
416
generated by the Plan 9 command.
417
.TP
418
.BI \*aB " file-list
419
Same as
420
.BR b ,
421
except that file names not in the menu are entered there,
422
and all file names in the list are examined.
423
.TP
424
.B \*an
425
Print a menu of files.
426
The format is:
427
.RS
428
.TP 11
429
.BR ' " or blank
430
indicating the file is modified or clean,
431
.TP 11
432
.BR - " or \&" +
433
indicating the file is unread or has been read
434
(in the terminal,
435
.B *
436
means more than one window is open),
437
.TP 11
438
.BR . " or blank
439
indicating the current file,
440
.TP 11
441
a blank,
442
.TP 11
443
and the file name.
444
.RE
445
.TP 0
446
.BI \*aD " file-list
447
Delete the named files from the menu.
448
If no files are named, the current file is deleted.
449
It is an error to
450
.B D
451
a modified file, but a subsequent
452
.B D
453
will delete such a file.
454
.PD
455
.SS I/O Commands
456
.PD 0
457
.TP
458
.BI \*ae " filename
459
Replace the file by the contents of the named external file.
460
Set dot to the beginning of the file.
461
.TP
462
.BI r " filename
463
Replace the text in the range by the contents of the named external file.
464
Set dot.
465
.TP
466
.BI w " filename
467
Write the range (default
468
.BR 0,$ )
469
to the named external file.
470
.TP
471
.BI \*af " filename
472
Set the file name and print the resulting menu entry.
473
.PP
474
If the file name is absent from any of these, the current file name is used.
475
.B e
476
always sets the file name;
477
.B r
478
and
479
.B w
480
do so if the file has no name.
481
.TP
482
.BI < " Plan 9-command
483
Replace the range by the standard output of the
484
Plan 9 command.
485
.TP
486
.BI > " Plan 9-command
487
Send the range to the standard input of the
488
Plan 9 command.
489
.TP
490
.BI | " Plan 9-command
491
Send the range to the standard input, and replace it by
492
the standard output, of the
493
Plan 9 command.
494
.TP
495
.BI \*a! " Plan 9-command
496
Run the
497
Plan 9 command.
498
.TP
499
.BI \*acd " directory
500
Change working directory.
501
If no directory is specified,
502
.B $home
503
is used.
504
.PD
505
.PP
506
In any of
507
.BR < ,
508
.BR > ,
509
.B |
510
or
511
.BR ! ,
512
if the
513
.I Plan 9 command
514
is omitted the last
515
.I Plan 9 command
516
(of any type) is substituted.
517
If
518
.I sam
519
is
520
.I downloaded
521
(using the mouse and raster display, i.e. not using option
522
.BR -d ),
523
.B !
524
sets standard input to
525
.BR /dev/null ,
526
and otherwise
527
unassigned output
528
.RB ( stdout
529
for
530
.B !
531
and
532
.BR > ,
533
.B stderr
534
for all) is placed in
535
.B /tmp/sam.err
536
and the first few lines are printed.
537
.SS Loops and Conditionals
538
.PD 0
539
.TP
540
.BI x/ regexp / " command
541
For each match of the regular expression in the range, run the command
542
with dot set to the match.
543
Set dot to the last match.
544
If the regular
545
expression and its slashes are omitted, 
546
.L /.*\en/
547
is assumed.
548
Null string matches potentially occur before every character
549
of the range and at the end of the range.
550
.TP
551
.BI y/ regexp / " command
552
Like
553
.BR x ,
554
but run the command for each substring that lies before, between,
555
or after
556
the matches that would be generated by
557
.BR x .
558
There is no default regular expression.
559
Null substrings potentially occur before every character
560
in the range.
561
.TP
562
.BI \*aX/ regexp / " command
563
For each file whose menu entry matches the regular expression,
564
make that the current file and
565
run the command.
566
If the expression is omitted, the command is run
567
in every file.
568
.TP
569
.BI \*aY/ regexp / " command
570
Same as
571
.BR X ,
572
but for files that do not match the regular expression,
573
and the expression is required.
574
.TP
575
.BI g/ regexp / " command
576
.br
577
.ns
578
.TP
579
.BI v/ regexp / " command
580
If the range contains
581
.RB ( g )
582
or does not contain
583
.RB ( v )
584
a match for the expression,
585
set dot to the range and run the command.
586
.PP
587
These may be nested arbitrarily deeply, but only one instance of either
588
.B X
589
or
590
.B Y
591
may appear in a \%single command.
592
An empty command in an
593
.B x
594
or
595
.B y
596
defaults to
597
.BR p ;
598
an empty command in
599
.B X
600
or
601
.B Y
602
defaults to
603
.BR f .
604
.B g
605
and
606
.B v
607
do not have defaults.
608
.PD
609
.SS Miscellany
610
.TF (empty)
611
.TP
612
.B k
613
Set the current file's mark to the range.  Does not set dot.
614
.TP
615
.B \*aq
616
Quit.
617
It is an error to quit with modified files, but a second
618
.B q
619
will succeed.
620
.TP
621
.BI \*au " n
622
Undo the last
623
.I n
624
(default 1)
625
top-level commands that changed the contents or name of the
626
current file, and any other file whose most recent change was simultaneous
627
with the current file's change.
628
Successive
629
.BR u 's
630
move further back in time.
631
The only commands for which u is ineffective are
632
.BR cd ,
633
.BR u ,
634
.BR q ,
635
.B w
636
and
637
.BR D .
638
If
639
.I n
640
is negative,
641
.B u
642
`redoes,' undoing the undo, going forwards in time again.
643
.TP
644
(empty)
645
If the range is explicit, set dot to the range.
646
If
647
.I sam
648
is downloaded, the resulting dot is selected on the screen;
649
otherwise it is printed.
650
If no address is specified (the
651
command is a newline) dot is extended in either direction to
652
line boundaries and printed.
653
If dot is thereby unchanged, it is set to
654
.B .+1 
655
and printed.
656
.PD
657
.SS Grouping and multiple changes
658
Commands may be grouped by enclosing them in braces
659
.BR {} .
660
Commands within the braces must appear on separate lines (no backslashes are
661
required between commands).
662
Semantically, an opening brace is like a command:
663
it takes an (optional) address and sets dot for each sub-command.
664
Commands within the braces are executed sequentially, but changes made
665
by one command are not visible to other commands (see the next
666
paragraph).
667
Braces may be nested arbitrarily.
668
.PP
669
When a command makes a number of changes to a file, as in
670
.BR x/re/c/text/ ,
671
the addresses of all changes to the file are computed in the original file.
672
If the changes are in sequence,
673
they are applied to the file.
674
Successive insertions at the same address are catenated into a single
675
insertion composed of the several insertions in the order applied.
676
.SS The terminal
677
What follows refers to behavior of
678
.I sam
679
when downloaded, that is, when
680
operating as a display editor on a raster display.
681
This is the default
682
behavior; invoking
683
.I sam
684
with the
685
.B -d
686
(no download) option provides access
687
to the command language only.
688
.PP
689
Each file may have zero or more windows open.
690
Each window is equivalent
691
and is updated simultaneously with changes in other windows on the same file.
692
Each window has an independent value of dot, indicated by a highlighted
693
substring on the display.
694
Dot may be in a region not within
695
the window.
696
There is usually a `current window',
697
marked with a dark border, to which typed text and editing
698
commands apply.
699
Text may be typed and edited as in
700
.IR rio (1);
701
also the escape key (ESC) selects (sets dot to) text typed
702
since the last mouse button hit.
703
.PP
704
The button 3 menu controls window operations.
705
The top of the menu
706
provides the following operators, each of which uses one or
707
more
708
.IR rio -like
709
cursors to prompt for selection of a window or sweeping
710
of a rectangle.
711
`Sweeping' a null rectangle gets a large window, disjoint
712
from the command window or the whole screen, depending on
713
where the null rectangle is.
714
.TF resize
715
.TP 
716
.B new
717
Create a new, empty file.
718
.TP
719
.B zerox
720
Create a copy of an existing window.
721
.TP
722
.B resize
723
As in
724
.IR rio .
725
.TP
726
.B close
727
Delete the window.
728
In the last window of a file,
729
.B close
730
is equivalent to a
731
.B D
732
for the file.
733
.TP
734
.B write
735
Equivalent to a
736
.B w
737
for the file.
738
.PD
739
.PP
740
Below these operators is a list of available files, starting with
741
.BR ~~sam~~ ,
742
the command window.
743
Selecting a file from the list makes the most recently
744
used window on that file current, unless it is already current, in which
745
case selections cycle through the open windows.
746
If no windows are open
747
on the file, the user is prompted to open one.
748
Files other than
749
.B ~~sam~~
750
are marked with one of the characters
751
.B -+*
752
according as zero, one, or more windows
753
are open on the file.
754
A further mark
755
.L .
756
appears on the file in the current window and
757
a single quote,
758
.BR ' ,
759
on a file modified since last write.
760
.PP
761
The command window, created automatically when
762
.B sam
763
starts, is an ordinary window except that text typed to it
764
is interpreted as commands for the editor rather than passive text,
765
and text printed by editor commands appears in it.
766
The behavior is like
767
.IR rio ,
768
with an `output point' that separates commands being typed from
769
previous output.
770
Commands typed in the command window apply to the
771
current open file\(emthe file in the most recently
772
current window.
773
.SS Manipulating text
774
Button 1 changes selection, much like
775
.IR rio .
776
Pointing to a non-current window with button 1 makes it current;
777
within the current window, button 1 selects text, thus setting dot.
778
Double-clicking selects text to the boundaries of words, lines,
779
quoted strings or bracketed strings, depending on the text at the click.
780
.PP
781
Button 2 provides a menu of editing commands:
782
.TF /regexp
783
.TP
784
.B cut
785
Delete dot and save the deleted text in the snarf buffer.
786
.TP
787
.B paste
788
Replace the text in dot by the contents of the snarf buffer.
789
.TP
790
.B snarf
791
Save the text in dot in the snarf buffer.
792
.TP
793
.B plumb
794
Send the text in the selection as a plumb
795
message.  If the selection is empty,
796
the white-space-delimited block of text is sent as a plumb message
797
with a
798
.B click
799
attribute defining where the selection lies (see
800
.IR plumb (6)).
801
.TP
802
.B look
803
Search forward for the next occurrence of the literal text in dot.
804
If dot is the null string, the text in the snarf buffer is
805
used.
806
The snarf buffer is unaffected.
807
.TP
808
.B <rio>
809
Exchange snarf buffers with
810
.IR rio .
811
.TP
812
.BI / regexp
813
Search forward for the next match of the last regular expression
814
typed in a command.
815
(Not in command window.)
816
.TP
817
.B send
818
Send the text in dot, or the snarf buffer if
819
dot is the null string, as if it were typed to the command window.
820
Saves the sent text in the snarf buffer.
821
(Command window only.) 
822
.PD
823
.SS External communication
824
.I Sam
825
listens to the
826
.B edit
827
plumb port.
828
If plumbing is not active,
829
on invocation
830
.I sam
831
creates a named pipe
832
.BI /srv/sam. user
833
which acts as an additional source of commands.  Characters written to
834
the named pipe are treated as if they had been typed in the command window.
835
.PP
836
.I B
837
is a shell-level command that causes an instance of
838
.I sam
839
running on the same terminal to load the named
840
.IR files .
841
.I B
842
uses either plumbing or the named pipe, whichever service is available.
843
If plumbing is not enabled,
844
the option allows a line number to be specified for
845
the initial position to display in the last named file
846
(plumbing provides a more general mechanism for this ability).
847
.SS Abnormal termination
848
If
849
.I sam
850
terminates other than by a
851
.B q
852
command (by hangup, deleting its window, etc.), modified
853
files are saved in an
854
executable file,
855
.BR $home/sam.save .
856
This program, when executed, asks whether to write
857
each file back to a external file.
858
The answer
859
.L y
860
causes writing; anything else skips the file.
861
.SH FILES
862
.TF /sys/src/cmd/samterm
863
.TP
864
.B $home/sam.save
865
.TP
866
.B $home/sam.err
867
.TP
868
.B /sys/lib/samsave
869
the program called to unpack
870
.BR $home/sam.save .
871
.SH SOURCE
872
.TF /sys/src/cmd/samterm
873
.TP
874
.B /sys/src/cmd/sam
875
source for
876
.I sam
877
itself
878
.TP
879
.B /sys/src/cmd/samterm
880
source for the separate terminal part
881
.TP
882
.B /rc/bin/B
883
.SH SEE ALSO
884
.IR ed (1),
885
.IR sed (1),
886
.IR grep (1),
887
.IR rio (1),
888
.IR regexp (6).
889
.PP
890
Rob Pike,
891
``The text editor sam''.