SAM(1) | General Commands Manual | SAM(1) |
sam
— screen
editor with structural regular expressions
sam |
[-d ] [-S ]
[-t terminal]
file ... |
sam |
-r machine
[-s file]
[-t terminal]
file ... |
sam.save |
B |
[-r machine]
file ... |
sam
is a multi-file editor. It modifies a
local copy of an external file. The copy is here called a
file. The
files are listed in a menu available through mouse button 3 or the
n
command. Each file has an associated name, usually
the name of the external file from which it was read, and a
“modified” bit that indicates whether the editor's file agrees
with the external file. The external file is not read into the editor's file
until it first becomes the current file – that file to which editing
commands apply – whereupon its menu entry is printed. The options
are
-d
sam
. Editing
will be done with the command language only, as in
ed(1).-S
B
. This
instance of sam
will not be controllable by other
commands.-r
machinesam
associated with
machine.-s
file-t
filesam
can only edit text files, encoded
using the encoding specified in the LC_ALL
,
LC_CTYPE
, or LANG
environment variables (see locale(7)).
sam
supports any encoding supported by the
underlying operating system.
Editing files that do not contain valid text in the current encoding (including binary files) will result in a warning and such files generally neither load nor display correctly. The standard iconv(1) utility can be used to convert among various text encodings, and may be useful in converting files to the current encoding for editing.
Regular expressions are more-or-less as they are in
regex(7), with the addition of
\n
to represent newlines. A regular expression may
never contain a literal newline character. The elements of regular
expressions are:
\n
\x
n
match the character
(here x).[abc]
\n
may
be mentioned.[^abc]
a-z
.^
$
Any other character except newline matches itself.
In the following, r1 and r2 are regular expressions.
The operators *
,
+
, and ? are highest precedence, then catenation,
then | is lowest. The empty regular expression stands for the last complete
expression encountered. A regular expression in sam
matches the longest leftmost substring formally matched by the expression.
Searching in the reverse direction is equivalent to search backwards with
the catenation operations reversed in the expression.
An address identifies a substring in a file. In the following
“character n means the null string after the
n-th character in the file, with 1 the first character in
the file. “Line n” means the
n-th match, starting at the beginning of the file, of the
regular expression .*\n?
. (The peculiar properties
of a last line without a newline are temporarily undefined.) All files
always have a current substring, called
dot, that is
the default address.”
#
n#0
is the beginning of the file./
regexp /
/
) or beginning (?) of the file, and if
necessary continuing the search from the other end to the starting point
of the search. The matched substring may straddle the starting point. When
entering a pattern containing a literal question mark for a backward
search, the question mark should be specified as a member of a class.0
+
and -
below.$
'
In the following, a1 and a2 are addresses.
0
is substituted. If a2 is
missing, $
is substituted.The operators +
and
-
are high precedence, while , and ; are low
precedence.
In both +
and -
forms, if a2 is a line or character address with a missing
number, the number defaults to 1. If a1 is missing, . is
subtituted. If both a1 and a2 are
present and distinguishable, +
may be elided.
a2 may be a regular expression; if it is delimited by
?""
characters, the effect of the
+
or -
is reversed.
It is an error for a compound address to represent a malformed substring.
Some useful idioms:
0;//
sets dot unnecessarily.)In the following, text demarcated by slashes represents text
delimited by any printable ASCII character except alphanumerics. Any number
of trailing delimiters may be elided, with multiple elisions then
representing null strings, but the first delimiter must always be present.
In any delimited text, newline may not appear literally;
\n
may be typed for newline; and
\/
quotes the delimiter, here
/
. Backslash is otherwise interpreted literally,
except in s commands.
Most commands may be prefixed with an address to indicate
their range of operation. Those that may not are marked with a
* below. If a command
takes an address and none is supplied, dot is used. The sole exception is
the w command, which defaults to
0,$
. In the description, “range” is
used to represent whatever address is supplied. Many commands set the value
of dot as a side effect. If so, it is always to the “result”
of the change: the empty string for a deletion, the new text for an
insertion, etc. (but see the s and e
commands).
May also be written as
a lines of text .
&
stands
for the string that matched the expression. Backslash behaves as usual
unless followed by a digit: \d stands for the string
that matched the subexpression begun by the d-th left
parenthesis. If s is followed immediately by a number
n, as in s2/x/y/
, the
n-th match in the range is substituted. If the command
is followed by g, as in s/x/y/g
,
all matches in the range are substituted.sam
has such a file
in its menu. If no such file is present, name is
compared against the basename(3) of
each menu file, and the first match is made current. Finally, if no such
file is present, the first menu file that contains
name as a substring is selected. The name may be
expressed
<shell-command
in which case the file names are taken as words (in the shell sense)
generated by the shell command and no fuzzy matching is performed.*
means more than one window is open),0,$
) to the named
external file.If the file name argument is absent from any of these, the current file name is used. e always sets the file name, r and w will do so if the file has no name.
$HOME
is used.In any of <, >, |
, or !, if the shell
command is omitted, the last shell command (of any type) is substituted. If
sam
is downloaded, ! sets standard input to
/dev/null, and otherwise unassigned output
(stdout for ! and >,
stderr for all) is placed in
${HOME}/sam.err and the first few lines are
printed.
/.*\n/
is
assumed. Null string matches potentially occur before every character of
the range and at the end of the range.These may be nested arbitrarily deeply, but only one instance of either X or Y may appear in a single command. An empty command in an x or y defaults to p; an empty command in X or Y defaults to f. g and v do not have defaults.
sam
is downloaded, the
resulting dot is selected on the screen; otherwise it is printed. If no
address is specified (the command is a newline) dot is extended in either
direction to the line boundaries and printed. If dot is thereby unchanged,
i is set to .+1
and printed.Commands may be grouped by enclosing them in curly braces. Commands within the braces must appear on separate lines (no backslashes are required between commands) “as those familiar with other editors might expect”. Semantically, the opening brance is like a command: it takes an (optional) address and sets dot for each sub-command. Commands within the braces are executed sequentially, but changes made by one command are not visible to other commands (see the next paragraph.) Braces may be nested arbitrarily.
When a command makes a number of changes to a file, as in
x/re/c/text/
, the addresses of all changes to the
file are computed in the original file. If the changes are in sequence, they
are applied to the file. Successive insertions at the same address are
catenated into a single insertion composed of the several insertions in the
order applied.
What follows refers to the behavior of sam
when downloaded, that is, when operating as a display editor on a bitmap
display. This is the default behavior; invoking sam
with the -d
(no download) option provides access to
the command language only.
Each file may have zero or more windows open. Each window is equivalent and is updated simultaneously with changes in other windows on the same file. Each window has an independent value of dot, indicated by a highlighted substring on the display. Dot may be in a region not within the window. There is usually a “current window,” marked with a dark border, to which typed text and editing commands apply. The escape key selects (sets dot to) text typed since the last mouse button hit.
The button 3 menu controls window operations. The top of the menu provides the following operators, each of which uses one or more cursors to prompt for selection of a window or sweeping of a rectangle.
sam
window, depending on where the null
rectangle is.Below these operators is a list of available files, starting with
~~sam~~, the command window. Selecting a file from the
list makes the most recently used window on that file current, unless it is
already current, in which case selections cycle through the open windows. If
no windows are open on the file, the user is prompted to open one. Files
other than ~~sam~~ are marked with one of the characters
-+*
according as zero, one, or more windows are open
on the file. A further mark, ., appears on the file in the current window
and a single quote, '
, on a file modified since last
write.
The command window, created automatically when
sam
starts, is an ordinary window except that text
typed to it is interpreted as commands for the editor rather than passive
text, and text printed by editor commands appears in it. There is an
“output point” that separates commands being typed from
previous output. Commands typed in the command window apply to the current
open file–the file in the most recently current window.
Typed characters replace the current selection (dot) in the current window. Backspace deletes the previous character.
Button 1 changes the selection. Pointing to a non-current window with button 1 makes it current; within the current window, button 1 selects text, thus setting dot. Double-clicking selects text to the boundaries of words, lines, quoted strings, or bracketed strings, depending on the text at the click.
Button 2 (or button 3 combined with the shift key) provides a menu of editing commands:
The cut and paste operations can also be accessed combinations of mouse buttons, without using the menu. After making a selection with button 1, pressing button 2 with button 1 still pressed will perform a cut operation. Pressing button 3 with button 1 still pressed will perform a paste operation. Performing both of these operations (pressing buttons 2 and then 3 with button 1 still pressed) is the equivalent of the snarf operation. These button combinations are referred to as “chords.”
A scroll wheel, if present, can be used to scroll a file up and down.
Various editing functions are also available via the keyboard. The notation C-x below means “hold the Control key while pressing x” where x is another key.
Key Sequence | Action |
C-K | Jump to/from the command window |
C-E/X/D/S | Collapse and move selection up/down/right/left |
C-W/U | Delete previous word/to beginning of line |
C-Backspace | Delete previous word |
C-Y | Cut selection |
C-C | Snarf selection |
C-V | Paste selection |
C-Q | Exchange selection |
C-Tab | Insert a tab (even when tab expansion is enabled) |
Escape | Highlight recently typed text |
Note that the key bindings, mouse chords, and scroll wheel configuration can be modified at runtime (see samrc(5) and Runtime configuration below) and thus may vary depending upon your configuration.
The terminal can be configured at runtime using environment variables (see below) or by writing a samrc file in your home directory (see samrc(5)). The terminal's keybindings, mouse chords, tab handling, colors, and fonts may be set at runtime using these methods.
If sam
terminates other than by a
q command (by hangup, deleting its window, etc.,) modified
files are saved in an executable file, (${HOME}/sam.save.) This program,
when executed, asks whether to write each file back to an external file. The
answer y causes writing; anything else skips the file.
Note that is a shell script, passed directly to
sh(1). A modicum of caution should therefore
be taken before blindly executing it, especially if one of the files being
edited was itself a shell script.
If a machine crash prevents the creation of a file, all changes are lost. If an editing session is difficult to replicate, writing changed files often is recommended.
sam
allows the host and terminal parts of
the editor to run on diffrent machines, in a process called
“downloading.” This process can be suppressed with the
-d
option, which then runs only the host part in the
manner of ed(1).
Running the host part on another machine is accomplished using the
-r
option, which is used to specify a remote machine
name suitable for passing to the remote shell command specified in the
RSH
environment variable.
The only component of sam
that needs to be
on the remote machine is sam
, or whatever command
specified as the argument to the -s
option. Users
may also like to have the B
command present on the
remote system; invoking this command on the remote system will (if
sam
was invoked with its default remote host
command, i.e. sam
) open files in the local terminal.
This allows users to run the terminal part of sam
locally while controlling it via a remote shell connection.
sam
B
is a shell command that causes a
downloaded instance of sam
to load the named files.
The -r
option causes the instance of
sam
connected to machine to
load the named files; the default is the most-recently started local
instance.
B
may also be called on a remote machine,
causing the downloaded instance of sam connected to that machine to load the
named files.
The following environment variables affect the operation of
sam
:
LC_CTYPE
LC_ALL
LANG
sam
or else communication breaks down.
For example, when using ssh(1) as the remote shell mechanism, adding
AcceptEnv LC_CTYPE
FOREGROUND
sam
to draw its
terminal. Common English color names can be used (see
rgb(5)), or exact colors can be specified
as
#rrggbb,
where rr,
gg, and
bb are
hexadecimal digits describing the red, green, and blue components of the
color, respectively. By default, this is the string “black.”
This can also be set using the
foreground
directive in samrc(5).BORDER
FOREGROUND
, but describing the color used to
draw borders. This can also be set using the
border
directive in samrc(5).BACKGROUND
FOREGROUND
, but describing the background color.
By default, this is the string “white.” If multiple colors
are specified, sam
will cycle through this list
when opening new files. Note that the command text will use the first
color specified.
This can also be set using the background directive in samrc(5).
FONT
RSH
sam
is invoked with the -r
option. It will be passed arguments of the form:
-R REMOTE:LOCAL MACHINE COMMAND
sam
) to execute on that
machine.
Note that this works out-of-the-box with recent versions of ssh(1). Any additional arguments should be passed to the command on the remote machine. By default, this is the string “ssh.”
SAMRC
SAMSOCKETPATH
sam
remote control
sockets should be placed. By default, the contents of
HOME
are used.SAMSOCKETNAME
sam
remote control
socket; this will be used in preference to any file in the
SAMSOCKETPATH
directory.RSAMSOCKETPATH
sam
remote control
sockets should be placed on remote systems.TABS
If the number specified for
TABS
is negative, the absolute value of that
number is used and automatic tab expansion is enabled. Tab behavior can
also be controlled using the
tabs and
expandtabs
directives in samrc(5).
SHELL
sam
terminates abnormally. Executing
this file will prompt the user to restore the files that were being edited
at the time of termination.sam
.The only human language in which colors may be specified is English.
The only human language in which output is generated is English.
There is no support for right-to-left text, ligatures, composed characters, or any other complex text rendering.
There is no support for font fallback: characters that do not exist in the configured font will display as unknown characters.
November 18, 2024 | x86_64 |