|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.