summaryrefslogtreecommitdiff
path: root/sys/src/cmd/acme/exec.c
diff options
context:
space:
mode:
authorspew <devnull@localhost>2018-08-01 11:14:59 -0400
committerspew <devnull@localhost>2018-08-01 11:14:59 -0400
commit4757debd0b5935dae94944c35c3cac74b14aa209 (patch)
tree950414554d5b67cce61a3c7809222a331d64a028 /sys/src/cmd/acme/exec.c
parent2b619dc9669e34c7b110ce188a10d03849119c78 (diff)
acme: add spacesindent mode
Diffstat (limited to 'sys/src/cmd/acme/exec.c')
-rw-r--r--sys/src/cmd/acme/exec.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/sys/src/cmd/acme/exec.c b/sys/src/cmd/acme/exec.c
index fa18e8af2..baf125927 100644
--- a/sys/src/cmd/acme/exec.c
+++ b/sys/src/cmd/acme/exec.c
@@ -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,67 @@ 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;
+
+ 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, (void*)type);
+ else if(w != nil && ival >= 0)
+ w->indent[type] = ival;
}
void