Annotation of 43BSD/ucb/lisp/lisplib/manual/ch16.r, revision 1.1.1.1

1.1       root        1: 
                      2: 
                      3: 
                      4: 
                      5: 
                      6: 
                      7: 
                      8:                         CHAPTER  16
                      9: 
                     10: 
                     11:                       The LISP Editor
                     12: 
                     13: 
                     14: 
                     15: 
                     16: 
                     17: 
                     18: 
                     19:    16.1.  The Editors
                     20: 
                     21:       It is quite possible to use VI, Emacs or  other  stan-
                     22:       dard editors to edit your lisp programs, and many peo-
                     23:       ple do just that.  However there is a  lisp  structure
                     24:       editor  which  is particularly good for the editing of
                     25:       lisp programs, and  operates  in  a  rather  different
                     26:       fashion,  namely  within a lisp environment.  applica-
                     27:       tion.  It is handy to know how to use  it  for  fixing
                     28:       problems  without  exiting  from the lisp system (e.g.
                     29:       from the debugger  so  you  can  continue  to  execute
                     30:       rather  than having to start over.)  The editor is not
                     31:       quite like the top-level  and  debugger,  in  that  it
                     32:       expects  you  to  type editor commands to it.  It will
                     33:       not evaluate whatever you happen to type.   (There  is
                     34:       an editor command to evaluate things, though.)
                     35: 
                     36:       The editor is available (assuming your system  is  set
                     37:       up  correctly  with  a  lisp  library) by typing (load
                     38:       'cmufncs) and (load 'cmuedit).
                     39: 
                     40:       The  most  frequent  use of the editor  is  to  change
                     41:       function  definitions  by starting the editor with one
                     42:       of the  commands  described  in  section  16.14.  (see
                     43:       _e_d_i_t_f),   values   (_e_d_i_t_v),  properties  (_e_d_i_t_p),  and
                     44:       expressions  (_e_d_i_t_e).  The  beginner   is  advised  to
                     45:       start  with  the  following (very basic) commands: _o_k,
                     46:       _u_n_d_o, _p, #, under which are  explained  two  different
                     47:       basic commands which  start with numbers, and f.
                     48: 
                     49:       This documentation, and the editor, were imported from
                     50:       PDP-10  CMULisp by Don Cohen.  PDP-10 CMULisp is based
                     51:       on UCILisp, and the editor itself was derived from  an
                     52:       early  version of Interlisp.  Lars Ericson, the author
                     53:       of this section, has provided this very  concise  sum-
                     54:       mary.   Tutorial  examples  and implementation details
                     55:       may be found in the Interlisp Reference Manual,  where
                     56:       a similar editor is described.
                     57: 
                     58: 
                     59: 
                     60: 9
                     61: 
                     62: 9The LISP Editor                                         16-1
                     63: 
                     64: 
                     65: 
                     66: 
                     67: 
                     68: 
                     69: 
                     70: The LISP Editor                                         16-2
                     71: 
                     72: 
                     73:    16.2.  Scope of Attention
                     74: 
                     75:       Attention-changing commands allow you  to  look  at  a
                     76:       different  part  of a Lisp expression you are editing.
                     77:       The sub-structure upon which the editor's attention is
                     78:       centered  is called "the current expression".   Chang-
                     79:       ing the current expression  means  shifting  attention
                     80:       and not actually modifying any structure.
                     81: 
                     82: ____________________________________________________________
                     83: 
                     84: _S_C_O_P_E _O_F _A_T_T_E_N_T_I_O_N _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                     85: 
                     86: _n (_n>_0) . Makes the nth element of the current expression be
                     87: the new current expression.
                     88: 
                     89: -_n (_n>_0). Makes the nth element from the end of the  current
                     90: expression be the new current expression.
                     91: 
                     92: _0. Makes the  next  higher expression  be  the  new  correct
                     93: expression.   If  the  intention  is  to go back to the next
                     94: higher left parenthesis, use the command !0.
                     95: 
                     96: _u_p .  If a p command would cause  the  editor  to  type  ...
                     97: before  typing  the current expression, (the current expres-
                     98: sion is a tail of the next higher expression)  then  has  no
                     99: effect;  else, up makes the old current expression the first
                    100: element in the new current expression.
                    101: 
                    102: !_0 . Goes back to the next higher left parenthesis.
                    103: 
                    104: ^ .  Makes the top level expression be the  current  expres-
                    105: sion.
                    106: 
                    107: _n_x .  Makes the current expression be the next expression.
                    108: 
                    109: (_n_x _n) equivalent to n nx commands.
                    110: 
                    111: !_n_x .  Makes current expression be the next expression at  a
                    112: higher  level.  Goes through any number of right parentheses
                    113: to get to the next expression.
                    114: 
                    115:  _b_k .  Makes the current expression be the previous  expres-
                    116: sion in the next higher expression.
                    117: 
                    118: (_n_t_h _n) _n>_0 .  Makes the list starting with the nth  element
                    119: of the current expression be the current expression.
                    120: 
                    121: (_n_t_h $) - _g_e_n_e_r_a_l_i_z_e_d _n_t_h _c_o_m_m_a_n_d. nth locates $,  and  then
                    122: backs up to the current level, where the new current expres-
                    123: sion is the tail whose first element contains, however  dee-
                    124: ply,  the  expression  that was the terminus of the location
                    125: operation.
                    126: 
                    127: 
                    128:                                       Printed: July 21, 1983
                    129: 
                    130: 
                    131: 
                    132: 
                    133: 
                    134: 
                    135: 
                    136: The LISP Editor                                         16-3
                    137: 
                    138: 
                    139: :: .  (pattern ::  .  $)  e.g., (cond :: return).   finds  a
                    140: cond that contains a return, at any depth.
                    141: 
                    142: (_b_e_l_o_w _c_o_m _x) .  The below command is useful for locating  a
                    143: substructure  by  specifying something  it contains.  (below
                    144: cond) will cause the cond  clause  containing   the  current
                    145: expression  to  become  the new current expression.  Suppose
                    146: you are editing a list of lists, and want to find a  sublist
                    147: that  contains a foo (at any depth).  Then simply executes f
                    148: foo (below ).
                    149: 
                    150: (_n_e_x _x) .  same as (_b_e_l_o_w _x) followed by nx.   For  example,
                    151: if  you are deep inside of a selectq clause, you can advance
                    152: to the next clause with (_n_e_x _s_e_l_e_c_t_q).
                    153: 
                    154: _n_e_x.  The  atomic  form  of  _n_e_x is useful if  you  will  be
                    155: performing  repeated   executions   of  (_n_e_x  _x).  By simply
                    156: marking  the  chain corresponding to x,  you can use _n_e_x  to
                    157: step through the sublists.
                    158: ____________________________________________________________
                    159: 
                    160: 
                    161: 
                    162: 
                    163: 
                    164:    16.3.  Pattern Matching Commands
                    165: 
                    166:       Many editor commands that  search  take  patterns.   A
                    167:       pattern _p_a_t matches with x if:
                    168: 
                    169: ____________________________________________________________
                    170: 
                    171: _P_A_T_T_E_R_N _S_P_E_C_I_F_I_C_A_T_I_O_N _S_U_M_M_A_R_Y
                    172: 
                    173: - _p_a_t is _e_q to x.
                    174: 
                    175: - _p_a_t is &.
                    176: 
                    177: - _p_a_t is a number and equal to x.
                    178: 
                    179: - if (car _p_a_t) is the atom *any*, (cdr _p_a_t)  is  a  list  of
                    180: patterns,  and  _p_a_t matches x if and only if one of the pat-
                    181: terns on (cdr _p_a_t) matches x.
                    182: 
                    183: - if _p_a_t is a literal atom or string, and (nthchar  _p_a_t  -1)
                    184: is @, then _p_a_t matches with any literal atom or string which
                    185: has the same initial characters as _p_a_t, e.g.   ver@  matches
                    186: with verylongatom, as well as "verylongstring".
                    187: 
                    188: - if (car _p_a_t) is the atom --, _p_a_t matches  x  if  (a)  (cdr
                    189: _p_a_t)=nil,  i.e.   _p_a_t=(--), e.g., (a --) matches (a) (a b c)
                    190: and (a .  b) in other words, -- can  match  any  tail  of  a
                    191: list.   (b)  (cdr _p_a_t) matches with some tail of x, e.g.  (a
                    192: 
                    193: 
                    194:                                       Printed: July 21, 1983
                    195: 
                    196: 
                    197: 
                    198: 
                    199: 
                    200: 
                    201: 
                    202: The LISP Editor                                         16-4
                    203: 
                    204: 
                    205: -- (&)) will match with (a b c (d)), but not (a b c  d),  or
                    206: (a  b c (d) e).  however, note that (a -- (&) --) will match
                    207: with (a b c (d) e).  in other words, -- will match any inte-
                    208: rior segment of a list.
                    209: 
                    210: - if (car _p_a_t) is the atom ==, _p_a_t matches x if and only  if
                    211: (cdr  _p_a_t) is _e_q to x.  (this pattern is for use by programs
                    212: that call the editor as a subroutine, since  any  non-atomic
                    213: expression  in a command typed in by the user obviously can-
                    214: not be _e_q to existing structure.) -  otherwise  if  x  is  a
                    215: list,  _p_a_t  matches x if (car _p_a_t) matches (car x), and (cdr
                    216: _p_a_t) matches (cdr x).
                    217: 
                    218: - when searching, the pattern  matching  routine  is  called
                    219: only  to  match  with  elements in the structure, unless the
                    220: pattern begins with :::, in which case cdr of the pattern is
                    221: matched  against tails in the structure.  (in this case, the
                    222: tail does not have to be a proper tail, e.g.   (:::   a  --)
                    223: will  match  with the element (a b c) as well as with cdr of
                    224: (x a b c), since (a b c) is a tail of (a b c).)
                    225: ____________________________________________________________
                    226: 
                    227: 
                    228: 
                    229: 
                    230: 
                    231:       16.3.1.  Commands That Search
                    232: 
                    233: ____________________________________________________________
                    234: 
                    235: _S_E_A_R_C_H _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    236: 
                    237: _f _p_a_t_t_e_r_n .  f informs the editor that the next  command  is
                    238: to  be  interpreted as a pattern.  If no pattern is given on
                    239: the same line as the f then the last  pattern  is  used.   f
                    240: pattern means find the next instance of pattern.
                    241: 
                    242: (_f _p_a_t_t_e_r_n _n).  Finds the next instance of pattern.
                    243: 
                    244: (_f _p_a_t_t_e_r_n _t).  similar to f pattern, except,  for  example,
                    245: if the current expression is (cond ..), f cond will look for
                    246: the next cond, but (f cond t) will 'stay here'.
                    247: 
                    248: (_f _p_a_t_t_e_r_n  _n)  _n>_0.   Finds  the  nth  place  that  pattern
                    249: matches.   If the current expression is (foo1 foo2 foo3), (f
                    250: f00@ 3) will find foo3.
                    251: 
                    252: (_f _p_a_t_t_e_r_n) _o_r (_f _p_a_t_t_e_r_n _n_i_l).  only matches with  elements
                    253: at  the top level of the current expression.  If the current
                    254: expression is (_p_r_o_g _n_i_l (_s_e_t_q _x (_c_o_n_d & &)) (_c_o_n_d &) ...)  f
                    255: (cond  --)  will  find  the cond inside the setq, whereas (f
                    256: (cond --)) will find the top level cond,  i.e.,  the  second
                    257: one.
                    258: 
                    259: 
                    260:                                       Printed: July 21, 1983
                    261: 
                    262: 
                    263: 
                    264: 
                    265: 
                    266: 
                    267: 
                    268: The LISP Editor                                         16-5
                    269: 
                    270: 
                    271: (_s_e_c_o_n_d . $) .  same as (lc .  $) followed by another (lc  .
                    272: $)  except  that  if the first succeeds and second fails, no
                    273: change is made to the edit chain.
                    274: 
                    275: (_t_h_i_r_d . $) .  Similar to second.
                    276: 
                    277: (_f_s _p_a_t_t_e_r_n_1 ... _p_a_t_t_e_r_n_n) .  equivalent to f pattern1  fol-
                    278: lowed by f pattern2 ...  followed by f pattern n, so that if
                    279: f pattern m fails, edit chain is left at place  pattern  m-1
                    280: matched.
                    281: 
                    282: (_f= _e_x_p_r_e_s_s_i_o_n _x) .  Searches for a structure eq to  expres-
                    283: sion.
                    284: 
                    285: (_o_r_f _p_a_t_t_e_r_n_1 ... _p_a_t_t_e_r_n_n) .  Searches  for  an  expression
                    286: that is matched by either pattern1 or ...  patternn.
                    287: 
                    288: _b_f _p_a_t_t_e_r_n .  backwards find.   If the current expression is
                    289: (_p_r_o_g _n_i_l (_s_e_t_q _x (_s_e_t_q _y (_l_i_s_t _z))) (_c_o_n_d ((_s_e_t_q _w --) --))
                    290: --) f list followed  by  bf  setq  will  leave  the  current
                    291: expression  as (setq y (list z)), as will f cond followed by
                    292: bf setq
                    293: 
                    294: (_b_f _p_a_t_t_e_r_n _t).  backwards  find.   Search  always  includes
                    295: current  expression,  i.e., starts at end of current expres-
                    296: sion and works backward, then ascends and backs up, etc.
                    297: ____________________________________________________________
                    298: 
                    299: 
                    300: 
                    301: 
                    302: 
                    303:          16.3.1.1.   Location Specifications    Many  editor
                    304:             commands  use  a  method  of specifying position
                    305:             called  a  location  specification.   The  meta-
                    306:             symbol $ is used to denote a location specifica-
                    307:             tion.   $ is a list of commands  interpreted  as
                    308:             described above.  $ can also be atomic, in which
                    309:             case it is interpreted as (list $).  a  location
                    310:             specification  is  a  list of edit commands that
                    311:             are executed in  the  normal  fashion  with  two
                    312:             exceptions.   first, all commands not recognized
                    313:             by the editor are interpreted as though they had
                    314:             been  preceded  by f. The location specification
                    315:             (cond 2 3) specifies  the  3rd  element  in  the
                    316:             first clause of the next cond.
                    317: 
                    318:             the if command and the ## function provide a way
                    319:             of  using  in  location specifications arbitrary
                    320:             predicates applied to elements  in  the  current
                    321:             expression.
                    322: 
                    323:             In insert, delete, replace and change, if  $  is
                    324: 
                    325: 
                    326:                                       Printed: July 21, 1983
                    327: 
                    328: 
                    329: 
                    330: 
                    331: 
                    332: 
                    333: 
                    334: The LISP Editor                                         16-6
                    335: 
                    336: 
                    337:             nil (empty), the corresponding operation is per-
                    338:             formed on the current edit chain, i.e.  (replace
                    339:             with  (car x)) is equivalent to (:(car x)).  for
                    340:             added readability, here is also permitted, e.g.,
                    341:             (insert  (print  x)  before  here)  will  insert
                    342:             (print x) before the current expression (but not
                    343:             change  the  edit chain).  It is perfectly legal
                    344:             to ascend to insert, replace,  or  delete.   for
                    345:             example  (insert  (_r_e_t_u_r_n) after ^ prog -1) will
                    346:             go to the top, find the first prog, and insert a
                    347:             (_r_e_t_u_r_n)  at its end, and not change the current
                    348:             edit chain.
                    349: 
                    350:             The a, b,  and  :   commands  all  make  special
                    351:             checks in e1 thru em for expressions of the form
                    352:             (## . coms).  In this case, the expression  used
                    353:             for  inserting  or  replacing  is  a copy of the
                    354:             current expression after executing coms, a  list
                    355:             of  edit  commands.    (insert (## f cond -1 -1)
                    356:             after3)  will make a copy of the  last  form  in
                    357:             the  last clause of the next cond, and insert it
                    358:             after the third element of the  current  expres-
                    359:             sion.
                    360: 
                    361:             $.  In descriptions of  the  editor,  the  meta-
                    362:             symbol $ is used to denote a location specifica-
                    363:             tion.   $ is a list of commands  interpreted  as
                    364:             described above.  $ can also be atomic.
                    365: 
                    366: ____________________________________________________________
                    367: 
                    368: _L_O_C_A_T_I_O_N _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    369: 
                    370: (_l_c . $) .  Provides a way of explicitly invoking the  loca-
                    371: tion operation.  (lc cond 2 3) will perform search.
                    372: 
                    373: (_l_c_l . $) .  Same as lc except search is confined to current
                    374: expression.   To  find a cond containing a _r_e_t_u_r_n, one might
                    375: use the location specification (cond (lcl  _r_e_t_u_r_n)  )  where
                    376: the   would reverse the effects of the lcl command, and make
                    377: the final current expression be the cond.
                    378: ____________________________________________________________
                    379: 
                    380: 
                    381: 
                    382: 
                    383: 
                    384:       16.3.2.  The Edit Chain   The edit-chain is a list  of
                    385:          which  the first element is the the one you are now
                    386:          editing ("current expression"), the next element is
                    387:          what  would  become  the  current expression if you
                    388:          were to do a 0, etc., until the last element  which
                    389:          is the expression that was passed to the editor.
                    390: 
                    391: 
                    392:                                       Printed: July 21, 1983
                    393: 
                    394: 
                    395: 
                    396: 
                    397: 
                    398: 
                    399: 
                    400: The LISP Editor                                         16-7
                    401: 
                    402: 
                    403: ____________________________________________________________
                    404: 
                    405: _E_D_I_T _C_H_A_I_N _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    406: 
                    407: _m_a_r_k .  Adds the current edit chain to the front of the list
                    408: marklst.
                    409: 
                    410: _ .  Makes the new edit chain be (car marklst).
                    411: 
                    412: (_ _p_a_t_t_e_r_n) .  Ascends the edit chain  looking  for  a  link
                    413: which matches pattern.  for example:
                    414: 
                    415: __ .  Similar to _ but also erases the mark.
                    416: 
                    417: \ . Makes the edit chain be the value of unfind.  unfind  is
                    418: set  to  the current edit chain by each command that makes a
                    419: "big jump", i.e., a command that usually performs more  than
                    420: a  single  ascent or descent, namely ^, _, __, !nx, all com-
                    421: mands that involve a search, e.g., f, lc, ::, below,  et  al
                    422: and                      and                     themselves.
                    423: if the user types f cond, and then f car,   would  take  him
                    424: back  to the cond.  another  would take him back to the car,
                    425: etc.
                    426: 
                    427: \_p .  Restores the edit chain to its state as  of  the  last
                    428: print  operation.   If  the edit chain has not changed since
                    429: the last printing, \p restores it to its  state  as  of  the
                    430: printing before that one.  If the user types p followed by 3
                    431: 2 1 p, \p will  return  to  the  first  p,  i.e.,  would  be
                    432: equivalent to 0 0 0.  Another \p would then take him back to
                    433: the second p.
                    434: ____________________________________________________________
                    435: 
                    436: 
                    437: 
                    438: 
                    439: 
                    440:    16.4.  Printing Commands
                    441: 
                    442: ____________________________________________________________
                    443: 
                    444: _P_R_I_N_T_I_N_G _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    445: 
                    446: _p  Prints current expression in  abbreviated  form.   (p  m)
                    447: prints  mth  element  of  current  expression in abbreviated
                    448: form.  (p m n) prints mth element of current  expression  as
                    449: though  printlev  were  given  a depth of n.  (p 0 n) prints
                    450: current expression as though printlev were given a depth  of
                    451: n.  (p cond 3) will work.
                    452: 
                    453: ?  .  prints the current expression as though printlev  were
                    454: given a depth of 100.
                    455: 9
                    456: 
                    457: 9                                      Printed: July 21, 1983
                    458: 
                    459: 
                    460: 
                    461: 
                    462: 
                    463: 
                    464: 
                    465: The LISP Editor                                         16-8
                    466: 
                    467: 
                    468: _p_p .  pretty-prints the current expression.
                    469: 
                    470: _p_p*.  is like pp, but forces comments to be shown.
                    471: ____________________________________________________________
                    472: 
                    473: 
                    474: 
                    475: 
                    476: 
                    477:    16.5.  Structure Modification Commands
                    478: 
                    479:       All structure modification commands are undoable.  See
                    480:       _u_n_d_o.
                    481: 
                    482: 
                    483: ____________________________________________________________
                    484: 
                    485: _S_T_R_U_C_T_U_R_E _M_O_D_I_F_I_C_A_T_I_O_N _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    486: 
                    487: # [_e_d_i_t_o_r _c_o_m_m_a_n_d_s] (n)  n>1 deletes the corresponding  ele-
                    488: ment from the current expression.
                    489: 
                    490: (_n _e_1 ...  _e_m) _n,_m>_1 replaces the nth element in the current
                    491: expression with e1 ...  em.
                    492: 
                    493: (-_n _e_1 ...  _e_m) _n,_m>_1 inserts e1 ...  em before the  n  ele-
                    494: ment in the current expression.
                    495: 
                    496: (_n _e_1 ...  _e_m) (the letter "n" for "next" or "nconc", not  a
                    497: number)  m>1  attaches  e1 ...  em at the end of the current
                    498: expression.
                    499: 
                    500: (_a _e_1 ... _e_m) .   inserts  e1  ...   em  after  the  current
                    501: expression (or after its first element if it is a tail).
                    502: 
                    503: (_b _e_1 ... _e_m) .  inserts  e1  ...   em  before  the  current
                    504: expression.   to  insert  foo before the last element in the
                    505: current expression, perform -1 and then (b foo).
                    506: 
                    507: (: _e_1 ... _e_m) .  replaces the current expression by  e1  ...
                    508: em.     If the current expression is a tail then replace its
                    509: first element.
                    510: 
                    511: _d_e_l_e_t_e _o_r (:)  .  deletes the current expression, or if  the
                    512: current expression is a tail, deletes its first element.
                    513: 
                    514: (_d_e_l_e_t_e . $).  does a (lc .  $) followed by delete.  current
                    515: edit chain is not changed.
                    516: 
                    517: (_i_n_s_e_r_t _e_1 ... _e_m _b_e_f_o_r_e . $) .  similar to  (lc.   $)  fol-
                    518: lowed by (b e1 ... em).
                    519: 
                    520: (_i_n_s_e_r_t _e_1 ...  _e_m _a_f_t_e_r .  $).  similar  to  insert  before
                    521: 
                    522: 
                    523:                                       Printed: July 21, 1983
                    524: 
                    525: 
                    526: 
                    527: 
                    528: 
                    529: 
                    530: 
                    531: The LISP Editor                                         16-9
                    532: 
                    533: 
                    534: except uses a instead of b.
                    535: 
                    536: (_i_n_s_e_r_t _e_1 ...  _e_m _f_o_r .   $).   similar  to  insert  before
                    537: except uses :  for b.
                    538: 
                    539: (_r_e_p_l_a_c_e $ _w_i_t_h _e_1 ... _e_m) .  here $ is the segment  of  the
                    540: command between replace and with.
                    541: 
                    542: (_c_h_a_n_g_e $ _t_o _e_1 ... _e_m) .  same as replace with.
                    543: ____________________________________________________________
                    544: 
                    545: 
                    546: 
                    547: 
                    548: 
                    549:    16.6.  Extraction and Embedding Commands
                    550: 
                    551: ____________________________________________________________
                    552: 
                    553: _E_X_T_R_A_C_T_I_O_N _A_N_D _E_M_B_E_D_D_I_N_G _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    554: 
                    555: (_x_t_r . $) .  replaces the original current  expression  with
                    556: the expression that is current after performing (lcl . $).
                    557: 
                    558: (_m_b_d _x) .  x is a list, substitutes the  current  expression
                    559: for  all  instances  of  the  atom  * in x, and replaces the
                    560: current expression with the  result  of  that  substitution.
                    561: (mbd x) :  x atomic, same as (mbd (x *)).
                    562: 
                    563: (_e_x_t_r_a_c_t $_1 _f_r_o_m $_2) .  extract is an editor  command  which
                    564: replaces  the  current expression with one of its subexpres-
                    565: sions (from any depth).  ($1 is the segment between  extract
                    566: and  from.)    example:  if the current expression is (print
                    567: (cond ((null x) y) (t z))) then following  (extract  y  from
                    568: cond), the current expression will be (print y).  (extract 2
                    569: -1 from cond), (extract y from 2), (extract  2  -1  from  2)
                    570: will all produce the same result.
                    571: 
                    572: (_e_m_b_e_d $ _i_n . _x) .  embed replaces  the  current  expression
                    573: with  a new expression which contains it as a subexpression.
                    574: ($ is the segment between embed and in.)   example:   (embed
                    575: print  in setq x), (embed 3 2 in _r_e_t_u_r_n), (embed cond 3 1 in
                    576: (or * (null x))).
                    577: ____________________________________________________________
                    578: 
                    579: 
                    580: 
                    581: 
                    582: 
                    583:    16.7.  Move and Copy Commands
                    584: 
                    585: 
                    586: 9
                    587: 
                    588: 9                                      Printed: July 21, 1983
                    589: 
                    590: 
                    591: 
                    592: 
                    593: 
                    594: 
                    595: 
                    596: The LISP Editor                                        16-10
                    597: 
                    598: 
                    599: ____________________________________________________________
                    600: 
                    601: _M_O_V_E _A_N_D _C_O_P_Y _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    602: 
                    603: (_m_o_v_e $_1 _t_o _c_o_m . $_2) .  ($1 is the segment between move and
                    604: to.)  where com is before, after, or the name of a list com-
                    605: mand, e.g., :, n, etc.  If $2 is nil, or (here), the current
                    606: position specifies where the operation is to take place.  If
                    607: $1 is nil, the move command allows the user to specify  some
                    608: place  the  current  expression  is to be moved to.   if the
                    609: current expression is (a b d c), (move 2 to  after  4)  will
                    610: make the new current expression be (a c d b).
                    611: 
                    612: (_m_v _c_o_m . $) .  is the same as (move here to com . $).
                    613: 
                    614: (_c_o_p_y $_1 _t_o _c_o_m . $_2)  is like move except that  the  source
                    615: expression is not deleted.
                    616: 
                    617: (_c_p _c_o_m . $).  is like mv except that the source  expression
                    618: is not deleted.
                    619: ____________________________________________________________
                    620: 
                    621: 
                    622: 
                    623: 
                    624: 
                    625:    16.8.    Parentheses Moving Commands      The    commands
                    626:       presented  in  this section permit modification of the
                    627:       list structure itself, as opposed  to  modifying  com-
                    628:       ponents  thereof.   their  effect  can be described as
                    629:       inserting  or  removing  a  single   left   or   right
                    630:       parenthesis, or pair of left and right parentheses.
                    631: 
                    632: ____________________________________________________________
                    633: 
                    634: _P_A_R_E_N_T_H_E_S_E_S _M_O_V_I_N_G _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    635: 
                    636: (_b_i _n _m) .  both in.  inserts  parentheses  before  the  nth
                    637: element and after the mth element in the current expression.
                    638: example:  if the current expression is (a b (c d  e)  f  g),
                    639: then (bi 2 4) will modify it to be (a (b (c d e) f) g).  (bi
                    640: n) :  same as (bi n n).  example:  if the current expression
                    641: is (a b (c d e) f g), then (bi -2) will modify it to be (a b
                    642: (c d e) (f) g).
                    643: 
                    644: (_b_o _n) .  both out.  removes both parentheses from  the  nth
                    645: element.   example:   if the current expression is (a b (c d
                    646: e) f g), then (bo d) will modify it to be (a b c d e f g).
                    647: 
                    648: (_l_i _n) .  left in.  inserts a left  parenthesis  before  the
                    649: nth  element (and a matching right parenthesis at the end of
                    650: the current expression).  example:  if the  current  expres-
                    651: sion  is (a b (c d e) f g), then (li 2) will modify it to be
                    652: 
                    653: 
                    654:                                       Printed: July 21, 1983
                    655: 
                    656: 
                    657: 
                    658: 
                    659: 
                    660: 
                    661: 
                    662: The LISP Editor                                        16-11
                    663: 
                    664: 
                    665: (a (b (c d e) f g)).
                    666: 
                    667: (_l_o _n) .  left  out.  removes  a  left parenthesis  from the
                    668: nth  element.  all  elements  following  the nth element are
                    669: deleted.  example: if the current expression is (a b (c d e)
                    670: f g), then  (lo  3) will modify it to be (a b c d e).
                    671: 
                    672: (_r_i _n _m) .  right  in.  move  the  right parenthesis at  the
                    673: end of the nth element in to after the mth element.  inserts
                    674: a  right parenthesis  after  the mth element of the nth ele-
                    675: ment.   The  rest  of  the  nth element is brought up to the
                    676: level of the  current expression.   example: if the  current
                    677: expression  is (a (b c d e) f g), (ri 2 2) will modify it to
                    678: be (a (b c) d e f g).
                    679: 
                    680: (_r_o _n) .  right  out.  move the right parenthesis at the end
                    681: of  the  nth  element out to the  end of the current expres-
                    682: sion.  removes the right parenthesis from the  nth  element,
                    683: moving it to the end of the current expression. all elements
                    684: following the nth  element  are moved  inside of   the   nth
                    685: element.  example: if the current expression is (a b (c d e)
                    686: f  g),  (ro  3) will modify  it to be (a b (c d e f g)).
                    687: 
                    688: (_r _x _y)  replaces  all  instances  of x by y in the  current
                    689: expression,  e.g.,  (r  caadr  cadar).   x  can  be  the  s-
                    690: expression (or atom) to be substituted for, or can be a pat-
                    691: tern which specifies that s-expression (or atom).
                    692: 
                    693: (_s_w _n _m)  switches the nth and mth elements of  the  current
                    694: expression.  for example, if the current expression is (list
                    695: (cons (car x) (car y)) (cons (cdr y))),   (sw   2  3)   will
                    696: modify  it  to be (list (cons (cdr x) (cdr y)) (cons (car x)
                    697: (car y))).   (sw car  cdr) would produce the same result.
                    698: ____________________________________________________________
                    699: 
                    700: 
                    701: 
                    702: 
                    703: 
                    704:       16.8.1.  Using to and thru
                    705: 
                    706:          to, thru, extract, embed, delete, replace, and move
                    707:          can  be  made to operate on several contiguous ele-
                    708:          ments, i.e., a segment of a list, by using  the  to
                    709:          or   thru  command  in  their  respective  location
                    710:          specifications.  thru and to  are  intended  to  be
                    711:          used   in  conjunction with extract, embed, delete,
                    712:          replace, and move.    to and thru can also be  used
                    713:          directly  with  xtr  (which  takes after a location
                    714:          specification), as in (xtr (2 thru  4))  (from  the
                    715:          current expression).
                    716: 
                    717: 9
                    718: 
                    719: 9                                      Printed: July 21, 1983
                    720: 
                    721: 
                    722: 
                    723: 
                    724: 
                    725: 
                    726: 
                    727: The LISP Editor                                        16-12
                    728: 
                    729: 
                    730: ____________________________________________________________
                    731: 
                    732: _T_O _A_N_D _T_H_R_U _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    733: 
                    734: ($_1 _t_o $_2)    .   same  as  thru  except  last  element  not
                    735: included.
                    736: 
                    737: ($_1 _t_o).  same as ($1 thru -1)
                    738: 
                    739: ($_1 _t_h_r_u $_2)  .  If the current expression is (a  (b  (c  d)
                    740: (e)  (f  g  h)  i)  j  k), following (c thru g), the current
                    741: expression will be ((c d) (e) (f g h)).  If both $1  and  $2
                    742: are  numbers, and $2 is greater than $1, then $2 counts from
                    743: the beginning of the current expression, the same as $1.  in
                    744: other  words,  if the current expression is (a b c d e f g),
                    745: (3 thru 4) means (c thru d), not (c thru f).  in this  case,
                    746: the corresponding bi command is (bi 1 $2-$1+1).
                    747: 
                    748: ($_1 _t_h_r_u). same as ($_1 _t_h_r_u -_1).
                    749: ____________________________________________________________
                    750: 
                    751: 
                    752: 
                    753: 
                    754: 
                    755:    16.9.  Undoing Commands   each command that causes struc-
                    756:       ture  modification  automatically adds an entry to the
                    757:       front of undolst containing the  information  required
                    758:       to  restore all pointers that were changed by the com-
                    759:       mand.  The undo command undoes the  last,  i.e.,  most
                    760:       recent such command.
                    761: 
                    762: ____________________________________________________________
                    763: 
                    764: _U_N_D_O _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    765: 
                    766: _u_n_d_o .  the  undo  command  undoes  most  recent,  structure
                    767: modification  command  that  has  not  yet  been undone, and
                    768: prints the name of that command, e.g., mbd undone.  The edit
                    769: chain  is  then exactly what it was before the 'undone' com-
                    770: mand had been performed.
                    771: 
                    772: !_u_n_d_o .  undoes  all  modifications  performed  during  this
                    773: editing session, i.e., this call to the editor.
                    774: 
                    775: _u_n_b_l_o_c_k .  removes  an  undo-block. If executed  at  a  non-
                    776: blocked  state,  i.e., if undo or !undo could operate, types
                    777: not blocked.
                    778: 
                    779: _t_e_s_t .  adds an undo-block at the front  of  undolst.   note
                    780: that  test   together   with  !undo  provide  a  'tentative'
                    781: mode  for editing, i.e., the user can perform  a  number  of
                    782: changes,  and  then  undo  all  of  them with a single !undo
                    783: 
                    784: 
                    785:                                       Printed: July 21, 1983
                    786: 
                    787: 
                    788: 
                    789: 
                    790: 
                    791: 
                    792: 
                    793: The LISP Editor                                        16-13
                    794: 
                    795: 
                    796: command.
                    797: 
                    798: _u_n_d_o_l_s_t [_v_a_l_u_e].  each editor command that causes  structure
                    799: modification  automatically  adds  an  entry to the front of
                    800: undolst containing the information required to  restore  all
                    801: pointers that were changed by the command.
                    802: 
                    803: ??   prints the entries on undolst.  The entries are  listed
                    804: most recent entry first.
                    805: ____________________________________________________________
                    806: 
                    807: 
                    808: 
                    809: 
                    810: 
                    811:    16.10.  Commands that Evaluate
                    812: 
                    813: ____________________________________________________________
                    814: 
                    815: _E_V_A_L_U_A_T_I_O_N _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    816: 
                    817: _e .  only when typed in, (i.e., (insert  d  before  e)  will
                    818: treat  e  as  a  pattern) causes  the  editor  to  call  the
                    819: lisp interpreter giving it the next input as argument.
                    820: 
                    821: (_e  _x)  evaluates  x, and prints the result.  (e x  t)  same
                    822: as (e x) but does not print.
                    823: 
                    824: (_i _c _x_1 ... _x_n)  same as (c y1 ...  yn) where yi=(eval  xi).
                    825: example:   (i  3  (cdr foo)) will replace the 3rd element of
                    826: the current expression with the cdr of the value of foo.  (i
                    827: n foo (car fie)) will attach the value of foo and car of the
                    828: value of fie to the end of the current  expression.   (i  f=
                    829: foo t) will search for an expression eq to the value of foo.
                    830: If c is not an atom, it is evaluated as well.
                    831: 
                    832: (_c_o_m_s _x_1 ... _x_n) .  each  xi  is  evaluated  and  its  value
                    833: executed as a command.  The i command is not very convenient
                    834: for computing an entire edit command for  execution,   since
                    835: it  computes  the command name and its arguments separately.
                    836: also, the i command cannot be used  to  compute  an   atomic
                    837: command.   The  coms  and comsq  commands provide more  gen-
                    838: eral ways of computing commands.  (coms  (cond  (x  (list  1
                    839: x))))  will replace the first element of the current expres-
                    840: sion with the value of x if non-nil, otherwise  do  nothing.
                    841: (nil as a command is a nop.)
                    842: 
                    843: (_c_o_m_s_q _c_o_m_1 ... _c_o_m_n) .  executes com1 ... comn.   comsq  is
                    844: mainly  useful in conjunction with the  coms command.    for
                    845: example,  suppose the user wishes to compute an entire  list
                    846: of  commands  for  evaluation,  as opposed to computing each
                    847: command one at a time  as does  the coms command.  he  would
                    848: then  write  (coms  (cons (quote comsq) x)) where x computed
                    849: 
                    850: 
                    851:                                       Printed: July 21, 1983
                    852: 
                    853: 
                    854: 
                    855: 
                    856: 
                    857: 
                    858: 
                    859: The LISP Editor                                        16-14
                    860: 
                    861: 
                    862: the list of commands, e.g.,   (coms   (cons   (quote  comsq)
                    863: (get  foo (quote commands))))
                    864: ____________________________________________________________
                    865: 
                    866: 
                    867: 
                    868: 
                    869: 
                    870:    16.11.  Commands that Test
                    871: 
                    872: ____________________________________________________________
                    873: 
                    874: _T_E_S_T_I_N_G _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                    875: 
                    876: (_i_f _x)  generates an error unless the value of (eval  x)  is
                    877: non-nil,  i.e., if (eval x) causes an error or (eval x)=nil,
                    878: if will cause an error.  (if x coms1 coms2) if (eval  x)  is
                    879: non-nil,  execute  coms1;  if (eval x) causes an error or is
                    880: equal to nil, execute coms2.  (if x coms1)   if   (eval   x)
                    881: is  non-nil,  execute  coms1; otherwise generate  an  error.
                    882: 
                    883: (_l_p . _c_o_m_s) .  repeatedly executes coms, a list of commands,
                    884: until  an   error   occurs.      (lp  f  print (n  t))  will
                    885: attach  a t  at the end of every  print  expression.  (lp  f
                    886: print  (if  (##  3) nil ((n t)))) will attach a t at the end
                    887: of each print expression  which  does  not  already  have  a
                    888: second  argument.   (i.e.   the  form   (## 3) will cause an
                    889: error if the edit command 3 causes an error, thereby select-
                    890: ing  ((n t)) as the list of commands to be executed.  The if
                    891: could also  be written  as  (if  (cddr (##)) nil ((n t))).).
                    892: 
                    893: (_l_p_q . _c_o_m_s)  same as lp but does not print n occurrences.
                    894: 
                    895: (_o_r_r _c_o_m_s_1 ... _c_o_m_s_n) .  orr begins by  executing  coms1,  a
                    896: list  of  commands.   If  no  error occurs, orr is finished.
                    897: otherwise, orr restores the edit  chain  to   its   original
                    898: value,   and  continues by executing coms2, etc.  If none of
                    899: the command lists execute without  errors,   i.e.,  the  orr
                    900: "drops off the end", orr generates an error.  otherwise, the
                    901: edit chain is left as of the completion of the first command
                    902: list  which executes  without error.
                    903: ____________________________________________________________
                    904: 
                    905: 
                    906: 
                    907: 
                    908: 
                    909:    16.12.  Editor Macros
                    910: 
                    911:       Many of the more sophisticated branching  commands  in
                    912:       the  editor, such as orr, if,  etc.,  are  most  often
                    913:       used  in  conjunction with  edit  macros.   The  macro
                    914:       feature  permits  the  user to define new commands and
                    915: 
                    916: 
                    917:                                       Printed: July 21, 1983
                    918: 
                    919: 
                    920: 
                    921: 
                    922: 
                    923: 
                    924: 
                    925: The LISP Editor                                        16-15
                    926: 
                    927: 
                    928:       thereby  expand  the  editor's  repertoire.  (however,
                    929:       built in commands always  take  precedence  over  mac-
                    930:       ros, i.e.,  the  editor's repertoire can be  expanded,
                    931:       but  not  modified.) macros are defined by using the m
                    932:       command.
                    933: 
                    934:       (_m _c . _c_o_m_s)  for c an atom, m defines c as an  atomic
                    935:       command.   (if a macro  is  redefined, its new defini-
                    936:       tion replaces its old.) executing c is then  the  same
                    937:       as  executing  the  list of  commands  coms.    macros
                    938:       can  also define list commands,  i.e.,  commands  that
                    939:       take  arguments.  (m (c) (arg[1] ... arg[n]) . coms) c
                    940:       an atom.  m defines c as a list command.  executing (c
                    941:       e1  ...   en)  is then  performed  by substituting  e1
                    942:       for  arg[1],  ...    en  for arg[n]  throughout  coms,
                    943:       and  then  executing  coms.   a  list  command  can be
                    944:       defined via a macro  so  as  to   take   a  fixed   or
                    945:       indefinite   number  of  'arguments'.   The form given
                    946:       above specified a macro with a fixed number  of  argu-
                    947:       ments,  as indicated by its argument list.   if the of
                    948:       arguments.  (m (c) args . coms) c,  args  both  atoms,
                    949:       defines  c as  a  list command.  executing  (c  e1 ...
                    950:       en) is performed by substituting (e1 ...   en),  i.e.,
                    951:       cdr of the command, for args throughout coms, and then
                    952:       executing coms.
                    953: 
                    954:       (m bp bk up p) will define bp as  an  atomic   command
                    955:       which   does three things,  a bk, an up, and a p. note
                    956:       that macros can use commands defined by macros as well
                    957:       as  built  in  commands  in  their definitions.    for
                    958:       example, suppose  z  is  defined by (m z -1 (if  (null
                    959:       (##))  nil  (p))),  i.e.  z does a -1, and then if the
                    960:       current expression is not nil, a p. now we can  define
                    961:       zz  by  (m zz  -1 z), and zzz by (m zzz -1 -1 z) or (m
                    962:       zzz -1 zz).  we could define a more general bp  by  (m
                    963:       (bp)  (n) (bk n) up p).    (bp 3)  would  perform  (bk
                    964:       3), followed  by  an  up,  followed  by a p.  The com-
                    965:       mand  second  can  be defined as a macro by (m (2nd) x
                    966:       (orr ((lc .  x) (lc .  x)))).
                    967: 
                    968:       Note  that  for  all editor commands, 'built in'  com-
                    969:       mands  as  well  as commands defined by macros, atomic
                    970:       definitions  and  list  definitions   are   completely
                    971:       independent.   in  other  words,  the  existence of an
                    972:       atomic definition for c in no way  affects  the treat-
                    973:       ment  of  c  when it appears as car of a list command,
                    974:       and the existence of a list definition for c in no way
                    975:       affects  the  treatment  of   c  when it appears as an
                    976:       atom.  in particular, c can be used  as  the  name  of
                    977:       either  an atomic command, or a list command, or both.
                    978:       in the latter case, two  entirely  different   defini-
                    979:       tions   can   be   used.    note  also  that once c is
                    980:       defined as an atomic command via a  macro  definition,
                    981: 
                    982: 
                    983:                                       Printed: July 21, 1983
                    984: 
                    985: 
                    986: 
                    987: 
                    988: 
                    989: 
                    990: 
                    991: The LISP Editor                                        16-16
                    992: 
                    993: 
                    994:       it  will  not  be searched for when used in a location
                    995:       specification, unless c is preceded by an f.   (insert
                    996:       --   before  bp)  would not search for bp, but instead
                    997:       perform a bk, an up, and a p, and then do  the  inser-
                    998:       tion.  The corresponding also holds true for list com-
                    999:       mands.
                   1000: 
                   1001:       (_b_i_n_d . _c_o_m_s)  bind  is  an  edit   command  which  is
                   1002:       useful  mainly  in macros.  it binds three dummy vari-
                   1003:       ables #1, #2, #3, (initialized to nil), and then  exe-
                   1004:       cutes   the   edit  commands   coms.   note that these
                   1005:       bindings are only in effect  while  the  commands  are
                   1006:       being executed, and that bind can be used recursively;
                   1007:       it will  rebind #1, #2,   and   #3  each  time  it  is
                   1008:       invoked.
                   1009: 
                   1010:       _u_s_e_r_m_a_c_r_o_s  [_v_a_l_u_e].   this   variable   contains  the
                   1011:       users editing macros .   if you want to save your mac-
                   1012:       ros then you  should  save  usermacros.   you   should
                   1013:       probably  also  save editcomsl.
                   1014: 
                   1015:       _e_d_i_t_c_o_m_s_l [_v_a_l_u_e].  editcomsl  is  the  list of  "list
                   1016:       commands"  recognized  by  the editor.  (these are the
                   1017:       ones of the form (command arg1 arg2 ...).)
                   1018: 
                   1019: 
                   1020: 
                   1021: 
                   1022:    16.13.  Miscellaneous Editor Commands
                   1023: 
                   1024: ____________________________________________________________
                   1025: 
                   1026: _M_I_S_C_E_L_L_A_N_E_O_U_S _E_D_I_T_O_R _C_O_M_M_A_N_D _S_U_M_M_A_R_Y
                   1027: 
                   1028: _o_k .  Exits from the editor.
                   1029: 
                   1030: _n_i_l .  Unless preceded by f or bf, is always a  null  opera-
                   1031: tion.
                   1032: 
                   1033: _t_t_y:  .  Calls  the  editor  recursively.  The user can then
                   1034: type in commands, and have them executed.  The tty:  command
                   1035: is completed when  the  user exits  from  the lower   editor
                   1036: (with   ok   or  stop).  the tty:  command is extremely use-
                   1037: ful. it enables the user to  set  up a  complex   operation,
                   1038: and   perform   interactive attention-changing commands part
                   1039: way through it. for example the command  (move  3  to  after
                   1040: cond  3  p  tty:)  allows  the user to interact, in  effect,
                   1041: within  the move  command.      he can  verify  for  himself
                   1042: that  the  correct  location has been found, or complete the
                   1043: specification "by hand". in effect, tty: says "I'll tell you
                   1044: what you should do when you get there."
                   1045: 
                   1046: _s_t_o_p .  exits from the editor with an error.  mainly for use
                   1047: 
                   1048: 
                   1049:                                       Printed: July 21, 1983
                   1050: 
                   1051: 
                   1052: 
                   1053: 
                   1054: 
                   1055: 
                   1056: 
                   1057: The LISP Editor                                        16-17
                   1058: 
                   1059: 
                   1060: in  conjunction  with  tty:  commands that the user wants to
                   1061: abort.  since all of the commands in the editor are   errset
                   1062: protected, the user must exit from the editor via a command.
                   1063: stop provides a way of distinguishing between  a  successful
                   1064: and unsuccessful  (from the user's  standpoint) editing ses-
                   1065: sion.
                   1066: 
                   1067: _t_l .  tl  calls (top-level).  to return to the  editor  just
                   1068: use the _r_e_t_u_r_n top-level command.
                   1069: 
                   1070: _r_e_p_a_c_k .  permits the 'editing' of an atom or string.
                   1071: 
                   1072: (_r_e_p_a_c_k $) does (lc . $) followed by  repack,  e.g.  (repack
                   1073: this@).
                   1074: 
                   1075: (_m_a_k_e_f_n _f_o_r_m _a_r_g_s _n _m) .  makes (car form) an expr with  the
                   1076: nth  through mth  elements  of  the  current expression with
                   1077: each occurrence  of  an element of (cdr  form)  replaced  by
                   1078: the  corresponding  element  of  args.   The nth through mth
                   1079: elements  are replaced  by form.
                   1080: 
                   1081: (_m_a_k_e_f_n _f_o_r_m _a_r_g_s _n).  same as (makefn form args n n).
                   1082: 
                   1083: (_s _v_a_r . $) .  sets var (using setq) to the current  expres-
                   1084: sion  after  performing  (lc .    $).    (s  foo)  will  set
                   1085: foo to the current expression, (s foo -1 1) will set foo  to
                   1086: the first element in the last element of the current expres-
                   1087: sion.
                   1088: ____________________________________________________________
                   1089: 
                   1090: 
                   1091: 
                   1092: 
                   1093: 
                   1094:    16.14.  Editor Functions
                   1095: 
                   1096: 
                   1097: (editf s_x1 ...)
                   1098: 
                   1099:      SIDE EFFECT: edits a function. s_x1 is the name of  the
                   1100:                   function,  any additional arguments are an
                   1101:                   optional list of commands.
                   1102: 
                   1103:      RETURNS: s_x1.
                   1104: 
                   1105:      NOTE: if s_x1 is not an editable function,  editf  gen-
                   1106:            erates an fn not editable error.
                   1107: 
                   1108: 
                   1109: 
                   1110: 
                   1111: 
                   1112: 9
                   1113: 
                   1114: 9                                      Printed: July 21, 1983
                   1115: 
                   1116: 
                   1117: 
                   1118: 
                   1119: 
                   1120: 
                   1121: 
                   1122: The LISP Editor                                        16-18
                   1123: 
                   1124: 
                   1125: (edite l_expr l_coms s_atm))
                   1126: edits an expression.  its  value  is  the  last  element  of
                   1127: (editl (list l_expr) l_coms s_atm nil nil).
                   1128: 
                   1129: 
                   1130: (editracefn s_com)
                   1131: is available to help the user debug complex edit macros,  or
                   1132: subroutine  calls  to   the   editor.  editracefn  is  to be
                   1133: defined by the user.  whenever the value of  editracefn   is
                   1134: non-nil,   the   editor   calls  the   function   editracefn
                   1135: before executing  each command (at  any  level),  giving  it
                   1136: that command as its argument.  editracefn is initially equal
                   1137: to nil, and undefined.
                   1138: 
                   1139: 
                   1140: (editv s_var [ g_com1 ... ])
                   1141: 
                   1142:      SIDE EFFECT: similar  to  editf,  for  editing  values.
                   1143:                   editv  sets  the  variable  to  the  value
                   1144:                   returned.
                   1145: 
                   1146:      RETURNS: the name  of  the  variable  whose  value  was
                   1147:               edited.
                   1148: 
                   1149: 
                   1150: (editp s_x)
                   1151: 
                   1152:      SIDE EFFECT: similar  to  editf  for  editing  property
                   1153:                   lists. used if x is nil.
                   1154: 
                   1155:      RETURNS: the atom whose property list was edited.
                   1156: 
                   1157: 
                   1158: (editl coms atm marklst mess)
                   1159: 
                   1160:      SIDE EFFECT: editl is the editor.  its  first  argument
                   1161:                   is  the  edit  chain,  and its value is an
                   1162:                   edit chain, namely the value of l  at  the
                   1163:                   time  editl  is  exited.   (l is a special
                   1164:                   variable, and so can be examined or set by
                   1165:                   edit  commands.    ^  is  equivalent to (e
                   1166:                   (setq l(last l)) t).)  coms is an optional
                   1167:                   list  of  commands.  for interactive edit-
                   1168:                   ing, coms is nil.   in  this  case,  editl
                   1169:                   types  edit  and then waits for input from
                   1170:                   the teletype.  (if mess is not  nil  editl
                   1171:                   types  it  instead  of edit.  for example,
                   1172:                   the tty:  command is essentially  (setq  l
                   1173:                   (editl  l  nil  nil  nil  (quote tty:))).)
                   1174:                   exit occurs only via an ok, stop, or  save
                   1175:                   command.   If  coms is not nil, no message
                   1176:                   is typed,  and  each  member  of  coms  is
                   1177:                   treated  as a command and executed.  If an
                   1178: 
                   1179: 
                   1180:                                       Printed: July 21, 1983
                   1181: 
                   1182: 
                   1183: 
                   1184: 
                   1185: 
                   1186: 
                   1187: 
                   1188: The LISP Editor                                        16-19
                   1189: 
                   1190: 
                   1191:                   error occurs in the execution  of  one  of
                   1192:                   the  commands, no error message is printed
                   1193:                   , the rest of the  commands  are  ignored,
                   1194:                   and  editl  exits with an error, i.e., the
                   1195:                   effect is the same as though a  stop  com-
                   1196:                   mand  had  been executed.  If all commands
                   1197:                   execute successfully,  editl  returns  the
                   1198:                   current  value  of l.  marklst is the list
                   1199:                   of marks.  on calls from editf, atm is the
                   1200:                   name  of  the  function  being  edited; on
                   1201:                   calls from editv, the name  of  the  vari-
                   1202:                   able,  and  calls  from editp, the atom of
                   1203:                   which some property of its  property  list
                   1204:                   is being edited.  The property list of atm
                   1205:                   is used by the save command for saving the
                   1206:                   state  of  the  edit.   save will not save
                   1207:                   anything if  atm=nil  i.e.,  when  editing
                   1208:                   arbitrary  expressions  via edite or editl
                   1209:                   directly.
                   1210: 
                   1211: 
                   1212: (editfns s_x [ g_coms1 ... ])
                   1213: fsubr function, used to perform the same editing  operations
                   1214: on  several  functions.  editfns maps down the list of func-
                   1215: tions, prints the name of each function, and calls the  edi-
                   1216: tor (via editf) on that function.
                   1217: 
                   1218:      EXAMPLE: editfns foofns (r fie fum)) will change  every
                   1219:               fie   to   fum   in  each  of the functions on
                   1220:               foofns.
                   1221: 
                   1222:      NOTE: the  call  to  the  editor is  errset  protected,
                   1223:            so  that if the editing of one function causes an
                   1224:            error, editfns will proceed to  the  next   func-
                   1225:            tion.     in  the  above  example,  if one of the
                   1226:            functions did not contain a fie,  the  r  command
                   1227:            would   cause   an  error, but editing would con-
                   1228:            tinue with  the  next  function.   The  value  of
                   1229:            editfns is nil.
                   1230: 
                   1231: 
                   1232: (edit4e pat y)
                   1233: 
                   1234:      SIDE EFFECT: is the pattern match routine.
                   1235: 
                   1236:      RETURNS: t if pat matches y. see edit-match for defini-
                   1237:               tion of 'match'.
                   1238: 
                   1239:      NOTE: before  each  search  operation  in  the   editor
                   1240:            begins,  the   entire   pattern  is  scanned  for
                   1241:            atoms  or strings that end  in  at-signs.   These
                   1242:            are  replaced  by  patterns  of  the  form  (cons
                   1243:            (quote  /@)  (explodec   atom)).       from   the
                   1244: 
                   1245: 
                   1246:                                       Printed: July 21, 1983
                   1247: 
                   1248: 
                   1249: 
                   1250: 
                   1251: 
                   1252: 
                   1253: 
                   1254: The LISP Editor                                        16-20
                   1255: 
                   1256: 
                   1257:            standpoint   of  edit4e, pattern type 5, atoms or
                   1258:            strings  ending  in  at-signs,  is   really   "if
                   1259:            car[pat]  is the atom @ (at-sign), pat will match
                   1260:            with  any  literal atom  or  string  whose   ini-
                   1261:            tial   character codes (up to the @) are the same
                   1262:            as those in cdr[pat]." if  the  user  wishes   to
                   1263:            call  edit4e  directly, he must therefore convert
                   1264:            any patterns which contain   atoms   or   strings
                   1265:            ending  in  at-signs  to  the  form recognized by
                   1266:            edit4e.   this  can  be  done  via  the  function
                   1267:            editfpat.
                   1268: 
                   1269: (editfpat pat flg)
                   1270: makes a copy of pat with all patterns of type 5  (see  edit-
                   1271: match)  converted to the form expected by edit4e. flg should
                   1272: be passed as nil (flg=t is for internal use by the editor).
                   1273: 
                   1274: 
                   1275: (editfindp x pat flg)
                   1276: 
                   1277:      NOTE: Allows a program to use the edit find command  as
                   1278:            a  pure  predicate from outside the editor.  x is
                   1279:            an expression, pat a pattern.  The value of edit-
                   1280:            findp  is  t  if the command f pat would succeed,
                   1281:            nil otherwise.  editfindp calls editfpat to  con-
                   1282:            vert  pat  to the form expected by edit4e, unless
                   1283:            flg=t.    if the program is applying editfindp to
                   1284:            several different expressions using the same pat-
                   1285:            tern, it will be more efficient to call  editfpat
                   1286:            once,  and then call editfindp with the converted
                   1287:            pattern and flg=t.
                   1288: 
                   1289: 
                   1290: (## g_com1 ...)
                   1291: 
                   1292:      RETURNS: what the current  expression  would  be  after
                   1293:               executing the edit commands com1 ...  starting
                   1294:               from the present  edit  chain.   generates  an
                   1295:               error  if  any  of  comi  cause  errors.   The
                   1296:               current edit chain is never changed.  example:
                   1297:               (i  r  (quote x) (## (cons ..z))) replaces all
                   1298:               x's in the current  expression  by  the  first
                   1299:               cons containing a z.
                   1300: 
                   1301: 
                   1302: 
                   1303: 
                   1304: 
                   1305: 
                   1306: 
                   1307: 
                   1308: 
                   1309: 9
                   1310: 
                   1311: 9                                      Printed: July 21, 1983
                   1312: 
                   1313: 
                   1314: 

unix.superglobalmegacorp.com

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