Annotation of 43BSDTahoe/ucb/lisp/doc/ch16.n, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1980 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)ch16.n      6.2 (Berkeley) 5/14/86
                      6: .\"
                      7: ." $Header: /na/franz/doc/RCS/ch16.n,v 1.1 83/01/31 07:08:55 jkf Exp $
                      8: .Lc The\ LISP\ Editor 16
                      9: 
                     10: .sh 2 The\ Editors \n(ch 1
                     11: 
                     12: It is quite possible to use VI, Emacs or other standard editors to edit your
                     13: lisp programs, and many people do just that.
                     14: However there is a lisp
                     15: structure editor which is particularly good for the editing
                     16: of lisp programs, and operates in a rather different fashion, namely
                     17: within a lisp environment.
                     18: application.  It
                     19: is handy to know how to use it for fixing problems without exiting
                     20: from the lisp system (e.g. from the debugger
                     21: so you can continue to execute rather than having to start over.)  The
                     22: editor is not quite like the top-level and debugger, in that it expects
                     23: you to type editor commands to it.  It will not evaluate whatever you
                     24: happen to type.  (There is an editor command to evaluate things, though.)
                     25: 
                     26: The editor is available (assuming your system is set up correctly with
                     27: a lisp library) by typing (load 'cmufncs) and (load 'cmuedit).
                     28: 
                     29: The  most  frequent  use of the editor is to change function
                     30: definitions by starting the editor with one of the commands described in
                     31: section 16.14. (see \fIeditf\fP), values (\fIeditv\fP), properties
                     32: (\fIeditp\fP), and  expressions  (\fIedite\fP).  The beginner  is
                     33: advised to start with the following (very basic) commands: \fIok,
                     34: undo, p, #\fP, under which are explained two different basic commands
                     35: which  start with numbers, and f.  
                     36: 
                     37: This documentation, and the editor, were imported from PDP-10 CMULisp
                     38: by Don Cohen.  PDP-10 CMULisp is based on UCILisp, and the editor
                     39: itself was derived from an early version of Interlisp.  Lars
                     40: Ericson, the author of this section,
                     41: has provided this very concise summary.
                     42: Tutorial examples and implementation details
                     43: may be found in the Interlisp Reference Manual,
                     44: where a similar editor is described.
                     45: 
                     46: .sh 2 Scope\ of\ Attention
                     47: 
                     48: Attention-changing commands allow you to look at a different
                     49: part of a Lisp expression you are editing.
                     50: The sub-structure upon which the editor's attention is
                     51: centered is called "the current expression".   Changing the
                     52: current expression means shifting attention and not actually modifying
                     53: any structure.
                     54: .Fb
                     55: .fi
                     56: \fISCOPE OF ATTENTION COMMAND SUMMARY\fP
                     57: 
                     58: \fIn (n>0) \fP. Makes the nth element of the current expression be the
                     59: new current expression.
                     60: 
                     61: \fI-n (n>0)\fP. Makes the nth element from the end of the current
                     62: expression be the new current expression.  
                     63: 
                     64: \fI0\fP. Makes the  next  higher expression  be  the  new  correct
                     65: expression.  If the intention is to go back to the next higher left
                     66: parenthesis, use the command !0.
                     67: 
                     68: \fIup\ \fP.  If a p command would cause the editor to
                     69: type ...  before typing the current expression, (the current
                     70: expression is a tail of the next higher expression) then has no effect;
                     71: else, up makes the old current expression the first element in the new
                     72: current expression.
                     73: 
                     74: \fI!0 \fP. Goes back to the next higher left parenthesis.
                     75: 
                     76: \fI^\ \fP.
                     77: Makes the top level expression be the current expression.  
                     78: 
                     79: \fInx\ \fP.
                     80: Makes the current expression be the next expression.  
                     81: 
                     82: \fI(nx n)\fP equivalent to n nx commands.
                     83: 
                     84: \fI!nx \fP.  Makes current expression be the next
                     85: expression at a higher level.  Goes through any number of right
                     86: parentheses to get to the next expression.
                     87: 
                     88: \fI bk\ \fP.
                     89: Makes the current expression be the previous expression in the next
                     90: higher expression.  
                     91: 
                     92: \fI(nth n) n>0 \fP.  Makes the list starting with
                     93: the nth element of the current expression be the current expression.
                     94: 
                     95: \fI(nth $) - generalized nth command.\fP nth locates $, and then backs
                     96: up to the current level, where the new current expression is the tail
                     97: whose first element contains, however deeply, the expression that was
                     98: the terminus of the location operation.
                     99: 
                    100: \fI:: \fP.  (pattern ::  .  $)  e.g., (cond ::
                    101: return).  finds a cond that contains a return, at any depth.
                    102: 
                    103: \fI(below com x) \fP.  The below command is useful for
                    104: locating a substructure by specifying something  it contains.  (below
                    105: cond) will cause the cond clause containing  the current  expression to
                    106: become the new current expression.  Suppose you are editing a list
                    107: of lists, and want to find a sublist that contains a foo (at any
                    108: depth).  Then simply executes f foo (below \).
                    109: 
                    110: \fI(nex x) \fP.  same as \fI(below x)\fP followed by
                    111: nx.  For example, if you are deep inside of a selectq clause, you
                    112: can advance to the next clause with \fI(nex selectq)\fP.
                    113: 
                    114: \fInex\fP.  The  atomic  form  of  \fInex\fP is useful
                    115: if you will be performing repeated  executions  of  \fI(nex  x)\fP.  By
                    116: simply  marking  the  chain corresponding to x,  you can use \fInex\fP to step
                    117: through the sublists.  
                    118: .Fe
                    119: .br
                    120: .sh 2 Pattern\ Matching\ Commands
                    121: 
                    122: Many editor commands that search take patterns.
                    123: A pattern \fIpat\fP matches with x if:
                    124: .Fb
                    125: .fi
                    126: \fIPATTERN SPECIFICATION SUMMARY\fP
                    127: 
                    128: - \fIpat\fP is \fIeq\fP to x.  
                    129: 
                    130: - \fIpat\fP is &.  
                    131: 
                    132: - \fIpat\fP is a number and equal to x.  
                    133: 
                    134: - if (car \fIpat\fP) is the atom *any*, (cdr \fIpat\fP) is a list of patterns, and
                    135: \fIpat\fP matches x if and only if one of the patterns on (cdr \fIpat\fP) matches x.
                    136: 
                    137: - if \fIpat\fP is a literal atom or string, and (nthchar \fIpat\fP -1) is @, then
                    138: \fIpat\fP matches with any literal atom or string which has the same initial
                    139: characters as \fIpat\fP, e.g.  ver@ matches with verylongatom, as well as
                    140: "verylongstring".
                    141: 
                    142: - if (car \fIpat\fP) is the atom --, \fIpat\fP matches x if (a) (cdr \fIpat\fP)=nil, i.e.
                    143: \fIpat\fP=(--), e.g., (a --) matches (a) (a b c) and (a .  b) in other words,
                    144: -- can match any tail of a list.  (b) (cdr \fIpat\fP) matches with some tail
                    145: of x, e.g.  (a -- (&)) will match with (a b c (d)), but not (a b c d),
                    146: or (a b c (d) e).  however, note that (a -- (&) --) will match with (a b
                    147: c (d) e).  in other words, -- will match any interior segment of a list.
                    148: 
                    149: - if (car \fIpat\fP) is the atom ==, \fIpat\fP matches x if and only if (cdr \fIpat\fP)
                    150: is \fIeq\fP to x.  (this pattern is for use by programs that call the editor
                    151: as a subroutine, since any non-atomic expression in a command typed in
                    152: by the user obviously cannot be \fIeq\fP to existing structure.)
                    153: - otherwise if x is a list, \fIpat\fP matches x if (car \fIpat\fP) matches (car
                    154: x), and (cdr \fIpat\fP) matches (cdr x).
                    155: 
                    156: - when searching, the pattern matching routine is called only to match
                    157: with elements in the structure, unless the pattern begins with :::, in
                    158: which case cdr of the pattern is matched against tails in the
                    159: structure.  (in this case, the tail does not have to be a proper tail,
                    160: e.g.  (:::  a --) will match with the element (a b c) as well as with cdr
                    161: of (x a b c), since (a b c) is a tail of (a b c).)   
                    162: .Fe
                    163: .sh 3 Commands\ That\ Search
                    164: .Fb
                    165: .fi
                    166: \fISEARCH COMMAND SUMMARY\fP
                    167: 
                    168: \fIf pattern \fP.  f informs the editor that the next
                    169: command is to be interpreted as a pattern.  If no pattern is given on
                    170: the same line as the f then the last pattern is used.  f pattern means
                    171: find the next instance of pattern.
                    172: 
                    173: \fI(f pattern n)\fP.  Finds the next instance of pattern.
                    174: 
                    175: \fI(f pattern t)\fP.  similar to f pattern, except, for example, if the
                    176: current expression is (cond ..), f cond will look for the next cond,
                    177: but (f cond t) will 'stay here'.
                    178: 
                    179: \fI(f pattern n) n>0\fP.  Finds the nth place that pattern matches.
                    180: If the current expression is (foo1 foo2 foo3), (f f00@ 3) will find foo3.
                    181: 
                    182: \fI(f pattern) or (f pattern nil)\fP.  only matches with elements at
                    183: the top level of the current expression.  If the current expression is
                    184: \fI(prog nil (setq x (cond & &)) (cond &) ...)\fP f (cond --) will find
                    185: the cond inside the setq, whereas (f (cond --)) will find the top level
                    186: cond, i.e., the second one.
                    187: 
                    188: \fI(second . $) \fP.
                    189: same as (lc .  $) followed by another (lc .  $) except that if the
                    190: first succeeds and second fails, no change is made to the edit chain.
                    191: 
                    192: \fI(third . $) \fP.  Similar to second.
                    193: 
                    194: \fI(fs pattern1 ... patternn) \fP.
                    195: equivalent to f pattern1 followed by f pattern2 ...  followed by f
                    196: pattern n, so that if f pattern m fails, edit chain is left at place
                    197: pattern m-1 matched.
                    198: 
                    199: \fI(f= expression x) \fP.  Searches for a structure eq
                    200: to expression.
                    201: 
                    202: \fI(orf pattern1 ... patternn) \fP.  Searches for an
                    203: expression that is matched by either pattern1 or ...  patternn.
                    204: 
                    205: \fIbf pattern \fP.  backwards find.   If the current
                    206: expression is \fI(prog nil (setq x (setq y (list z))) (cond ((setq w
                    207: --) --)) --)\fP f list followed by bf setq will leave the current
                    208: expression as (setq y (list z)), as will f cond followed by bf setq
                    209: 
                    210: \fI(bf pattern t)\fP. backwards find.  Search always includes current
                    211: expression, i.e., starts at end of current expression and works
                    212: backward, then ascends and backs up, etc.
                    213: .Fe
                    214: .sh 4 Location\ Specifications
                    215: .
                    216: Many editor commands use a 
                    217: method of specifying position called a location specification.  The
                    218: meta-symbol $ is used to denote a location specification.   $ is a
                    219: list of commands interpreted as described above.  $ can also be atomic,
                    220: in which case it is interpreted as (list $).  a location specification
                    221: is a list of edit commands that are executed in the normal fashion with
                    222: two exceptions.  first, all commands not recognized by the editor are
                    223: interpreted as though they had been preceded by f.  
                    224: The location specification
                    225: (cond 2 3) specifies the 3rd element in the first clause of the next
                    226: cond.
                    227: 
                    228: the if command and the ## function provide a way of using in location
                    229: specifications arbitrary predicates applied to elements in the current
                    230: expression.
                    231: 
                    232: In insert, delete, replace and change, if $ is nil (empty), the
                    233: corresponding operation is performed on the current edit chain, i.e.
                    234: (replace with (car x)) is equivalent to (:(car x)).  for added
                    235: readability, here is also permitted, e.g., (insert (print x) before
                    236: here) will insert (print x) before the current expression (but not
                    237: change the edit chain).  It is perfectly legal to ascend to insert,
                    238: replace, or delete.  for example (insert (\fIreturn\fP) after ^ prog
                    239: -1) will go to the top, find the first prog, and insert a
                    240: (\fIreturn\fP) at its end, and not change the current edit chain.
                    241: 
                    242: The a, b, and :  commands all make special checks in e1 thru em for
                    243: expressions of the form (## . coms).  In this case, the expression used
                    244: for inserting or replacing is a copy of the current expression after
                    245: executing coms, a list of edit commands.   (insert (## f cond -1 -1)
                    246: after3)  will make a copy of the last form in the last clause of the
                    247: next cond, and insert it after the third element of the current 
                    248: expression.
                    249: 
                    250: \fI$\fP.  In descriptions of the editor, the meta-symbol $ is used to
                    251: denote a location specification.   $ is a list of commands interpreted
                    252: as described above.  $ can also be atomic.
                    253: .Fb
                    254: .fi
                    255: \fILOCATION COMMAND SUMMARY\fP
                    256: 
                    257: \fI(lc . $) \fP.
                    258: Provides a way of explicitly invoking the location operation.
                    259: (lc cond 2 3) will perform search.
                    260: 
                    261: \fI(lcl . $) \fP.  Same as lc except search is confined
                    262: to current expression.  To find a cond containing a \fIreturn\fP, one
                    263: might use the location specification (cond (lcl \fIreturn\fP) \) where
                    264: the \ would reverse the effects of the lcl command, and make the final
                    265: current expression be the cond.
                    266: .Fe
                    267: .sh 3 The\ Edit\ Chain
                    268: The edit-chain is a list of which the first element is the the one you
                    269: are now editing ("current expression"), the next element is what would
                    270: become the current expression if you were to do a 0, etc., until the
                    271: last element which is the expression that was passed to the editor.
                    272: .Fb
                    273: .fi
                    274: \fIEDIT CHAIN COMMAND SUMMARY\fP
                    275: 
                    276: \fImark \fP.
                    277: Adds the current edit chain to the front of the list marklst.
                    278: 
                    279: \fI_ \fP.
                    280: Makes the new edit chain be (car marklst).  
                    281: 
                    282: \fI(_ pattern) \fP.  Ascends the edit chain looking for
                    283: a link which matches pattern.  for example:
                    284: 
                    285: \fI__ \fP.
                    286: Similar to _ but also erases the mark.
                    287: 
                    288: \fI\\ \fP. Makes the edit chain be the value of unfind.
                    289: unfind is set to the current edit chain by each command that makes a
                    290: "big jump", i.e., a command that usually performs more than a single
                    291: ascent or descent, namely ^, _, __, !nx, all commands that involve a
                    292: search, e.g., f, lc, ::, below, et al and \ and \p themselves.     if
                    293: the user types f cond, and then f car, \ would take him back to the
                    294: cond.  another \ would take him back to the car, etc.
                    295: 
                    296: \fI\\p \fP.  Restores the edit chain to its state as of
                    297: the last print operation.  If the edit chain has not changed since the
                    298: last printing, \\p restores it to its state as of the printing before
                    299: that one.  If the user types p followed by 3 2 1 p, \\p will return to
                    300: the first p, i.e., would be equivalent to 0 0 0.  Another \\p would
                    301: then take him back to the second p.
                    302: .Fe
                    303: .sh 2 Printing\ Commands
                    304: .Fb
                    305: .fi
                    306: \fIPRINTING COMMAND SUMMARY\fP
                    307: 
                    308: \fIp \fP Prints current expression in abbreviated
                    309: form.  (p m) prints mth element of current expression in abbreviated
                    310: form.  (p m n) prints mth element of current expression as though
                    311: printlev were given a depth of n.  (p 0 n) prints current expression as
                    312: though printlev were given a depth of n.  (p cond 3) will work.
                    313: 
                    314: \fI?  \fP.  prints the current expression as though
                    315: printlev were given a depth of 100.
                    316: 
                    317: \fIpp \fP.  pretty-prints the current expression.
                    318: 
                    319: \fIpp*\fP.  is like pp, but forces comments to be shown.
                    320: .Fe
                    321: .sh 2 Structure\ Modification\ Commands
                    322: 
                    323: All structure modification commands are undoable.  See \fIundo\fP.
                    324: 
                    325: .Fb
                    326: .fi
                    327: \fISTRUCTURE MODIFICATION COMMAND SUMMARY\fP
                    328: 
                    329: \fI# [editor commands]\fP (n)  n>1 deletes the
                    330: corresponding element from the current expression.
                    331: 
                    332: \fI(n e1 ...  em) n,m>1\fP replaces the nth element in the current
                    333: expression with e1 ...  em.
                    334: 
                    335: \fI(-n e1 ...  em) n,m>1\fP inserts e1 ...  em before the n element in the
                    336: current expression.
                    337: 
                    338: \fI(n e1 ...  em)\fP (the letter "n" for "next" or "nconc", not a number)
                    339: m>1 attaches e1 ...  em at the end of the current expression.
                    340: 
                    341: \fI(a e1 ... em) \fP.  inserts e1 ...  em after the
                    342: current expression (or after its first element if it is a tail).
                    343: 
                    344: \fI(b e1 ... em) \fP.  inserts e1 ...  em before the
                    345: current expression.  to insert foo before the last element in the
                    346: current expression, perform -1 and then (b foo).
                    347: 
                    348: \fI(: e1 ... em) \fP.  replaces the current expression
                    349: by e1 ...  em.    If the current expression is a tail then replace its
                    350: first element.
                    351: 
                    352: \fIdelete or (:)  \fP.  deletes the current expression,
                    353: or if the current expression is a tail, deletes its first element.
                    354: 
                    355: \fI(delete . $)\fP.  does a (lc .  $) followed by delete.  current edit
                    356: chain is not changed.
                    357: 
                    358: \fI(insert e1 ... em before . $) \fP.  similar to (lc.
                    359: $) followed by (b e1 ... em).
                    360: 
                    361: \fI(insert e1 ...  em after .  $)\fP.  similar to insert before except
                    362: uses a instead of b.
                    363: 
                    364: \fI(insert e1 ...  em for .  $)\fP.  similar to insert before except
                    365: uses :  for b.
                    366: 
                    367: \fI(replace $ with e1 ... em) \fP.  here $ is the
                    368: segment of the command between replace and with.  
                    369: 
                    370: \fI(change $ to e1 ... em) \fP.  same as replace with.
                    371: .Fe
                    372: .sh 2 Extraction\ and\ Embedding\ Commands
                    373: .Fb
                    374: .fi
                    375: \fIEXTRACTION AND EMBEDDING COMMAND SUMMARY\fP
                    376: 
                    377: \fI(xtr . $) \fP.  replaces the original current
                    378: expression with the expression that is current after performing (lcl . $).
                    379: 
                    380: \fI(mbd x) \fP.  x is a list, substitutes the current
                    381: expression for all instances of the atom * in x, and replaces the
                    382: current expression with the result of that substitution.  (mbd x) :  x
                    383: atomic, same as (mbd (x *)).
                    384: 
                    385: \fI(extract $1 from $2) \fP.  extract is an editor
                    386: command which replaces the current expression with one of its
                    387: subexpressions (from any depth).  ($1 is the segment between extract
                    388: and from.)    example:  if the current expression is (print (cond
                    389: ((null x) y) (t z))) then following (extract y from cond), the current
                    390: expression will be (print y).  (extract 2 -1 from cond), (extract y
                    391: from 2), (extract 2 -1 from 2) will all produce the same result.
                    392: 
                    393: \fI(embed $ in . x) \fP.  embed replaces the current
                    394: expression with a new expression which contains it as a subexpression.
                    395: ($ is the segment between embed and in.)   example:  (embed print in
                    396: setq x), (embed 3 2 in \fIreturn\fP), (embed cond 3 1 in (or * (null x))). 
                    397: .Fe
                    398: .sh 2 Move\ and\ Copy\ Commands
                    399: .Fb
                    400: .fi
                    401: \fIMOVE AND COPY COMMAND SUMMARY\fP
                    402: 
                    403: \fI(move $1 to com . $2) \fP.  ($1 is the segment
                    404: between move and to.)  where com is before, after, or the name of a
                    405: list command, e.g., :, n, etc.  If $2 is nil, or (here), the current
                    406: position specifies where the operation is to take place.  If $1 is nil,
                    407: the move command allows the user to specify some place the current
                    408: expression is to be moved to.   if the current expression is (a b d c),
                    409: (move 2 to after 4) will make the new current expression be (a c d b).
                    410: 
                    411: \fI(mv com . $) \fP.  is the same as (move here to com . $).
                    412: 
                    413: \fI(copy $1 to com . $2)\fP  is like move except that the source
                    414: expression is not deleted.
                    415: 
                    416: \fI(cp com . $)\fP.  is like mv except that the source expression is
                    417: not deleted.
                    418: .Fe
                    419: .sh 2 Parentheses\ Moving\ Commands
                    420: The commands presented in this section permit modification of the
                    421: list structure itself, as opposed to modifying components thereof.
                    422: their effect can be described as inserting or removing a single left or
                    423: right parenthesis, or pair of left and right parentheses.  
                    424: .Fb
                    425: .fi
                    426: \fIPARENTHESES MOVING COMMAND SUMMARY\fP
                    427: 
                    428: \fI(bi n m) \fP.  both in.  inserts parentheses before
                    429: the nth element and after the mth element in the current expression.
                    430: example:  if the current expression is (a b (c d e) f g), then (bi 2 4)
                    431: will modify it to be (a (b (c d e) f) g).  (bi n) :  same as (bi n n).
                    432: example:  if the current expression is (a b (c d e) f g), then (bi -2)
                    433: will modify it to be (a b (c d e) (f) g).
                    434: 
                    435: \fI(bo n) \fP.  both out.  removes both parentheses
                    436: from the nth element.  example:  if the current expression is (a b (c d
                    437: e) f g), then (bo d) will modify it to be (a b c d e f g).
                    438: 
                    439: \fI(li n) \fP.  left in.  inserts a left parenthesis
                    440: before the nth element (and a matching right parenthesis at the end of
                    441: the current expression).  example:  if the current expression is (a b
                    442: (c d e) f g), then (li 2) will modify it to be (a (b (c d e) f g)).
                    443: 
                    444: \fI(lo n) \fP.  left  out.  removes  a  left
                    445: parenthesis  from the nth element. all elements following the nth
                    446: element are deleted.  example: if the current expression is (a b (c d
                    447: e) f g), then  (lo  3) will modify it to be (a b c d e).
                    448: 
                    449: \fI(ri n m) \fP.  right  in.  move  the  right
                    450: parenthesis at the end of the nth element in to after the mth element.
                    451: inserts  a  right parenthesis  after  the mth element of the nth
                    452: element.  The rest of the nth element is brought up to the level of
                    453: the  current expression.   example: if the current expression is (a (b
                    454: c d e) f g), (ri 2 2) will modify it to be (a (b c) d e f g).
                    455: 
                    456: \fI(ro n) \fP.  right  out.  move the right parenthesis
                    457: at the end of the nth element out to the  end of the current
                    458: expression.  removes the right parenthesis from the nth element, moving
                    459: it to the end of the current expression. all elements following the
                    460: nth  element  are moved  inside of  the  nth element.  example: if the
                    461: current expression is (a b (c d e) f  g),  (ro  3) will modify  it to
                    462: be (a b (c d e f g)).
                    463: 
                    464: \fI(r x y) \fP replaces  all  instances  of x by y in
                    465: the current expression, e.g., (r caadr cadar).  x can be the
                    466: s-expression (or atom) to be substituted for, or can be a pattern which
                    467: specifies that s-expression (or atom).
                    468: 
                    469: \fI(sw n m) \fP switches the nth and mth elements of
                    470: the current expression.  for example, if the current expression is
                    471: (list (cons (car x) (car y)) (cons (cdr y))),  (sw  2 3)  will  modify
                    472: it to be (list (cons (cdr x) (cdr y)) (cons (car x) (car y))).   (sw
                    473: car  cdr) would produce the same result.
                    474: .Fe
                    475: .sh 3 Using\ to\ and\ thru
                    476: 
                    477: to, thru, extract, embed, delete, replace, and move can be made to
                    478: operate on several contiguous elements, i.e., a segment of a list, by
                    479: using the to or thru command in their respective location
                    480: specifications.  thru and to are intended to be used  in conjunction
                    481: with extract, embed, delete, replace, and move.    to and thru can also
                    482: be used directly with xtr (which takes after a location specification),
                    483: as in (xtr (2 thru 4)) (from the current expression).
                    484: .Fb
                    485: .fi
                    486: \fITO AND THRU COMMAND SUMMARY\fP
                    487: 
                    488: \fI($1 to $2)   \fP.  same as thru except last element
                    489: not included.
                    490: 
                    491: \fI($1 to)\fP.  same as ($1 thru -1)
                    492: 
                    493: \fI($1 thru $2)  \fP.  If the current expression is (a
                    494: (b (c d) (e) (f g h) i) j k), following (c thru g), the current
                    495: expression will be ((c d) (e) (f g h)).  If both $1 and $2 are numbers,
                    496: and $2 is greater than $1, then $2 counts from the beginning of the
                    497: current expression, the same as $1.  in other words, if the current
                    498: expression is (a b c d e f g), (3 thru 4) means (c thru d), not (c thru
                    499: f).  in this case, the corresponding bi command is (bi 1 $2-$1+1).
                    500: 
                    501: \fI($1 thru)\fP. same as \fI($1 thru -1)\fP.
                    502: .Fe
                    503: .sh 2 Undoing\ Commands
                    504: each command that causes structure modification automatically adds an
                    505: entry to the front of undolst containing the information required to
                    506: restore all pointers that were changed by the command.  The undo
                    507: command undoes the last, i.e., most recent such command.
                    508: .Fb
                    509: .fi
                    510: \fIUNDO COMMAND SUMMARY\fP
                    511: 
                    512: \fIundo \fP.  the undo command undoes most recent, structure
                    513: modification command that has not yet been undone, and prints the name
                    514: of that command, e.g., mbd undone.  The edit chain is then exactly what
                    515: it was before the 'undone' command had been performed.
                    516: 
                    517: \fI!undo \fP.  undoes all modifications performed during this editing
                    518: session, i.e., this call to the editor.
                    519: 
                    520: \fIunblock \fP.  removes  an  undo-block. If executed at a non-blocked
                    521: state, i.e., if undo or !undo could operate, types not blocked.
                    522: 
                    523: \fItest \fP.  adds an undo-block at the front of undolst.  note  that
                    524: test  together  with !undo  provide  a  'tentative'  mode  for editing,
                    525: i.e., the user can perform a number of changes, and then undo all of
                    526: them with a single !undo command.
                    527: 
                    528: \fIundolst [value]\fP.  each editor command that causes structure
                    529: modification automatically adds an entry to the front of undolst
                    530: containing the information required to restore all pointers that were
                    531: changed by the command.
                    532: 
                    533: \fI??  \fP prints the entries on undolst.  The entries are listed most
                    534: recent entry first.
                    535: .Fe
                    536: .sh 2 \Commands\ that\ Evaluate
                    537: .Fb
                    538: .fi
                    539: \fIEVALUATION COMMAND SUMMARY\fP
                    540: 
                    541: \fIe \fP.  only when typed in, (i.e., (insert d before e) will treat
                    542: e  as  a  pattern) causes  the  editor  to  call  the lisp interpreter
                    543: giving it the next input as argument.
                    544: 
                    545: \fI(e  x)\fP  evaluates  x, and prints the result.  (e x t) same as (e
                    546: x) but does not print.  
                    547: 
                    548: \fI(i c x1 ... xn) \fP same as (c y1 ...  yn) where yi=(eval xi).
                    549: example:  (i 3 (cdr foo)) will replace the 3rd element of the current
                    550: expression with the cdr of the value of foo.  (i n foo (car fie)) will
                    551: attach the value of foo and car of the value of fie to the end of the
                    552: current expression.  (i f= foo t) will search for an expression eq to
                    553: the value of foo.  If c is not an atom, it is evaluated as well.
                    554: 
                    555: \fI(coms x1 ... xn) \fP.  each  xi  is evaluated and its value executed
                    556: as a command.  The i command is not very convenient for computing an
                    557: entire edit command for  execution,  since it computes the command name
                    558: and its arguments separately. also, the i command cannot be used to
                    559: compute an  atomic  command.  The  coms  and comsq  commands provide
                    560: more  general ways of computing commands.  (coms (cond (x (list 1 x))))
                    561: will replace the first element of the current expression with the value
                    562: of x if non-nil, otherwise do nothing. (nil as a command is a nop.)
                    563: 
                    564: \fI(comsq com1 ... comn) \fP.  executes com1 ... comn.  comsq is mainly
                    565: useful in conjunction with the  coms command.    for example,  suppose
                    566: the user wishes to compute an entire list of commands for evaluation,
                    567: as opposed to computing each command one at a time  as does  the coms
                    568: command. he would then write (coms (cons (quote comsq) x)) where x
                    569: computed the list of commands, e.g.,  (coms  (cons  (quote comsq)
                    570: (get  foo (quote commands))))
                    571: .Fe
                    572: .sh 2 Commands\ that\ Test
                    573: .Fb
                    574: .fi
                    575: \fITESTING COMMAND SUMMARY\fP
                    576: 
                    577: \fI(if x) \fP generates an error unless the value of (eval x) is
                    578: non-nil, i.e., if (eval x) causes an error or (eval x)=nil, if will
                    579: cause an error.  (if x coms1 coms2) if (eval  x) is non-nil, execute
                    580: coms1; if (eval x) causes an error or is equal to nil, execute coms2.
                    581: (if x coms1)  if  (eval  x)  is  non-nil,  execute  coms1; otherwise
                    582: generate  an  error.
                    583: 
                    584: \fI(lp . coms) \fP.  repeatedly executes coms, a list of commands,
                    585: until an  error  occurs.      (lp  f  print (n  t))  will  attach  a
                    586: t  at the end of every print expression. (lp f print (if (## 3) nil ((n
                    587: t)))) will attach a t at the end  of each print expression which does
                    588: not already have a second argument.  (i.e.  the form  (## 3) will cause
                    589: an error if the edit command 3 causes an error, thereby selecting ((n
                    590: t)) as the list of commands to be executed.  The if could also  be
                    591: written  as  (if  (cddr (##)) nil ((n t))).).
                    592: 
                    593: \fI(lpq . coms) \fP same as lp but does not print n occurrences.
                    594: 
                    595: \fI(orr coms1 ... comsn) \fP.  orr begins by executing coms1, a list of
                    596: commands.  If no error occurs, orr is finished.  otherwise, orr
                    597: restores the edit chain to  its  original  value,  and continues by
                    598: executing coms2, etc.  If none of the command lists execute without
                    599: errors,  i.e., the orr "drops off the end", orr generates an error.
                    600: otherwise, the edit chain is left as of the completion of the first
                    601: command  list  which executes  without error.
                    602: .Fe
                    603: .sh 2 Editor\ Macros
                    604: 
                    605: Many of the more sophisticated branching commands in the editor, such
                    606: as orr, if,  etc.,  are  most  often  used  in  conjunction with edit
                    607: macros.  The macro feature permits the user to define new commands and
                    608: thereby expand the editor's repertoire. (however, built in commands
                    609: always  take  precedence  over  macros, i.e.,  the  editor's
                    610: repertoire can be expanded, but not modified.) macros are defined by
                    611: using the m command.
                    612: 
                    613: \fI(m c . coms) \fP for c an atom, m defines c as an
                    614: atomic command.  (if a macro  is  redefined, its new definition
                    615: replaces its old.) executing c is then the same as executing the  list
                    616: of  commands  coms.    macros  can  also define list commands, i.e.,
                    617: commands that take arguments.  (m (c) (arg[1] ... arg[n]) . coms) c an
                    618: atom.  m defines c as a list command.  executing (c e1 ...  en)  is
                    619: then  performed  by substituting  e1  for  arg[1],  ...    en  for
                    620: arg[n] throughout coms, and then executing coms.  a list command can be
                    621: defined via a macro  so  as  to  take  a fixed  or  indefinite  number
                    622: of 'arguments'.  The form given above specified a macro with a fixed
                    623: number of arguments, as indicated by its argument list.   if the
                    624: 'argument  list'  is  atomic,  the  command  takes an indefinite number
                    625: of arguments.  (m (c) args . coms) c,  args  both  atoms,  defines  c
                    626: as  a  list command.  executing  (c  e1 ...  en) is performed by
                    627: substituting (e1 ...  en), i.e., cdr of the command, for args
                    628: throughout coms, and then executing coms.
                    629: 
                    630: (m bp bk up p) will define bp as an atomic  command  which  does three
                    631: things,  a bk, an up, and a p. note that macros can use commands
                    632: defined by macros as well as built in commands in  their
                    633: definitions.    for  example, suppose  z  is  defined by (m z -1 (if
                    634: (null (##)) nil (p))), i.e. z does a -1, and then if the current
                    635: expression is not nil, a p. now we can define zz by  (m zz  -1 z), and
                    636: zzz by (m zzz -1 -1 z) or (m zzz -1 zz).  we could define a more
                    637: general bp by (m (bp) (n) (bk n) up p).    (bp 3)  would  perform  (bk
                    638: 3), followed  by  an  up,  followed  by a p.  The command second can be
                    639: defined as a macro by (m (2nd) x (orr ((lc .  x) (lc .  x)))).
                    640: 
                    641: Note  that  for  all editor commands, 'built in' commands as well as
                    642: commands defined by macros, atomic  definitions  and  list
                    643: definitions  are  completely independent.  in other words, the
                    644: existence of an atomic definition for c in no way  affects  the
                    645: treatment of c when it appears as car of a list command, and the
                    646: existence of a list definition for c in no way affects the treatment
                    647: of  c when it appears as an atom.  in particular, c can be used as the
                    648: name of either an atomic command, or a list command, or both. in the
                    649: latter case, two entirely different  definitions  can  be  used.   note
                    650: also that once c is defined as an atomic command via a macro
                    651: definition, it will not be searched for when used in a location
                    652: specification, unless c is preceded by an f.  (insert --  before
                    653: bp) would not search for bp, but instead perform a bk, an up, and a p,
                    654: and then do the insertion.  The corresponding also holds true for list
                    655: commands.
                    656: 
                    657: \fI(bind . coms) \fP bind  is  an  edit  command which
                    658: is useful mainly in macros.  it binds three dummy variables #1, #2, #3,
                    659: (initialized to nil), and then  executes  the  edit commands  coms.
                    660: note that these bindings are only in effect while the commands are
                    661: being executed, and that bind can be used recursively; it will  rebind
                    662: #1, #2,  and  #3 each time it is invoked.
                    663: 
                    664: \fIusermacros [value]\fP.  this  variable  contains the users editing
                    665: macros .   if you want to save your macros then you should save
                    666: usermacros.  you  should  probably  also  save editcomsl.
                    667: 
                    668: \fIeditcomsl [value]\fP.
                    669: editcomsl  is  the  list of "list commands" recognized by the editor.  (these
                    670: are the ones of the form (command arg1 arg2 ...).)
                    671: 
                    672: .sh 2 Miscellaneous\ Editor\ Commands
                    673: .Fb
                    674: .fi
                    675: \fIMISCELLANEOUS EDITOR COMMAND SUMMARY\fP
                    676: 
                    677: \fIok \fP.  Exits from the editor.
                    678: 
                    679: \fInil \fP.  Unless preceded by f or bf, is always a null operation.
                    680: 
                    681: \fItty:  \fP.  Calls  the  editor  recursively.  The user can then type
                    682: in commands, and have them executed.  The tty:  command is completed
                    683: when  the  user exits  from  the lower  editor  (with  ok  or  stop).
                    684: the tty:  command is extremely useful. it enables the user to  set  up
                    685: a complex  operation,  and  perform  interactive attention-changing
                    686: commands part way through it. for example the command (move 3 to after
                    687: cond 3 p tty:) allows the user to interact, in  effect,  within  the
                    688: move  command.      he can verify for himself that the correct location
                    689: has been found, or complete the specification "by hand". in effect,
                    690: tty: says "I'll tell you what you should do when you get there."
                    691: 
                    692: \fIstop \fP.  exits from the editor with an error.  mainly for use in
                    693: conjunction with tty:  commands that the user wants to abort.  since
                    694: all of the commands in the editor are  errset protected, the user must
                    695: exit from the editor via a command.  stop provides a way of
                    696: distinguishing between a successful  and unsuccessful  (from the
                    697: user's  standpoint) editing session.
                    698: 
                    699: \fItl \fP.  tl  calls (top-level).  to return to the editor just use
                    700: the \fIreturn\fP top-level command.
                    701: 
                    702: \fIrepack \fP.  permits the 'editing' of an atom or string.
                    703: 
                    704: \fI(repack $)\fP does (lc . $) followed by repack, e.g. (repack this@).
                    705: 
                    706: \fI(makefn form args n m) \fP.  makes (car form) an expr with the nth
                    707: through mth  elements  of  the  current expression with  each
                    708: occurrence  of  an element of (cdr form) replaced by the corresponding
                    709: element of args.  The nth through mth  elements  are replaced  by form.
                    710: 
                    711: \fI(makefn form args n)\fP.  same as (makefn form args n n).
                    712: 
                    713: \fI(s var . $) \fP.  sets var (using setq) to the current expression
                    714: after performing (lc .    $).    (s  foo)  will  set foo to the current
                    715: expression, (s foo -1 1) will set foo to the first element in the last
                    716: element of the current expression.
                    717: .Fe
                    718: .sh 2 Editor\ Functions
                    719: 
                    720: .Lf editf "s_x1 ..."
                    721: .Se
                    722: edits a function. s_x1 is the name of the function,
                    723: any additional arguments are an optional list of commands.
                    724: .Re
                    725: s_x1.
                    726: .No
                    727: if s_x1 is not an editable function, editf generates an fn not editable error.
                    728: 
                    729: .Lf edite "l_expr l_coms s_atm)"
                    730: edits an expression.  its value is the last element of (editl (list
                    731: l_expr) l_coms s_atm nil nil).  
                    732: 
                    733: .Lf editracefn "s_com"
                    734: is available to help the user debug complex edit macros, or subroutine
                    735: calls to  the  editor. editracefn is to be defined by the user.
                    736: whenever the value of editracefn  is  non-nil,  the  editor  calls
                    737: the  function  editracefn  before executing  each command (at any
                    738: level), giving it that command as its argument.  editracefn is
                    739: initially equal to nil, and undefined.
                    740: 
                    741: .Lf editv "s_var [ g_com1 ... ]"
                    742: .Se
                    743: similar to editf, for editing values.  editv sets the variable to the value
                    744: returned.
                    745: .Re
                    746: the name of the variable whose value was edited.
                    747: 
                    748: .Lf editp "s_x"
                    749: .Se
                    750: similar to editf for editing property lists.  
                    751: used if x is nil.  
                    752: .Re
                    753: the atom whose property list was edited.
                    754: 
                    755: .Lf editl "coms atm marklst mess"
                    756: .Se
                    757: editl is the editor.  its first argument is the edit chain, and its
                    758: value is an edit chain, namely the value of l at the time editl is
                    759: exited.  (l is a special variable, and so can be examined or set by
                    760: edit commands.   ^ is equivalent to (e (setq l(last l)) t).)  coms is
                    761: an optional list of commands.  for interactive editing, coms is nil.
                    762: in this case, editl types edit and then waits for input from the
                    763: teletype.  (if mess is not nil editl types it instead of edit.  for
                    764: example, the tty:  command is essentially (setq l (editl l nil nil nil
                    765: (quote tty:))).)  exit occurs only via an ok, stop, or save command.
                    766: If coms is not nil, no message is typed, and each member of coms is
                    767: treated as a command and executed.  If an error occurs in the execution
                    768: of one of the commands, no error message is printed , the rest of the
                    769: commands are ignored, and editl exits with an error, i.e., the effect
                    770: is the same as though a stop command had been executed.  If all
                    771: commands execute successfully, editl returns the current value of l.
                    772: marklst is the list of marks.  on calls from editf, atm is the name of
                    773: the function being edited; on calls from editv, the name of the
                    774: variable, and calls from editp, the atom of which some property of its
                    775: property list is being edited.  The property list of atm is used by the
                    776: save command for saving the state of the edit.   save will not save
                    777: anything if atm=nil i.e., when editing arbitrary expressions via edite
                    778: or editl directly.
                    779: 
                    780: .Lf editfns "s_x [ g_coms1 ... ]" 
                    781: fsubr function, used to perform the same editing operations on
                    782: several functions.  
                    783: editfns maps down the list of
                    784: functions, prints the name of each function, and calls the editor (via
                    785: editf) on that function.
                    786: .Ex
                    787: editfns foofns (r fie fum)) will change every  fie  to  fum  in
                    788: each of the functions on foofns.
                    789: .No
                    790: the  call  to  the  editor is errset protected, so that if the editing of one
                    791: function causes an error, editfns will proceed to the next  function.    in
                    792: the above example, if one of the functions did not contain a fie, the r command
                    793: would  cause  an error, but editing would continue with the next function.  The
                    794: value of editfns is nil.
                    795: 
                    796: .Lf edit4e "pat y"
                    797: .Se
                    798: is the pattern match routine. 
                    799: .Re
                    800: t if pat matches y. see edit-match for definition of 'match'.
                    801: .No
                    802: before each search operation in the editor begins, the  entire  pattern
                    803: is  scanned  for  atoms  or strings that end in at-signs.  These are replaced by
                    804: patterns of the form  (cons  (quote  /@)  (explodec  atom)).      from  the
                    805: standpoint  of  edit4e, pattern type 5, atoms or strings ending in at-signs, is
                    806: really "if car[pat] is the atom @ (at-sign), pat will match  with  any  literal
                    807: atom  or  string  whose  initial  character codes (up to the @) are the same as
                    808: those in cdr[pat]."
                    809: if  the  user  wishes  to call edit4e directly, he must therefore convert any
                    810: patterns which contain  atoms  or  strings  ending  in  at-signs  to  the  form
                    811: recognized by edit4e.  this can be done via the function editfpat.
                    812: .Lf editfpat "pat flg"
                    813: makes a copy of pat with all patterns of type 5 (see edit-match) converted to
                    814: the form expected by edit4e. flg should be passed as nil (flg=t is for internal
                    815: use by the editor).
                    816: 
                    817: .Lf editfindp "x pat flg"
                    818: .No
                    819: Allows a program to use the edit find command as a pure predicate
                    820: from outside the editor.  x is an expression, pat a pattern.  The value
                    821: of editfindp is t if the command f pat would succeed, nil otherwise.
                    822: editfindp calls editfpat to convert pat to the form expected by edit4e,
                    823: unless flg=t.    if the program is applying editfindp to several
                    824: different expressions using the same pattern, it will be more efficient
                    825: to call editfpat once, and then call editfindp with the converted
                    826: pattern and flg=t.
                    827: 
                    828: .Lf ## "g_com1 ..."
                    829: .Re  
                    830: what the current expression would be after executing the edit commands
                    831: com1 ...  starting from the present edit chain.  generates an error
                    832: if any of comi cause errors.  The current edit chain is never
                    833: changed.  example:  (i r (quote x) (## (cons ..z))) replaces all x's in
                    834: the current expression by the first cons containing a z.  

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.