2.7 KiB
2.7 KiB
| name | intent | description | version |
|---|---|---|---|
| acme-api | api, acme | Programming the acme text editor 9P API. Use when writing code to control acme windows, handle events, manipulate text, or integrate with acme via its file interface. | 1.1.0 |
Acme 9P API (plan9port)
Control acme via 9P. Use 9p read/write acme/...
Files
acme/
├── cons # command stdout/stderr
├── index # all windows: id tag_len body_len isdir dirty tag (fields @0,12,24,36,48,60)
├── log # operations (blocks): id op name (ops: new,zerox,get,put,del)
├── new/ctl # read returns new window id
└── $id/
├── addr # set/query addresses (write addr, read #m,#n char offsets)
├── body # content (read any offset, write appends)
├── ctl # read: 10 fields (id tag_len body_len isdir dirty width font tabwidth undo redo)
│ # write: commands (see below)
├── data # read/write at addr, advances to end
├── errors # append to dir/+Errors
├── event # event stream (see protocol)
├── tag # tag content (read any offset, write appends)
└── xdata # like data but stops at end, no advance
ctl Commands
addr=dot clean dirty cleartag del delete dot=addr dump cmd dumpdir /path get put font /path limit=addr mark nomark name /path show
addr Syntax
0 $ 0,$ 123 123,456 /regex/ -/regex/ .,+#10 .+/regex/
Event Protocol
Format: origin type q0 q1 flag nr [text]\n
Origin: E=file write F=other file K=keyboard M=mouse
Type: D/d=delete body/tag, I/i=insert body/tag, L/l=button3 body/tag, R/r=shift-button3 body/tag, X/x=button2 body/tag
flag (bitwise OR):
- X/x: 1=builtin, 2=expansion follows, 8=chorded (2 msgs follow: arg, origin)
- L/l: 1=acme handles, 2=expansion follows, 4=file/window name
nr: char count (0 if text >256, read from data)
Acknowledge: flag&1 events write back origin type q0 q1\n
Patterns
Create:
id=$(9p read acme/new/ctl | awk '{print $1}')
echo "name /path" | 9p write acme/$id/ctl
echo "content" | 9p write acme/$id/body
echo "show" | 9p write acme/$id/ctl
Event loop:
read acme/$id/event → parse → handle → ack if flag&1 → repeat (EOF=closed)
Text:
echo '0,$' | 9p write acme/$id/addr
9p read acme/$id/data
echo "new" | 9p write acme/$id/data
Key Points
- addr: char offsets (not bytes)
- body/tag: write appends (offset ignored)
- data: uses addr, advances
- xdata: stops at end
- Events: ack flag&1, text >256 elided (nr=0)
- Unread events block acme