agent-skills/acme-api/SKILL.md

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