diff options
Diffstat (limited to 'static/unix-v10/man1/qed.1')
| -rw-r--r-- | static/unix-v10/man1/qed.1 | 1617 |
1 files changed, 1617 insertions, 0 deletions
diff --git a/static/unix-v10/man1/qed.1 b/static/unix-v10/man1/qed.1 new file mode 100644 index 00000000..21e7b38d --- /dev/null +++ b/static/unix-v10/man1/qed.1 @@ -0,0 +1,1617 @@ +.TH "QED" 1 +. \" /*% nroff -man % +.if t .ds q \(aa +.if n .ds q ' +.SH NAME +qed \- multi-file text editor +.SH SYNOPSIS +.B qed +[ +.B \- +] [ +.B \-i +] [ +.B \-q +] [ +.B \-e +] [ +.B \-x +startupfile +] [ filename1 filename2 ... ] +.SH DESCRIPTION +\fIQed\fP +is a multiple-file programmable text editor based on +.IR ed . +.PP +.I Qed +operates on a copy of any file it is editing; changes made +in the copy have no effect on the file until a \fIw\fR +or \fIW\fR (write) +command is given. +The copy of the text being edited resides +in a scratch area called a +.I buffer. +There are 56 buffers, labeled by alphabetics `a' to `z' and `A' to `Z', +and the characters `{', `|', `}' and `~' +(the four ASCII characters following `z'). +These 56 characters are called, for notational efficiency, +.I bnames. +The buffers can contain any ASCII character except NUL. +.PP +If +.I file +arguments are given, +.I qed +simulates an +.I r +command (see below) on each of the named files; that is to say, +the files are read into +.I qed's +buffers so that they can be edited. +The first is read into buffer `a', the second into buffer `b', +through `z', +then from `A' to `Z', +up to a maximum of 52 files. +The optional +.B \- +puts +.I qed +in non-\c +.I verbose +mode (described with the +.I o +command). +The +\fB\-q\fR, \fB\-e\fR +and +.B \-i +are equivalent to performing an initial +`oqs', `oes' or `ois' command (see the +.I o +command below). +.PP +When \fIqed\fP starts up, +the file named by the environment variable +.B QEDFILE +is read into +buffer `~' and executed +(i.e. read as command input), before +reading in files and accepting commands from the terminal. +The argument +.I filename\c +s are set in the buffers before the startup file is executed, +so the startup file can treat the \fIfilenames\fR as arguments. +The default startup file may be overridden with the \fB\-x\fR option. +.PP +Input to +.I qed +can be redirected, at any time, +to come from storage such as a buffer +by use of a +.I special +.I character +such as ``\eb''. +All the +.I qed special character +sequences are discussed in detail below; +they all begin with a +backslash `\\'. +.PP +.I Qed +has a +.I truth flag +which is set according to the success of certain commands +and which can be tested for conditional execution, and a +.I count +which is set to such values as the number of successful substitutions +performed in an +.I s +command. +Each buffer has associated with it a +(possibly null) filename and a +.I changed +flag, which is +set if the contents of the buffer are known to differ +from the contents of the named file in that buffer. +.PP +Commands to +.I qed +have a simple and regular structure: zero or +more +.I addresses +followed by a single character +\fIcommand\fP, +possibly +followed by parameters to the command. +These addresses specify one or more lines in the buffer. +Every command which requires addresses has default addresses, +so that the addresses can often be omitted. +.PP +In general, any number of commands can appear on a line. +Some commands require that the character following +the command be a separator, such as blank, tab or newline. +Usually, a +.I display +.IR character , +.IR p , +.IR P , +.IR l , +or +.I L +may precede the separator, +causing the resulting line to be displayed in the specified format +after the command. +Certain commands allow the input of text for placement in the buffer. +This text can be supplied in two forms: +either +on the same line, after the command, +or on lines following the command, +terminated by a line containing only a period `\fB.\fP'. +If the text is on the command line, +it is separated from the command by a space or a tab. +If the tab is used, it is considered part of the text. +.PP +.I Qed +supports a limited form of +\fIregular\fP \fIexpression\fP +notation. +A regular expression specifies +a set of strings of characters. +A member of this set of strings is said to be +.I matched +by the regular expression. +Regular expressions in +.I qed +are delimited by enclosing them in a pair of identical characters, +frequently slashes `/'. +In the following specification for regular expressions the word `character' +means any character but newline. +Note that special character interpretation always occurs +.I before +executing a command. +Thus, the backslashes mentioned below are those present +after special characters have been interpreted. +.IP 1. +Any character except a metacharacter matches itself. +Metacharacters are the regular expression delimiter plus +< [ \fB.\fP and \e | > ^ * \+ $ +when another rule gives them a meaning. +.IP 2. +A \fB.\fP matches any character. +.IP 3. +A backslash \\ followed by +any metacharacter in the list given in rule 1 +is a regular expression and matches that character. +A backslash followed by one of +! _ { } ( ) +or a non-zero digit +has a special meaning discussed below; +otherwise, backslashes have literal meaning in regular expressions. +.IP 4. +The metacharacter \e\|! matches any control character +except tab or newline. +.IP 5. +A non-empty string +.I s +enclosed in square brackets +[\fIs\fP] (or [^\fIs\fP]) matches any character in (or not in) \fIs\fP. +In +.IR s , +\\ has no special meaning, and ] may only appear as the first character. +A substring +.IR a \- b , +with +.I a +and +.I b +in ascending ASCII order, stands for the inclusive range of ASCII characters. +.IP 6. +A regular expression, +of the form <\fIx1\fP> or <\fIx1\fR|\|\fIx2\fR|\|...|\|\fIxn\fR>, +where the \fIx\fR's are regular expressions of form 1-12, matches what +the leftmost successful \fIx\fR +matches. +.IP 7. +A backslash followed by a non-zero digit +.I n +matches a copy of the string that the bracketed regular expression +(see rule 11) +beginning with the \fIn\fPth \e\|( matched. +.IP 8. +A regular expression of form 1-7 followed by * (\+) +matches a sequence of zero (one) or more matches of the regular expression. +.IP 9. +The metacharacter \\\|_ matches a non-empty +maximal-length sequence of blanks and tabs. +.IP 10. +The metacharacter \\\|{ (\\\|}) matches the empty string at the beginning +(end) of an identifier. An identifier is defined to be +an underscore _ or alphabetic followed by zero or more +underscores, alphabetics or digits. +.IP 11. +A regular expression, +.IR x , +of form 1-12, bracketed \e\|(\|\fIx\fP\|\e\|) matches what +.I x +matches. +The nesting of these brackets in each regular expression of an +alternation (rule 6) must be identical. +An alternation with these brackets may not be iterated (rule 8). +.IP 12. +A regular expression of form 1-12, +.IR x , +followed by a regular expression of form 1-11, +.IR y , +matches a match for +.I x +followed by a match for +.IR y , +with the +.I x +match being as long as possible while still permitting a +.I y +match. +.IP 13. +A regular expression of form 1-12 preceded by ^ (followed by $) is constrained +to matches that begin at the left (end at the right) end of a line. +.IP 14. +A regular expression of form 1-13 picks out the longest among the leftmost matches +in a line. +.IP 15. +An empty regular expression stands for a copy of the last regular expression encountered. +.PP +.i0 +Regular expressions are used in addresses and the +.I g +and +.I v +commands +to specify +lines, in the +.I s +command +to specify a portion of a line which is to be replaced, +in the +.I G +and +.I V +commands to refer to buffers in which to perform commands, +and in general whenever text +is being specified. +.PP +To understand addressing in +.I qed +it is necessary to know that at any time there is a +\fIcurrent buffer\fR +and a +\fIcurrent line.\fR +When +.I qed +is invoked, +the current buffer is +buffer `a', +but may be changed at any time by a +.I b +(change buffer) command. +All addresses refer to lines in the current buffer, +except for a special case described under the +.I m +(move) command. +.PP +Generally speaking, the current line is +the last line affected by a command; however, +the exact effect on the current line +is discussed under the description of +the command. +Addresses are constructed as follows. +.IP 1. +The character `\fB.\fR' addresses the current line. +.IP 2. +The character `$' addresses the last line of the buffer. +.IP 3. +A decimal number +.I n +addresses the +\fIn\fR-th +line of the buffer. +.IP 4. +`\*q\fIx\fR' addresses the line marked with the +mark name character \fIx\fR, +which must be a bname. +Lines are marked with the +.I k +command described below. +It is an error for the marked line to be outside of the current buffer. +.IP 5. +A regular expression enclosed in slashes `/' addresses +the first matching line +found by searching forwards from the line after the current line. +If necessary, the search wraps around to the beginning of the +buffer. +If the trailing `/' would be followed by a newline, +it may be omitted. +.IP 6. +A regular expression enclosed in queries `?' addresses +the first matching line +found by searching backwards from the line before +the current line. +If necessary +the search wraps around to the end of the buffer. +If the trailing `?' would be followed by a newline, +it may be omitted. +.IP 7. +An address followed by a plus sign `+' +or a minus sign `\-' followed by a decimal number specifies that address plus +(resp. minus) the indicated number of lines. +The plus sign may be omitted. +.IP 8. +An address followed by `+' or `\-' followed by a +regular expression enclosed in slashes specifies the first +matching line following (resp. preceding) that address. +The search wraps around if necessary. +The `+' may be omitted. +Enclosing the regular expression in `?' reverses the search direction. +.IP 9. +If an address begins with `+' or `\-' +the addition or subtraction is taken with respect to the current line; +e.g. `\-5' is understood to mean `\fB.\fR\-5'. +.IP 10. +If an address ends with a `+' (or `\-') 1 is added (resp. subtracted). +As a consequence of this rule and rule 9, +the address `\-' refers to the line before the current line. +Moreover, trailing `+' and `\-' characters have cumulative effect, so `\-\-' +refers to the current line less 2. +.IP 11. +To maintain compatibility with earlier versions of the editor, +the character `^' in addresses is entirely +equivalent to `\-'. +.PP +.i0 +Commands may require zero, one, or two addresses. +Commands which require no addresses regard the presence +of an address as an error. +Commands which accept one or two addresses +assume default addresses when none is given. +If more addresses are given than the command requires, +the last one or two (depending on what is accepted) are used. +The last addressed line must not precede the second-last addressed line. +.PP +Typically, addresses are separated from each other by a comma `,'. +They may instead be separated by a semicolon `;' +in which case the current line `\fB.\fR' is set to the first address +before the second address is interpreted. +The second of two separated addresses may not be a line +earlier in the buffer than the first. +If the address on the left (right) side of a comma or semicolon +is absent, it defaults to the first (resp. last) line. +.PP +Filename operands of commands may be made up of printing characters only. +However, when the filename appears as the argument to the invocation of +\fIqed\fP, +non-printing characters may be included. +When a filename is specified for a command, +it is terminated at the first blank, tab or newline. +.PP +In the following list of +.I qed +commands, the default addresses +are shown in parentheses. +The parentheses are not part of +the address, but are used to show that the given addresses are +the default. +.TP 5 +( \fB. \fR)\|a <text> +The append command accepts input text +and appends it after the addressed line. +`\fB.\fR' is left +on the last line input, if there +were any, otherwise at the addressed line. +Address `0' is legal for this command; text is placed +at the beginning of the buffer. +.TP 5 +b<bname> +The change buffer command sets the current buffer +to be that named. +`\fB.\fR', `$' and the remembered +.I filename +are set to those of the new buffer; +upon return to a previously used buffer, +`\fB.\fR' will be set to its value when the buffer was last used. +.TP 5 +( \fB. \fR)\|b[+\-\^\fB.\fP\^][pagesize][display character] +The browse command provides page-oriented printing. +The optional `+', `\-', or +.RB ` . ' +specifies whether the next, +previous, +or surrounding page +is to be printed; if absent, `+' is assumed. +.IB b . +also prints several carets `^^^^^' +immediately below the current line. +If a pagesize is given, it is used for the current browse +command and remembered as the default. +The pagesize is initially 22 lines. +If a display character is given, +the lines are printed in the specified format, +and the format is remembered as the default. +Initially, `p' is the default. +For +.I b+ +and +.IR b\- , +`\fB.\fP' is left at the last line displayed; +for +\fIb\fP\fB.\fP, +it is unchanged. +NOTE: The browse and change buffer commands are the same character! +The two commands can be syntactically distinguished +in all cases except for `b<display\ char>'; +this ambiguity may be resolved by typing the (implicit) `+' +after the `b'. +.TP 5 +( \fB. \fR, \fB. \fR)\|c <text> +The change +command deletes the addressed lines, then accepts input +text which replaces these lines. +`\fB.\fR' is left at the last line input; if there were none, +it is left at the line preceding the deleted lines. +If an interrupt signal (usually ASCII DEL) is received during a +change command, the old lines are not deleted. +.TP 5 +( \fB. \fR, \fB. \fR)\|d +The delete command deletes the addressed lines from the buffer. +The line after the deleted section becomes the current line; +if the deleted lines were originally at the end, +the new last line becomes the current line. +The character after the `d' can only be one of +a blank, newline, tab, or display character. +Line 0 is a valid address for deletion; +deleting line 0 has no affect on any lines in the buffer. +.TP 5 +e filename +The edit +command causes the entire contents of the current buffer to be deleted, +and then the named file to be read in. +`\fB.\fR' is set to the last line of the buffer. +The number of characters read is typed +if +.I qed +is in +.I verbose +mode. +The \fIfilename\fP is remembered for possible use as a default file name +in a subsequent +\fIf\fP, \fIr\fR, \fIw\fR, or \fIW\fR command. +.TP 5 +E filename +The +.I E +command is like +.IR e , +except that +.I qed +does not check to see +if the buffer has been modified +since the last +.I w +command. +.TP 5 +f filename +The filename command prints information about the current buffer, +in the format used by the \fIn\fR command. +If \fIfilename\fP is given, +the currently remembered file name is changed to \fIfilename\fP. +If +.I qed +is not in verbose mode, +the information is only printed if the +.I filename +is not specified. +If it is not desired to set the +.I filename, +the character immediately after the f must be a newline. +Otherwise, the first token +(which may be the null string) +on the line, after a mandatory non-empty sequence of blanks and tabs, +is taken to be the +.I filename. +These rules apply to all +.I filename\c +-using commands, +.I e, +.I f, +.I r, +.I R, +.I S, +.I w +and +.I W, +although some regard specification of an explicitly null \fIfilename\fP as an +error. +.TP 5 +( 1 , $ )\|g/regular expression/command list +In the global +command, the first step is to mark every line in the range which matches +the regular expression. +Then for every such line, the +command list is executed with `\fB.\fR' initially set to that line. +Any embedded newlines in the command list +must be escaped with a backslash. +The +\fIa\fP, +\fIi\fP, +and +.I c +commands and associated input are permitted; +the `\fB.\fR' terminating input mode may be omitted if it would be on the +last line of the command list. +The commands +.I g +and +.I v +are not permitted in the command list. +If the command list is empty, `\fB.\fPp' is assumed. +The regular expression may be delimited by any character other than newline. +.TP 5 +G/regular expression/command list +In the globuf +command, the first step is to mark every active buffer +whose output from an +.I f +command +(with the +.I filename +printed literally) +would match the regular expression. +(An active buffer is one which has either some text or +a remembered file name.)\ +Then for every such buffer, the +command list is executed with the current buffer set to that buffer. +In other respects it is like the global command, +except that only the commands +.I G +and +.I V +are not permitted in the command list. +If the command list is empty, `f' is assumed. +.TP 5 +h<option> command list +The until command provides a simple looping mechanism. +The command list is a newline-terminated command sequence which forms +the body of the loop; embedded newlines must be escaped with a backslash. +The option specifies the exit condition for the loop, +and is specified by the character(s) immediately following the `h': +.RS +.IP h[\fIN\fP]t 6 +The loop is executed until the truth flag is true. +.PD 0 +.IP h[\fIN\fP]f 6 +The loop is executed until the truth flag is false. +.IP h[\fIN\fP] 6 +The loop is executed indefinitely. +.RE +.PD +.IP +The loop condition is tested +.I after +execution, so the `ht' and `hf' forms execute at least once. +.I N +denotes an optional non-negative number which indicates the +maximum number of times to execute the loop. +.TP 5 +( \fB. \fR)\|i <text> +The insert command accepts input text +and inserts it before the addressed line. +`\fB.\fR' is left at the last line input; if there were none, +at the line before the addressed line. +This command differs from the +.I a +command only in the placement of the +text. +.TP 5 +( \fB.\fR\-1 , \fB. \fR)\|j +.PD 0 +.TP 5 +( \fB.\fR\-1 , \fB. \fR)\|j\|/replacement/ +.PD +The join command collapses all addressed lines into a single line by +deleting intermediate newlines. +The +.I replacement +(if any) is placed between joined lines. +Newlines, backslashes `\\', and slashes `/' within +.I replacement +must be preceded by a backslash. +Only slashes may delimit \fIreplacement\fP. +`\fB.\fP' is left at the resulting line. +NOTE: The join command in +.I qed +has a different default addressing from that in +.I ed. +.TP 5 +( \fB. \fR)\|k<bname> +The mark command marks the addressed line with +the given bname. +(The bname used in the mark has no relation to any buffer; +it is just a label.)\ +The address form `\*q<bname>' +then addresses this line. +`\fB.\fR' is not changed. +The marks are global to +.I qed\c +; marking a line `x' erases any previous mark `x' in any buffer. +.TP 5 +( \fB. \fR, \fB. \fR)\|l +The list command +prints the addressed lines in an unambiguous way: +a tab is printed as `\et', a backspace as `\\b', +a backslash as `\e\e', +a non-printing character is +printed as a backslash followed by three octal digits, +and a long line is folded, +with the second and subsequent sub-lines indented one tab stop. +If the last character in the line is a blank, +it is followed by `\\n'. +.TP 5 +( \fB. \fR, \fB. \fR)\|L +The \fIL\fP command +is similar to the \fIl\fP command, +but each line displayed is preceded by its line number, +any marks it has (which appear as `\*q\fIx\fR'), +and a tab. +.TP 5 +( \fB. \fR, \fB. \fR)\|m\fIa\fR +The move command repositions the addressed lines after the line +addressed by +\fIa\fP. +The last of the moved lines becomes the current line. +The address \fIa\fP can also be of the form +<bname>address, +in which case the text is moved after the address in the named +buffer. +The buffer to which the text was moved becomes the current buffer. +The original buffer (if different) has `\fB.\fR' left at the line before the moved lines. +.TP 5 +n +The names command displays the bname, +dollar +and \fIfilename\fR (in `l' format) of the current buffer and all active buffers. +If the buffer's changed flag is set, an apostrophe `\*q' is printed +after the bname. +The current buffer is indicated by a period `\fB.\fP' before the +dollar value. +If present, the +.I filename +is preceded by a tab. +.TP 5 +N +The \fIN\fP command is similar to the \fIn\fP command, +but the display is only given for those buffers +which have a \fIfilename\fP and for which the changed flag is set. +.TP 5 +o\fIps\fP +The option command allows various options to be set. +The first argument, \fIp\fP, +specifies which option is being set. +The rest of the command, \fIs\fP, +specifies the setting. +Most options can be either enabled or disabled; +\fIs\fP is `s' to set the option, +or `r' to reset it. +The following table describes the available options. +The default setting is shown after the option's letter. +.RS +.IP b22p 5 +Set the length and format of the page printed by the browse command. +Either the length or the format may be omitted. +.PD 0 +.IP "B<null string>" 5 +Set the default command sequence to be +performed when a newline command is typed at the terminal. +The command sequence is set by following the `B' with a newline-terminated +string. +If the string is null, the newline command resumes its default behaviour. +.IP cr 5 +Set the changed flag of the current buffer. +.IP dr 5 +Dualcase search mode +affects rule one of regular expression construction +so that a letter is matched without regard to its case. +.IP er 5 +Error exit mode causes +.I qed +to exit if an error occurs (see the DIAGNOSTICS section). +This option is mainly intended for use of qed in shell files. +.IP ir 5 +Interrupt catching mode causes +.I qed +to exit when interrupted. (This includes removing the temporary file). +.IP pr 5 +Prompting mode causes `*' to be typed +immediately before a command (as opposed to text) +is read from the terminal. +.IP qr 5 +Quit catching mode causes +.I qed +to dump core, leaving the temporary file intact, +when a QUIT signal is received. +.IP Tr 5 +Tracing mode causes +all commands not typed directly by the user to be echoed on the terminal. +When a special character (other than `\eB or `\eN') +is encountered, a `[' is typed, +followed by a code specifying the character \(em +`za' for register `a', `g' for global command list, +`l' for `\el', `B' for browse pseudo-register, etc. +Then, an `=' is typed, followed by the interpretation +of the special character, followed by a `]'. +.IP us 5 +Uppercase conversion mode enables case transformation in +substitute commands. +If the `u' flag is set, the character caret (`^') +becomes non-literal in the replacement text of a substitution. +It behaves just like `&', but with case switching of alphabetics +in the replaced text. +If the flag is `u', all alphabetics are mapped to upper case; +if `l', lower case; and if `s', the case is switched. +.IP vs 5 +Verbose mode causes character counts to be typed +after +\fIe\fP, +\fIr\fP, +\fIw\fP, +\fIR\fP, +\fIS\fP, +and +.I W +commands. +It also causes `!' to be typed upon completion of the \fI!\fR, +\fI<\fR, \fI|\fR and \fI>\fR commands. +.IP ?\fIc\fP 5 +\fIc\fP must be one of +`c', `d', `i', `p', `T' or `v'. +The value of the corresponding flag is stored in the truth. +.PD +.RE +.TP 5 +( \fB. \fR, \fB. \fR)\|p +The print command prints the addressed lines. +`\fB.\fR' is left at the last line printed. +.TP 5 +( \fB. \fR, \fB. \fR)\|P +The PRINT command is similar to the print command, +but each line displayed is preceded by its line number, +any marks it has (which appear as `\*q\fIx\fR'), +and a tab. +.TP 5 +q +The quit command causes +.I qed +to exit. +No automatic write +of a file is done. +If the changed flag is set +in any buffer, +.I qed +prints `?q' +and refuses to quit. +A second +.I q +or a +.I Q +will get out regardless, +as will an end-of-file +on the standard input. +.TP 5 +Q +Like +.IR q , +but changed flags +are not checked. +.TP 5 +( $ )\|r filename +The read command +reads in the given file after the addressed line. +If no \fIfilename\fP is given, +the remembered \fIfilename\fP is used +(see +.I e +and +.I f +commands). +The \fIfilename\fP is remembered if there was not already a +remembered \fIfilename\fP in the current buffer. +Address `0' is legal for +.I r +and causes the +file to be read at the beginning of the buffer. +If +.I qed +is in +.I verbose +mode and the read is successful, the number of characters +read is typed, +except while +.I qed +is starting up, +in which case an +.I f +command is performed. +`\fB.\fR' is left at the last line read in from the file. +.TP 5 +R filename +The restore command restores an environment saved by a save (\fIS\fR) command. +The changed flag in each buffer is restored from the files; all other flags +are unaffected. +The input stack is reset to the top (teletype input) level, +and the current buffer becomes `a'. +`\fB.\fP' is left at the saved value of `\fB.\fP' in buffer `a'\fB.\fP +If the \fIfilename\fP is not specified, `q' is used. +.TP 5 +( \fB. \fR, \fB. \fR)\|s\fIn\fR/regular expression/replacement/ +.PD 0 +.TP 5 +( \fB. \fR, \fB. \fR)\|s\fIn\fR/regular expression/replacement/g +.PD +The substitute command searches each addressed +line for occurrences of the specified regular expression. +The decimal number \fIn\fP defaults to 1 if missing. +On each line in which +.I n +matches are found, +the \fIn\fPth matched string is replaced with +\fIreplacement\fP. +If the global replacement indicator `g' follows the command, +all subsequent matches on the line are also replaced. +Within a line, a search starts from the character following the last match, +unless the last match was an empty string, +in which case the search starts at +the second character following the empty string +(to ensure a match is not repeated). +It is an error for the substitution to fail on all addressed lines +unless it is in a global command. +`\fB.\fR' is left at the last line substituted. +.PP +.RS +Any character other than newline or a numeral +may be used instead of `/' to delimit the regular expression +and \fIreplacement\fP. +If the trailing delimiter is missing +(i.e., an unescaped newline +in the +.IR replacement ), +its presence is assumed, +and the last line affected is printed, +as if the +substitute +was followed by a +.I p +command. +If delimiter following the expression +is omitted as well, +an empty +.I replacement +is assumed. +.PP +An ampersand `&' appearing in \fIreplacement\fP +is replaced by the string matching the regular expression. +As a more general feature, +the characters +`\\\fIn\fR', +where +.I n +is a digit, +are replaced by the text matched by the +\fIn\fR-th +regular subexpression +enclosed between `\e\|(' and `\e\|)'. +When nested parenthesized subexpressions are present, +.I n +is determined by counting occurrences of `\e\|(' starting from the left. +.PP +A caret `^' appearing in \fIreplacement\fP +behaves much like an ampersand, +but provides a mechanism for case switching of alphabetics, +as discussed under the \fIo\fR command. +To include an ampersand `&', caret `^', backslash `\\', newline, +or the delimiter literally in +\fIreplacement\fP, +the character must be preceded by a backslash. +Lines may be split by substituting newline characters into them. +.RE +.TP 5 +S filename +The save command saves the full buffer and register information in two +files called `filename:aq' and `filename:bq'. +If the filename is absent, `q' is used. +If the filename has more than 12 characters after the last slash `/', +it is truncated to 12 characters to avoid overwriting the file. +.TP 5 +( \fB.\fR , \fB.\fR )\|t\fIa\fR +The copy command acts just like the move +.I m +command except that a copy of the addressed lines is placed after address +\fIa\fP. +`\fB.\fR' is left on the last line of the copy. +The buffer to which the text was copied becomes the current buffer. +.TP 5 +u +The undo command restores the last line changed by a +\fIs\fP, +\fIu\fP, +or +.I x +command. +Any new lines created by splitting the original are left. +It is an error if the line is not in the current buffer. +`\fB.\fP' is left at the restored line. +.TP 5 +( 1 , $ )\|v/regular expression/command list +This command is the same as the global command +except that the command list is executed +with `\fB.\fR' initially set to every line +.I except +those +matching the regular expression. +.TP 5 +V/regular expression/command list +This command is the same as the globuf command +except that the command list is executed +with the current buffer initially set to every active buffer +.I except +those +matching the regular expression. +.TP 5 +( 1 , $ )\|w filename +The write command writes the addressed lines onto +the given file. +If the file does not exist, +it is created. +The filename is remembered if there was not already a +remembered file name in the current buffer. +If no file name is given, +the remembered file name is used. +`\fB.\fR' is unchanged. +If +.I qed +is in +.I verbose +mode and +the command is successful, the number of characters written is +typed. +.TP 5 +( 1 , $ )\|W +The \fIW\fP command is the same as the \fIw\fP command except that +the addressed lines are appended to the file. +.PP +.TP 5 +( \fB. \fR, \fB. \fR)\|x +.RS +The xform command allows one line at a time to be modified according to +graphical requests. +The line to be modified is typed out, +and then the modify request is read from the terminal +(even if the xform command is in a global command or other +nested input source). +Generally each character in the request specifies how to +modify the character immediately above it, in the original line, +as described in the following table. +.IP # 5 +Delete the above character. +.PD 0 +.IP % 5 +Replace the above character with a space. +.IP ^ 5 +Insert the rest of the request line before the above character. +If the rest of the request line is empty, insert a newline character. +.IP $ 5 +Delete the characters in the above line from this position on; +replace them with the rest of the request line. +.IP "space or tab:" 5 +Leave above character(s) unchanged. +.IP "any other:" 5 +This character replaces the one above it. +.PD +.PP +If the request line is longer than the line to be modified, +the overhang is added to the end of the line +without interpretation, +that is, without treating `#', `%', `^' or `$' specially. +Any characters after a `^' or `$' request are not interpreted either. +.PP +Xform will not process control characters other +than tab and newline, +except in contexts where it need not know their width +(that is, after a `^' or `$' request, or in the part of +either the request or the line that overhangs the other). +Remember that the ERASE character (processed by the system) +erases the last character typed, +not the last column. +.PP +Some characters take more than one column of the terminal +to enter or display. +For example, entering the ERASE or KILL characters literally +takes two columns because they must be escaped. +To delete a multi-column character, +one must type `#' under all its columns. +To replace a multicolumn character, +the replacement must be typed under the first column of the character. +Similarly, if a replacement character is multi-columned, +it replaces the character in its first column. +.PP +The tab character prints as a sequence of spaces, and may be +modified as if it were that sequence. +As long as the last space is unmodified, it and the +remaining contiguous spaces will represent a tab. +.PP +The modification process is repeated until the request is empty. +Only a newline may immediately follow the `x'. +.RE +.TP 5 +y<condition><type> +The jump command controls execution nested input sources. +The condition is compared to the truth flag to see if the jump +should be performed; +if a `t', the jump is performed if the truth flag is true, +if an `f', the jump is performed if the truth flag is false, +if absent the jump is always performed. +Several types of jumps exist: +.RS +.IP y[tf]o +Jump out of the current input source. +If the current input source is the command line +for a \fIg\fR, \fIG\fP, \fIv\fR, \fIV\fR or \fIh\fR command, the command is terminated. +.PD 0 +.IP y[tf]\fIN\fR +Control is transferred to absolute line \fIN\fR (an integer) +in the executing buffer. +The current input source must be a buffer. +.IP y[tf]\(aa<label> +Control is transferred to the first line found, +searching forward in the buffer, +that begins with a comment "<label>. +The match of the labels must be exact; +regular expressions are not used to define the control label. +(A tab, blank or newline after the double quote specifies a null label: +a line beginning `"\ \ LAB' cannot be transferred to by this form of jump.)\ +If no such label is found, +control resumes at the character after the label in the jump command. +The current input source must be a buffer. +.IP y[tf]\(ga<label> +Similar to `y\(aa<label>', +but the search is in the opposite (reverse) direction. +.IP y[tf] +If no +recognized type is given, +input is skipped up to the next newline. +.PD +.RE +.IP +It is an error if reading the label or line number for a jump command +causes the current input source (i.e. buffer) to be `popped.'\ +This can happen if the label is the last word in the buffer, +but can be circumvented by putting an extra blank or newline after +the jump command. +.TP 5 +( \fB.\fR , \fB.\fR )\|z\fIXc\fR +\fIQed\fP has 56 registers labeled by bnames. +Three of these, +registers `T', `C', and `U', +are reserved: +`T' is the truth flag, `C' is the count, +`U' contains the +.SM UNIX +command from the most recent +bang, crunch, zap, or pipe command. +The contents of register \fIX\fP, +where \fIX\fR is a bname, +can be inserted into the input +stream with the special character ``\ez\fIX\fP''. +The command ``z\fIX\fR'' +specifies register \fIX\fR +as the argument to +the operation character (signified above by \fIc\fR) that follows it. +In the description below, +\fIN\fR stands for a possibly signed decimal integer +and \fIS\fR stands for a newline-terminated string. +Newlines may be embedded in registers by escaping +them with a backslash. +Although some of the register commands refer to addressed lines, +`\fB.\fP' is unaffected by a +.I z +command. +The operations are as follows: +.RS +.IP p +Print the contents of the register in `p' format. +.PD 0 +.IP l +Print the contents of the register in `l' format. +.IP \fB.\fP +Set the register to the contents of the addressed line. +.IP /reg-exp/ +Set the register to the portion of +current line that matches the regular expression in slashes. +If no such pattern is found, +the register is cleared. +The truth flag is set according to whether a +match was found. +.IP \fB:\fR\fIS\fR +Set register to the string following the colon. +.IP \&\(aa\fIY\fR +Make a direct copy of register \fIY\fR in register \fIX\fR, +without interpreting special characters. +\fIY\fR is any register bname. +.IP +\fIN\fR +Increment by \fIN\fR the ASCII value of each character in the register. +Similarly, a `\-' decrements each character. +.IP =\fIS\fR +(Or `<' or `>' or `!=' or `!<' or `!>'.)\ +Set truth flag to the result of the lexical comparison +of the register and the string \fIS\fR. +.IP n +Set the count to the length of the register. +.IP )\|\fIN\fR +(Or '('.)\ +`Take' +the first \fIN\fR characters of the register, i.e. truncate at the \fIN\fR+1'th +character. +`(' (`drop') is the complementary operator; +it deletes the first \fIN\fP characters from the register. +If \fIN\fP is negative, the break point is |\|\fIN\fP| from the end. +.IP [/reg-exp/ +Set the count to the starting index of the regular expression in +the register. +Set the truth to whether the expression matches any of the register. +.IP s\fIn\fP/reg-exp/replacement/ +.IP s\fIn\fP/reg-exp/replacement/g +Perform a substitute command with semantics identical to the \fIs\fR command, +but in the text of the register, not a line of the buffer. +.IP C +`Clean' the register: collapse each occurrence of `white space' in the register +to a single blank, and delete initial and trailing white space. +.IP {\|\fIS\fR +Set the register to the value of the shell environment variable \fIS\fR, +whose name may be terminated by a space, tab, newline or `}'. +.PD +.PP +The registers can also be manipulated as decimal numbers. +Numerical operations are indicated by a number sign `#' +after the register name: +e.g. `zx#+2'. +It is an error to attempt to perform arithmetic on a +register containing non-numeric text other than a leading minus sign. +The numerical operations are: +.IP a +Set the value of the register to be the value of +the address given to the command; e.g. `$za#a' sets register `a' +to the number of lines in the buffer. +.PD 0 +.IP r +Set register \fIX\fR to be the first address +given the command, +and \fIX\fR+1 to be the second. If \fIX\fR is `~', an error is generated. +For example, `5,$zi#r' sets register `i' to 5, and +register `j' to the value of `$'. +`\fB.\fP' is unchanged. +This command is usually used to pass addresses to a command buffer. +.IP n +Set register to the length of the addressed line. +.IP \fB:\fIN\fR +Set register to \fIN\fR. +Scanning of the number stops at the first non-numeric character, +not at the end of the line. +.IP +\fIN\fR +Increment register by \fIN\fR. `\-', `*', `/', and `%' +decrement, multiply, divide, or modulo the register by \fIN\fR. +.IP P +Set register to the decimal value of the process id of +.I qed. +.IP =\fIN\fR +(Or `<' or `>' or `!=' or `!<' or `!>'.)\ +Set truth flag to the result of the numeric comparison of the register +and the number +.I N. +.PD +.PP +Several numerical operations may be combined in one command +(and it is more efficient to do so when possible.) +For example, `$zd#a\-3' sets register `d' to three less than the value +of `$'. +.RE +.TP 5 +Z +The zero command clears the current buffer. +The contents, filename and all flags for the buffer are zeroed. +The character after the `Z' must be a blank, tab or newline. +.TP 5 +( $ )\|= +The line number of the addressed line is typed. +`\fB.\fR' is unchanged. +.TP 5 +!\|<\s-2UNIX\s+2 command> +The bang command sends the +command line after the `!' +to the UNIX shell to be interpreted as a command. +Embedded newlines must be preceded by a backslash. +The signals INTR, QUIT, and HUP are enabled or disabled +as on entry to +\fIqed\fP. +At the completion of the command, +if +.I qed +is in +.I verbose +mode, an `!' is typed. +The return status of the command is stored in the truth flag. +`\fB.\fR' is unchanged. +.IP +The +command line +is stored in register `U'. +If a second `!' immediately follows the first, +it is replaced with the uninterpreted contents +of this register. +Thus `!!' repeats the most recent bang command, +and `!! \(or wc' +repeats the command with an additional pipeline element added. +.TP 5 +( 1 , $ )\|>\|<\s-2UNIX\s+2 command> +The zap command is similar +to the bang command, +but the addressed lines become the default standard input of the command. +The command is stored in register `U', +as for bang; +`>>' corresponds to `!!'. +.TP 5 +( $ )\|<\|<\s-2UNIX\s+2 command> +The crunch command is similar to the bang command, +but the standard output of the command is appended to the current buffer +after the addressed line, as though read with an \fIr\fR command +from a temporary file. +The command is stored in register `U' +as for bang; +`<<' corresponds to `!!'. +`\fB.\fP' is left at the last line read. +.TP 5 +( 1 , $ )\||\|<\s-2UNIX\s+2 command> +The pipe command is similar to the bang command, +but the addressed lines become the default standard input of the command, +and are replaced by the standard output of the command. +The command is stored in register `U' +as for bang; +`|\||' corresponds to `!!'. +If the command returns non-zero status, the original lines are not deleted. +`\fB.\fP' is left at the last line read. +.TP 5 +( \fB.\fR )" +The comment command sets dot to the addressed line, and ignores +the rest of the line up to the first following double quote or newline. +If, however, the character immediately after the double quote is +a second double quote (i.e. the command is ``""''), +the text which would normally be ignored is typed on the standard output. +Special characters in the text will be interpreted, whether or not +the text is printed, +so to print a message such as ``Type \\bx'' requires the command +``"\|"\|Type \\cbx''. +Commented lines are used as labels by the +.I y +(jump) command. +.TP 5 +% +The register print command displays the name and value of all defined +registers, +followed by the \\p (`P') and \\r (`R') pseudo-registers, +and the browse (`B') pseudo-register, if defined. +.TP 5 +# +The numeric register print command displays the name and value of all +defined registers with numeric values. +.TP 5 +( \fB.\fR+1 , \fB.\fR+1 )<newline> +An address or addresses alone on a line +cause the addressed lines to be printed. +If the last address separator before the newline was `;', +only the final addressed line is printed. +A blank line alone causes the contents of the +browse pseudo-register (described with the +.I o +command) to be executed. +If the register is null, as it is initially, +the newline command behaves as though the register contains +`\fB.\fP+1p'. +.PP +.ul +Special Characters +.PP +\fIQed\fP has some special character sequences with non-literal +interpretations. +These sequences are processed at the +.I lowest +level of input, so their interpretation is completely transparent +to the actual commands. +Whenever input from the user is expected, a special character can appear and +will be processed. +Special characters can be nested in the sense that, for example, +a buffer invoked by `\eb' can contain a register invocation `\e\|z'. +Backslashed escape sequences such as `\e\|(' in regular expressions +are +.I not +special characters, so are not interpreted at input. +The sequence `\e\|(' is left untouched by the input mechanism of +.I qed; +any special meaning it receives is given it during regular expression +processing. +The special characters are: +.RS +.IP \eb<bname> +The `b' must be followed by a bname. +When `\eb\fIX\fR' is typed, +the contents of buffer \fIX\fR, up to but \fInot including\fP the last +newline, are read as if they were entered from the keyboard. +Typically, the missing newline is replaced by the newline which +appears after the buffer invocation. +Changing the contents of an executing buffer may have bizarre effects. +.PD 0 +.IP \e\|B +Equivalent to current buffer's bname. +.IP \ec +The sequence \ec is replaced by a single backslash, +which is not re-scanned. +The effect of the `c' is to delay interpretation of a special +character. +.IP \e\|f +Equivalent to current buffer's file name. +.IP \e\|F<bname> +Equivalent to the file name in the named buffer. +.IP \e\|l +One line is read from the standard input up to, but \fInot including\fP +the terminal newline, which is discarded. +Note that the first invocation will read the remainder of the last +line entered from the keyboard. +For example, if a buffer is invoked by typing the line: +.br +.ti +5 +\ebxjunk +.br +the first \e\|l in buffer `x' will return the string `junk'. +.IP \e\|N +Equivalent to a newline. +Primarily useful when delayed. +.IP \ep +Equivalent to the most recent regular expression used. +.IP \e\|r +Equivalent to the replacement text of +the most recent substitute or join command. +.IP \e\|z<bname> +Equivalent to the contents of register `\e\|z\fIX\fR'. +If the register changes during execution, the changes appear immediately +and affect execution. +If a `+' (`\-') appears between the `z' and the bname, +the ASCII values of the characters in the register are +incremented (decremented) by one before interpretation. +If a `#' precedes the `+' (`\-') +the contents of the register are numerically incremented (decremented). +.IP \e" +The sequence \e" means `no character at all'! +It is primarily used to delay interpretation of a period +that terminates an append, until the second or third time +it is read (e.g. in loading execution buffers): +the sequence \ec"\fB.\fP at the beginning of a line +puts a period on the line which will terminate +an append the second time it is read. +.IP \e\*q[bfFlprz]\ +If an apostrophe +appears between the backslash and the identifying character +for one of the special characters `\eb', `\e\|f', `\e\|F', `\e\|l', `\e\|p', +`\e\|r' or `\e\|z', interpretation is as usual except that +any further special characters \fIembedded\fP +in the buffer, register, etc. are \fInot\fP interpreted. +Actually, any special character may be quoted, but in forms such as +`\e\*q\|B', the quote has no effect. +.RE +.PD +.PP +A special character is interpreted immediately when it appears +in the input stream, +whether it is currently coming from +the teletype, a buffer, a register, etc. +(This includes characters read when typing a special character: +`\e\*qb\eza', with register `a' containing the character `X', +invokes the literal contents of buffer `X'.)\ +Thus, interpretation is recursive unless the special character +is `\ec'. +Special characters appearing in text processed in a command such +as move, read or write, are \fInot\fP interpreted. +If the backslash-character pair is not a special character +from the above list, it is passed unchanged. +Interpretation may be delayed using `\ec'; for example, +if a `\ebx' is to be appended to a buffer for later interpretation, +the user must type `\ecbx'. +To delay interpretation \fIn\fP times, \fIn\fP c's must be placed between the +backslash and the identifying character. +In regular expressions and substitutes, +a backslash preceding a metacharacter turns off its special meaning. +Even in these cases, +a backslash preceding an ordinary character is not deleted, +unlike in \fIed\fP. +For example, since the `g' command must read its entire line, +a `\e\|zx' in a substitute driven by a global must be delayed +if the contents of the register are to be different for each line, +but since `\e&' is not a special character except to the substitute, +its interpretation need not be delayed: +.sp +.in +5 +zA#:1 +.br +g/\|\e$/ s\|/\|\e.xyz\|/\|\eczA \e&/p zA#+1 +.sp +.in +globally searches for lines with a literal currency sign, +and on each one substitutes for `.xyz' the contents +of register `A' +at the time of substitution, +followed by a space and a literal ampersand, +prints the result and increments register `A'. +As a second example, the substitute +.ti +5 +.sp +s\|/xyz\|/\|\e\e\|N&/ +.sp +replaces `xyz' with a newline followed by `xyz'. +Note that the `\e\e\|N' is interpreted as +`backslash followed by newline,' +as the sequence `\\\\' +.ft I +has no special meaning in qed +.ft R +outside of regular expressions +and replacement text. +However, +to match, say, `\e\e\|z' using a regular expression, it must be entered +as `\e\e\ecz'. +.PP +.PP +If an interrupt signal (ASCII DEL) is sent, +.I qed +prints `??' and returns to its command level. +If a hangup signal is received, +.I qed +executes the command `S qed.hup'. +.PP +Some size limitations: +512 characters per line, +256 characters per global command list, +1024 characters of string storage area, +used for storing registers, file names and regular expressions, +16 levels of input nesting, +and 128K characters in the temporary file. +The limit on the number of lines depends on the amount of core: +each line takes 1 word. +.SH FILES +/tmp/q#, temporary; +`#' is the process number (six decimal digits). +.SH DIAGNOSTICS +Diagnostics are in the form of `?' followed by a single letter code. +If the diagnostic is because of an inaccessible file, +the offending file name is also displayed. +If input is not from the highest level (i.e. the standard input, +usually the terminal), a traceback is printed, starting with the +lowest level. +The elements of the traceback +are of the form ?b\fIXM.N\fR or ?z\fIXN\fR, +where \fIX\fR is the buffer or register being executed when the +error was encountered, +\fIM\fR is the line number in the buffer and \fIN\fR is the character +number in the line or register. +The possible errors are: +.PD 0 +.IP 0 +non-zero status return in \fI|\fR command +.IP F +bad bname for \e\|F +.IP G +nested globuf commands +.IP N +last line of input did not end with newline +.IP O +unknown option in the \fIo?c\fP command +.IP R +restore (\fIR\fR) command failed +(file not found or bad format) +.IP T +I/O error or overflow in tempfile +.IP Z +out of string space; clear a few registers or file names +.IP a +address syntax +.IP b +bad bname in a \fIb\fR command or for \\b +.IP c +ran out of core +.IP f +filename syntax error +.IP g +nested global commands +.IP i +more than 52 files in initialization argument list +.IP k +bad bname in \fIk\fR command +.IP l +an internal table length was exceeded +.IP m +tried to move to an illegal place (e.g. 1,6m4) +.IP o +error opening or creating a file +.IP p +bad regular expression (pattern) syntax +.IP q +.I e +with the current changed flag set, +or +.I q +with any changed flag set +.IP r +read error from file +.IP s +no substitutions found +.IP t +bad \fIx\fR command data or single-case terminal +.IP u +no line for \fIu\fR command to undo +.IP x +command syntax error +.IP w +write error on file +.IP y +bad jump command (including popping the input buffer while scanning the label) +.IP z +bad register bname +.IP | +failure to create pipe for \fI<\fR, \fI|\fR or \fI>\fR command +.IP # +bad numeric register operation +.IP $ +line address out of range +.IP ? +interrupt +.IP / +line search failed +.IP [ +bad index in a register take or drop command +.IP \e +attempt to recursively append a buffer +.IP ! +jackpot \(em you found a bug in regular expression matching +.PD +.PP +.SH "SEE ALSO" +qedbufs(1) +.br +A Tutorial Introduction to the ED Text Editor +(B. W. Kernighan) +.br +Programming in +.IR Qed : +a Tutorial +(Robert Pike) +.br +ed(1) +.SH "U of T INFO" +Written at U of T, +based on several incarnations of +.I ed, +with contributions from +Tom Duff, Robert Pike, Hugh Redelmeier and David Tilbrook. +.SH BUGS +The changed flag is not omniscient; changing the contents of +the file outside of +.I qed +will fool it. +.br +Xform \fIcould\fP work on single-case terminals, but backslashes +become very confusing for the user. +.br +On the PDP-11, numeric registers are 16-bit integers, but the +count is a 32-bit integer. |
