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;

Reply via email to