Blob


1 .TH ACMEEVENT 1
2 .SH NAME
3 acmeevent, acme.rc \- shell script support for acme clients
4 .SH SYNOPSIS
5 .B 9p
6 .B read
7 .B acme/acme/$winid/event | acmeevent
8 .PP
9 .B
10 \&. \*9/lib/acme.rc
11 .PP
12 .B newwindow
13 .PP
14 .B winread
15 .I file
16 .PP
17 .B winwrite
18 .I file
19 .PP
20 .B winctl
21 .I cmd
22 .PP
23 .B windump
24 [
25 .I dumpdir
26 |
27 .B -
28 ]
29 [
30 .I dumpcmd
31 |
32 .B -
33 ]
34 .PP
35 .B winname
36 .I name
37 .PP
38 .B windel
39 [
40 .B sure
41 ]
42 .PP
43 .B winwriteevent
44 .I c1
45 .I c2
46 .I q0
47 .I q1
48 [
49 .I eq0
50 .I eq1
51 .I flag
52 .I textlen
53 .I text
54 .I chordarg
55 .I chordaddr
56 ]
57 .PP
58 .B wineventloop
59 .SH DESCRIPTION
60 .I Acmeevent
61 and
62 .I acme.rc
63 make it easy to write simple
64 .MR acme (1)
65 client programs as shell scripts.
66 .PP
67 .I Acme
68 clients read the
69 .B event
70 files
71 (see
72 .MR acme (4) )
73 for the windows they control, reacting to the events.
74 The events are presented in a format that is easy to read with C programs
75 but hard to read with shell scripts.
76 .PP
77 .I Acmeevent
78 reads an
79 .MR acme (4)
80 event stream from standard input, printing a shell-friendly
81 version of the events, one per line, on standard output.
82 Each output line from
83 .I acmeevent
84 has the form:
85 .IP
86 .B event
87 .I c1
88 .I c2
89 .I q0
90 .I q1
91 .I eq0
92 .I eq1
93 .I flag
94 .I textlen
95 .I text
96 .I chordarg
97 .I chordaddr
98 .PP
99 The fields are:
100 .TP
101 .I c1
102 A character indicating the origin or cause of the action.
103 The possible causes are:
104 a write to the body or tag file
105 .RB ( E ),
106 a write to the window's other files
107 .RB ( F ),
108 input via the keyboard
109 .RB ( K ),
110 and
111 input via the mouse
112 .RB ( M ).
113 .TP
114 .I c2
115 A character indicating the type of action.
116 The possible types are:
117 text deleted from the body
118 .RB ( D ),
119 text deleted from the tag
120 .RB ( d ),
121 text inserted in the body
122 .RB ( I ),
123 text inserted in the tag
124 .RB ( i ),
125 a button 3 action in the body
126 .RB ( L ),
127 a button 3 action in the tag
128 .RB ( l ),
129 a button 2 action in the body
130 .RB ( X ),
131 and
132 a button 2 action in the tag
133 .RB ( x ).
134 .TP
135 .I q0\fR, \fPq1
136 The character addresses of the action.
137 .TP
138 .I eq0\fR, \fPq1
139 The expanded character addresses of the action.
140 If the text indicated by
141 .IR q0 ,
142 .I q1
143 is a null string that has a non-null expansion,
144 .IR eq0 ,
145 .I eq1
146 are the addresses of the expansion.
147 Otherwise they are the same as
148 .IR q0 ,
149 .IR q1 .
150 .TP
151 .I flag
152 .I Flag
153 is a bitwise OR (reported decimally) of the following:
154 1 if the text indicated is recognized as an
155 .I acme
156 built-in command;
157 2 if the text indicated is a null string that has a non-null expansion
158 (see
159 .IR eq0 ,
160 .I eq1
161 above);
162 8 if the command has an extra (chorded) argument
163 (see
164 .I chordarg
165 below).
166 .I Flag
167 remains from the
168 .MR acme (4)
169 event format.
170 Because
171 .IR eq0 ,
172 .IR eq1 ,
173 and
174 .I chordarg
175 are explicit in each event
176 (unlike in
177 .MR acme (4)
178 events),
179 .I flag
180 can usually be ignored.
181 .TP
182 .I textlen
183 The length of the action text (or its expansion) for button 2 and button 3 events in characters.
184 .TP
185 .I text
186 If
187 .I textlen
188 is less than 256 chracters,
189 .I text
190 is the action text itself.
191 Otherwise it is an empty string and must be read from the
192 .B data
193 file.
194 .TP
195 .I chordarg
196 The chorded argument for an action.
197 .TP
198 .I chordorigin
199 If the chord argument is in the body of a named window,
200 .I chordorigin
201 specifies the full address of the argument,
202 as in
203 .BR /etc/group:#123,#234 .
204 .PD
205 .PP
206 To experiment with
207 .IR acmeevent ,
208 create an empty window in
209 .I acme
210 (using
211 .IR New ), type
212 .IP
213 .EX
214 9p read acme/$winid/event | acmeevent
215 .EE
216 .LP
217 inside it, and execute it.
218 Actions performed on the window will be printed as events in the
219 .B +Errors
220 window.
221 .PP
222 .I Acme.rc
223 is a library of
224 .MR rc (1)
225 shell functions useful for writing acme clients.
226 .PP
227 .I Newwindow
228 creates a new acme window and sets
229 .B $winid
230 to the new window's id.
231 The other commands all use
232 .B $winid
233 to determine which window to operate on.
234 .PP
235 .I Winread
236 prints the current window's
237 .I file
238 to standard output.
239 It is equivalent to
240 .B cat
241 .BI /mnt/acme/acme/$winid/ file
242 on Plan 9.
243 Similarly,
244 .I winwrite
245 writes standard input to the current window's
246 .IR file .
247 .I Winread
248 and
249 .I winwrite
250 are useful mainly in building more complex functions.
251 .PP
252 .I Winctl
253 writes
254 .I cmd
255 to the window's
256 .B ctl
257 file.
258 The most commonly-used command is
259 .BR clean ,
260 which marks the window as clean.
261 See
262 .MR acme (4)
263 for a full list of commands.
264 .PP
265 .I Windump
266 sets the window's dump directory
267 and dump command
268 (see
269 .MR acme (4) ).
270 If either argument is omitted or is
271 .BR - ,
272 that argument is not set.
273 .PP
274 .I Winname
275 sets the name displayed in the window's tag.
276 .PP
277 .I Windel
278 simulates the
279 .B Del
280 command. If the argument
281 .B sure
282 is given, it simulates the
283 .B Delete
284 command.
285 .PP
286 .I Winwriteevent
287 writes an event to the window's event file.
288 The event is in the format produced by
289 .IR acmeevent .
290 Only the first four arguments are necessary:
291 the rest are ignored.
292 Event handlers should call
293 .I winwriteevent
294 to pass unhandled button 2 or button 3 events
295 back to
296 .I acme
297 for processing.
298 .PP
299 .I Wineventloop
300 executes the current window's event file, as output by
301 .IR acmeevent .
302 It returns when the window has been deleted.
303 Before running
304 .I wineventloop ,
305 clients must define a shell function named
306 .BR event ,
307 which will be run for each incoming event,
308 as
309 .I rc
310 executes the output of
311 .IR acmeevent .
312 A typical event function need only worry about button 2 and button 3 events.
313 Those events not handled should be sent back to
314 .I acme
315 with
316 .IR winwriteevent .
317 .SH EXAMPLE
318 .IR Adict ,
319 a dictionary browser,
320 is implemented using
321 .I acmeevent
322 and
323 .IR acme.rc .
324 The
325 .I event
326 handler is:
327 .IP
328 .EX
329 .ta +4n +4n +4n +4n +4n +4n
330 fn event {
331 switch($1$2){
332 case Mx MX # button 2 - pass back to acme
333 winwriteevent $*
334 case Ml ML # button 3 - open new window on dictionary or entry
336 if(~ $dict NONE)
337 dictwin /adict/$7/ $7
338 if not
339 dictwin /adict/$dict/$7 $dict $7
340 } &
343 .EE
344 .LP
345 Note that the button 3 handler starts a subshell in which to run
346 .IR dictwin .
347 That subshell will create a new window, set its name,
348 possibly fill the window with a dictionary list or dictionary entry,
349 mark the window as clean, and run the event loop:
350 .IP
351 .EX
352 fn dictwin {
353 newwindow
354 winname $1
355 dict=$2
356 if(~ $dict NONE)
357 dict -d '?' >[2=1] | sed 1d | winwrite body
358 if(~ $#* 3)
359 dict -d $dict $3 >[2=1] | winwrite body
360 winctl clean
361 wineventloop
363 .EE
364 .LP
365 The script starts with an initial window:
366 .IP
367 .EX
368 dictwin /adict/ NONE
369 .EE
370 .LP
371 Button 3 clicking on a dictionary name in the initial window
372 will create a new empty window for that dictionary.
373 Typing and button 3 clicking on a word in that window
374 will create a new window with the dictionary's entry for that word.
375 .PP
376 See
377 .B \*9/bin/adict
378 for the full implementation.
379 .SH SOURCE
380 .B \*9/src/cmd/acmeevent.c
381 .br
382 .B \*9/lib/acme.rc
383 .SH SEE ALSO
384 .MR acme (1) ,
385 .MR acme (4) ,
386 .MR rc (1)
387 .SH BUGS
388 There is more that could be done to ease the writing
389 of complicated clients.