]> git.lizzy.rs Git - plan9front.git/commitdiff
merge
authorcinap_lenrek <cinap_lenrek@felloff.net>
Mon, 6 Aug 2018 21:14:59 +0000 (23:14 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Mon, 6 Aug 2018 21:14:59 +0000 (23:14 +0200)
12 files changed:
acme/bin/source/win/main.c
rc/bin/"
sys/man/1/acme
sys/man/3/ip
sys/src/9/port/devaoe.c
sys/src/cmd/acme/acme.c
sys/src/cmd/acme/dat.h
sys/src/cmd/acme/exec.c
sys/src/cmd/acme/look.c
sys/src/cmd/acme/text.c
sys/src/cmd/acme/util.c
sys/src/cmd/acme/wind.c

index 214356a4827097a338b2669d9f95343b2c051853..a5994fcb002fa7f18d34f48c9360316811fb9bed 100644 (file)
@@ -634,6 +634,7 @@ startcmd(char *argv[], int *notepg)
        e->cpid = cpid;
        sprint(buf, "/mnt/wsys/%d", win->id);
        bind(buf, "/dev/acme", MREPL);
+       bind("/dev/acme/body", "/dev/text", MREPL);
        proccreate(execproc, e, EXECSTACK);
        do
                pid = recvul(cpid);
index bb6cd5eec9b2e3ddfcc7f72e0bfd40d1df87726a..4cae3cc61c8168d6b21680711b3dfa5351e6433d 100755 (executable)
--- a/rc/bin/"
+++ b/rc/bin/"
@@ -2,9 +2,6 @@
 
 rfork en
 
-if(test -r /mnt/acme/acme/body)
-       bind /mnt/acme/acme/body /dev/text
-
 PROMPT='[^     ]*(%|;)[        ]+'
 
 fn cmds {
index 2220fa6707040af7f885b70dd4b7668255e97ee0..36fbd8ae316f86266920c3936acccf91e8bd30d8 100644 (file)
@@ -4,7 +4,7 @@ acme, win \- interactive text windows
 .SH SYNOPSIS
 .B acme
 [
-.B -ab
+.B -aib
 ]
 [
 .B -c
@@ -174,6 +174,16 @@ The option
 .B -a
 causes each window to start in 
 autoindent mode.
+.PP
+When a window is in spacesindent mode
+(see the
+.B Spaces
+command below) and a tab character is typed,
+acme indents the line with spaces equal to the current
+tabstop for the window. The option
+.B -i
+causes each window to start in spacesindent
+mode.
 .SS "Directory context
 Each window's tag names a directory: explicitly if the window
 holds a directory; implicitly if it holds a regular file
@@ -430,6 +440,17 @@ Place selected text in snarf buffer.
 Arrange the windows in the column from top to bottom in lexicographical
 order based on their names.
 .TP
+.B Spaces
+Set the spacesindent mode according to the argument:
+.B on
+and
+.B off
+set the mode for the current window;
+.B ON
+and
+.B OFF
+set the mode for all existing and future windows.
+.TP
 .B Tab
 Set the width of tab stops for this window to the value of the argument, in units of widths of the zero
 character.
index 38ae273bceb349bc149291ab35582a1c2cebbbe0..9eb358cff697da27e4c4724ca8f081eea280b8b6 100644 (file)
@@ -111,10 +111,11 @@ as an Ethernet medium carrying IP and ARP packets
 and associate it with this interface.
 The kernel will
 .IR dial (2)
-.IR path !0x800
+.IR path !0x800,
+.IR path !0x86DD
 and
 .IR path !0x806
-and use the two connections for IPv4 and
+and use the three connections for IPv4, IPv6 and
 ARP respectively.
 .TP
 .B "bind pkt
@@ -196,7 +197,7 @@ medium-specific headers.
 .TP
 .BI speed\  n
 Set the maximum transmit speed in bits per second.
-TP
+.TP
 .BI delay\  n
 Set the maximum burst delay in milliseconds. (Default is 40ms)
 When
index 0ef609bd1d4fff5d66259a19bd4251390433527d..ed091df0a7d36735b48a58c51a510b3c82850bc8 100644 (file)
@@ -1728,7 +1728,7 @@ newunit(void)
 {
        int x;
 
-       x = incref(&units);
+       x = incref(&units)-1;
        if(x >= Maxunits){
                decref(&units);
                x = -1;
index 5c67c9bfd3197c86687c2191372d544618a4e87c..69ea715ce1deb8c5b44718ab69dd77531f600481 100644 (file)
@@ -66,7 +66,7 @@ threadmain(int argc, char *argv[])
        loadfile = nil;
        ARGBEGIN{
        case 'a':
-               globalautoindent = TRUE;
+               globalindent[AUTOINDENT] = TRUE;
                break;
        case 'b':
                bartflag = TRUE;
@@ -89,6 +89,9 @@ threadmain(int argc, char *argv[])
                if(fontnames[1] == nil)
                        goto Usage;
                break;
+       case 'i':
+               globalindent[SPACESINDENT] = TRUE;
+               break;
        case 'l':
                loadfile = ARGF();
                if(loadfile == nil)
@@ -96,7 +99,7 @@ threadmain(int argc, char *argv[])
                break;
        default:
        Usage:
-               fprint(2, "usage: acme [-ab] [-c ncol] [-f font] [-F fixedfont] [-l loadfile | file...]\n");
+               fprint(2, "usage: acme [-aib] [-c ncol] [-f font] [-F fixedfont] [-l loadfile | file...]\n");
                exits("usage");
        }ARGEND
 
index 2c4d40d79aad1db4aaa07beb7d294dcc99d2ee5d..070be119b6ac3c939df42ffceb668711df341320 100644 (file)
@@ -224,6 +224,13 @@ void               textsetselect(Text*, uint, uint);
 void           textshow(Text*, uint, uint, int);
 void           texttype(Text*, Rune);
 
+enum
+{
+       SPACESINDENT    = 0,
+       AUTOINDENT,
+       NINDENT,
+};
+
 struct Window
 {
                QLock;
@@ -235,7 +242,7 @@ struct Window
        uchar   isscratch;
        uchar   filemenu;
        uchar   dirty;
-       uchar   autoindent;
+       uchar   indent[NINDENT];
        uchar   showdel;
        uint            noredraw;
        int             id;
@@ -538,7 +545,7 @@ int                 plumbeditfd;
 char                   wdir[];
 int                    editing;
 int                    messagesize;            /* negotiated in 9P version setup */
-int                    globalautoindent;
+int                    globalindent[NINDENT];
 
 Channel        *cplumb;                /* chan(Plumbmsg*) */
 Channel        *cwait;         /* chan(Waitmsg) */
index fa18e8af26529f63d59d2ec7b34cf154e04bf7e9..f504275a5c5ad2b97c3f1539ea637fb8f4132d58 100644 (file)
@@ -73,7 +73,7 @@ Exectab exectab[] = {
        { L"Get",               get,            FALSE,  TRUE,   XXX             },
        { L"ID",                id,             FALSE,  XXX,            XXX             },
        { L"Incl",              incl,           FALSE,  XXX,            XXX             },
-       { L"Indent",    indent, FALSE,  XXX,            XXX             },
+       { L"Indent",    indent,         FALSE,  AUTOINDENT,             XXX             },
        { L"Kill",              kill,           FALSE,  XXX,            XXX             },
        { L"Load",              dump,   FALSE,  FALSE,  XXX             },
        { L"Local",             local,  FALSE,  XXX,            XXX             },
@@ -87,6 +87,7 @@ Exectab exectab[] = {
        { L"Send",              sendx,  TRUE,   XXX,            XXX             },
        { L"Snarf",             cut,            FALSE,  TRUE,   FALSE   },
        { L"Sort",              sort,           FALSE,  XXX,            XXX             },
+       { L"Spaces",    indent,         FALSE,  SPACESINDENT,   XXX             },
        { L"Tab",               tab,            FALSE,  XXX,            XXX             },
        { L"Undo",              undo,   FALSE,  TRUE,   XXX             },
        { L"Zerox",     zeroxx, FALSE,  XXX,            XXX             },
@@ -1087,57 +1088,65 @@ incl(Text *et, Text*, Text *argt, int, int, Rune *arg, int narg)
 enum {
        IGlobal = -2,
        IError = -1,
-       Ion = 0,
-       Ioff = 1,
 };
 
 static int
-indentval(Rune *s, int n)
+indentval(Rune *s, int n, int type)
 {
+       static char *strs[] = {
+               [SPACESINDENT] "Spaces",
+               [AUTOINDENT] "Indent",
+       };
+
        if(n < 2)
                return IError;
        if(runestrncmp(s, L"ON", n) == 0){
-               globalautoindent = TRUE;
-               warning(nil, "Indent ON\n");
+               globalindent[type] = TRUE;
+               warning(nil, "%s ON\n", strs[type]);
                return IGlobal;
        }
        if(runestrncmp(s, L"OFF", n) == 0){
-               globalautoindent = FALSE;
-               warning(nil, "Indent OFF\n");
+               globalindent[type] = FALSE;
+               warning(nil, "%s OFF\n", strs[type]);
                return IGlobal;
        }
-       return runestrncmp(s, L"on", n) == 0;
+       if(runestrncmp(s, L"on", n) == 0)
+               return TRUE;
+       if(runestrncmp(s, L"off", n) == 0)
+               return FALSE;
+       return IError;
 }
 
 static void
-fixindent(Window *w, void*)
+fixindent(Window *w, void *v)
 {
-       w->autoindent = globalautoindent;
+       int t = *(int*)v;
+       w->indent[t] = globalindent[t];
 }
 
 void
-indent(Text *et, Text*, Text *argt, int, int, Rune *arg, int narg)
+indent(Text *et, Text*, Text *argt, int type, int, Rune *arg, int narg)
 {
        Rune *a, *r;
        Window *w;
-       int na, len, autoindent;
+       int na, len, ival;
 
        w = nil;
        if(et!=nil && et->w!=nil)
                w = et->w;
-       autoindent = IError;
+       ival = IError;
        getarg(argt, FALSE, TRUE, &r, &len);
        if(r!=nil && len>0)
-               autoindent = indentval(r, len);
+               ival = indentval(r, len, type);
        else{
                a = findbl(arg, narg, &na);
                if(a != arg)
-                       autoindent = indentval(arg, narg-na);
+                       ival = indentval(arg, narg-na, type);
        }
-       if(autoindent == IGlobal)
-               allwindows(fixindent, nil);
-       else if(w != nil && autoindent >= 0)
-               w->autoindent = autoindent;
+       if(ival == IGlobal)
+               allwindows(fixindent, &type);
+       else if(w != nil && ival >= 0)
+               w->indent[type] = ival;
 }
 
 void
index d8882995a48c7b4c423847bbb19f986fe9c7e545..60ade8b258e31574e6321b5c2932bad6a96b8235 100644 (file)
@@ -663,9 +663,11 @@ openfile(Text *t, Expand *e)
                                runemove(rp, ow->incl[i], n);
                                winaddincl(w, rp, n);
                        }
-                       w->autoindent = ow->autoindent;
+                       for(i=0; i < NINDENT; i++)
+                               w->indent[i] = ow->indent[i];
                }else
-                       w->autoindent = globalautoindent;
+                       for(i=0; i < NINDENT; i++)
+                               w->indent[i] = globalindent[i];
        }
        if(e->a1 == e->a0)
                eval = FALSE;
index 7380d01636256247f11a2d70da794b51525801eb..b96213a68b300dc927a35cddd233d59e8f62bdcb 100644 (file)
@@ -502,6 +502,27 @@ textreadc(Text *t, uint q)
        return r;
 }
 
+static int
+spacesindentbswidth(Text *t)
+{
+       uint q, col;
+       Rune r;
+
+       col = textbswidth(t, 0x15);
+       q = t->q0;
+       while(q > 0){
+               r = textreadc(t, q-1);
+               if(r != ' ')
+                       break;
+               q--;
+               if(--col % t->tabstop == 0)
+                       break;
+       }
+       if(t->q0 == q)
+               return 1;
+       return t->q0-q;
+}
+
 int
 textbswidth(Text *t, Rune c)
 {
@@ -510,8 +531,11 @@ textbswidth(Text *t, Rune c)
        int skipping;
 
        /* there is known to be at least one character to erase */
-       if(c == 0x08)   /* ^H: erase character */
+       if(c == 0x08){  /* ^H: erase character */
+               if(t->what == Body && t->w->indent[SPACESINDENT])
+                       return spacesindentbswidth(t);
                return 1;
+       }
        q = t->q0;
        skipping = TRUE;
        while(q > 0){
@@ -775,8 +799,19 @@ texttype(Text *t, Rune r)
                for(i=0; i<t->file->ntext; i++)
                        textfill(t->file->text[i]);
                return;
+       case '\t':
+               if(t->what == Body && t->w->indent[SPACESINDENT]){
+                       nnb = textbswidth(t, 0x15);
+                       if(nnb == 1 && textreadc(t, t->q0-1) == '\n')
+                               nnb = 0;
+                       nnb = t->tabstop - nnb % t->tabstop;
+                       rp = runemalloc(nnb);
+                       for(nr = 0; nr < nnb; nr++)
+                               rp[nr] = ' ';
+               }
+               break;
        case '\n':
-               if(t->what == Body && t->w->autoindent){
+               if(t->what == Body && t->w->indent[AUTOINDENT]){
                        /* find beginning of previous line using backspace code */
                        nnb = textbswidth(t, 0x15); /* ^U case */
                        rp = runemalloc(nnb + 1);
index aa5d3ac145008e446f2ff22094293238bc5b1a0f..bf00a9e657e3f962395cc529c98f11ac848075ee 100644 (file)
@@ -85,7 +85,8 @@ errorwin1(Rune *dir, int ndir, Rune **incl, int nincl)
                runemove(r, incl[i], n);
                winaddincl(w, r, n);
        }
-       w->autoindent = globalautoindent;
+       for(i=0; i<NINDENT; i++)
+               w->indent[i] = globalindent[i];
        return w;
 }
 
index 90acb486b0375826db9ddd2f2125fabdc92023b7..7c222a17cb7a59de907eb24ffbbc291228a78ab8 100644 (file)
@@ -20,7 +20,7 @@ wininit(Window *w, Window *clone, Rectangle r)
        File *f;
        Reffont *rf;
        Rune *rp;
-       int nc;
+       int nc, i;
 
        w->tag.w = w;
        w->taglines = 1;
@@ -78,13 +78,14 @@ wininit(Window *w, Window *clone, Rectangle r)
        draw(screen, br, button, nil, button->r.min);
        w->filemenu = TRUE;
        w->maxlines = w->body.maxlines;
-       w->autoindent = globalautoindent;
+       for(i=0; i<NINDENT; i++)
+               w->indent[i] = globalindent[i];
        if(clone){
                w->dirty = clone->dirty;
-               w->autoindent = clone->autoindent;
+               for(i=0; i<NINDENT; i++)
+                       w->indent[i] = clone->indent[i];
                textsetselect(&w->body, clone->body.q0, clone->body.q1);
                winsettag(w);
-               w->autoindent = clone->autoindent;
        }
 }