From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: Date: Sun, 12 Nov 2006 00:39:27 +0000 From: "Arvindh Rajesh Tamilmani" To: 9fans@cse.psu.edu MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Subject: [9fans] edit -- a new acme(4) file Topicbox-Message-UUID: ddaf6e3e-ead1-11e9-9d60-3106f5b1d025 A quick-and-dirty patch to acme that introduces 'edit', a new acme(4) file, to which Edit commands can be written. With this, echo -n ',d' >/mnt/acme/$winid/edit would delete the window's content. I am planning to port this to Acme SAC, so that I can write acme scripts that don't depend on sed/ed, which are only partially implemented in Inferno. Comments welcome. Thanks. Arvindh acme-sources/dat.h:14,19 - acme/dat.h:14,20 QWbody, QWctl, QWdata, + QWedit, QWeditout, QWerrors, QWevent, diff -c acme-sources/fsys.c acme/fsys.c acme-sources/fsys.c:80,85 - acme/fsys.c:80,86 { "body", QTAPPEND, QWbody, 0600|DMAPPEND }, { "ctl", QTFILE, QWctl, 0600 }, { "data", QTFILE, QWdata, 0600 }, + { "edit", QTFILE, QWedit, 0200 }, { "editout", QTFILE, QWeditout, 0200 }, { "errors", QTFILE, QWerrors, 0200 }, { "event", QTFILE, QWevent, 0600 }, diff -c acme-sources/xfid.c acme/xfid.c acme-sources/xfid.c:110,116 - acme/xfid.c:110,119 break; case QWdata: case QWxdata: + case QWedit: w->nopen[q]++; + seq++; + filemark(t->file); break; case QWevent: if(w->nopen[q]++ == 0){ acme-sources/xfid.c:215,226 - acme/xfid.c:218,230 break; case QWdata: case QWxdata: + case QWedit: w->nomark = FALSE; /* fall through */ case QWaddr: case QWevent: /* BUG: do we need to shut down Xfid? */ if(--w->nopen[q] == 0){ - if(q == QWdata || q == QWxdata) + if(q == QWdata || q == QWxdata || q == QWedit) w->nomark = FALSE; if(q==QWevent && !w->isdir && w->col!=nil){ w->filemenu = TRUE; acme-sources/xfid.c:423,428 - acme/xfid.c:427,445 break; } w->addr = a; + fc.count = x->count; + respond(x, &fc, nil); + break; + + case QWedit: + x->data[x->count] = 0; + r = bytetorune(x->data, &nr); + t = &w->body; + wincommit(w, t); + if(w->nomark == FALSE) + seq++; + editcmd(t, r, nr); + free(r); fc.count = x->count; respond(x, &fc, nil); break;