From 4757debd0b5935dae94944c35c3cac74b14aa209 Mon Sep 17 00:00:00 2001 From: spew Date: Wed, 1 Aug 2018 11:14:59 -0400 Subject: acme: add spacesindent mode --- sys/src/cmd/acme/text.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'sys/src/cmd/acme/text.c') diff --git a/sys/src/cmd/acme/text.c b/sys/src/cmd/acme/text.c index 7380d0163..b96213a68 100644 --- a/sys/src/cmd/acme/text.c +++ b/sys/src/cmd/acme/text.c @@ -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; ifile->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); -- cgit v1.2.3