From 02f60df0f314a0090cf917dc383c35f92551af07 Mon Sep 17 00:00:00 2001 From: ppatience0 Date: Thu, 4 Apr 2013 16:38:36 -0400 Subject: [PATCH] sam, samterm: add -i flag to make tab insert spaces up to the next tabstop and backspace to delete spaces until the previous tabstop --- sys/src/cmd/sam/sam.c | 3 +++ sys/src/cmd/samterm/main.c | 39 +++++++++++++++++++++++++++++++++-- sys/src/cmd/samterm/plan9.c | 5 ++++- sys/src/cmd/samterm/samterm.h | 1 + 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/sys/src/cmd/sam/sam.c b/sys/src/cmd/sam/sam.c index 2365cd5de..2a0de7912 100644 --- a/sys/src/cmd/sam/sam.c +++ b/sys/src/cmd/sam/sam.c @@ -64,6 +64,9 @@ void main(int argc, char *argv[]) case 'a': *ap++ = "-a"; break; + case 'i': + *ap++ = "-i"; + break; }ARGEND *ap = nil; diff --git a/sys/src/cmd/samterm/main.c b/sys/src/cmd/samterm/main.c index 0b650becf..6ee72c94a 100644 --- a/sys/src/cmd/samterm/main.c +++ b/sys/src/cmd/samterm/main.c @@ -24,6 +24,7 @@ char hostlock = 1; char hasunlocked = 0; int maxtab = 8; int autoindent; +int spacesindent; void threadmain(int argc, char *argv[]) @@ -348,6 +349,33 @@ raspc(Rasp *r, long p) return 0; } +int +getcol(Rasp *r, long p) +{ + int col; + + for(col = 0; p > 0 && raspc(r, p-1)!='\n'; p--, col++) + ; + return col; +} + +long +del(Rasp *r, long o, long p) +{ + int i, col, n; + + if(--p < o) + return o; + if(!spacesindent || raspc(r, p)!=' ') + return p; + col = getcol(r, p) + 1; + if((n = col % maxtab) == 0) + n = maxtab; + for(i = 0; p-1>=o && raspc(r, p-1)==' ' && i=o? p : o; +} + long ctlw(Rasp *r, long o, long p) { @@ -506,7 +534,14 @@ type(Flayer *l, int res) /* what a bloody mess this is */ break; } } - *p++ = c; + if(spacesindent && c == '\t'){ + int i, col, n; + col = getcol(&t->rasp, a); + n = maxtab - col % maxtab; + for(i = 0; i < n && p < buf+nelem(buf); i++) + *p++ = ' '; + } else + *p++ = c; if(autoindent) if(c == '\n'){ /* autoindent */ @@ -587,7 +622,7 @@ type(Flayer *l, int res) /* what a bloody mess this is */ switch(c){ case '\b': case 0x7F: /* del */ - l->p0 = a-1; + l->p0 = del(&t->rasp, l->origin, a); break; case 0x15: /* ctrl-u */ l->p0 = ctlu(&t->rasp, l->origin, a); diff --git a/sys/src/cmd/samterm/plan9.c b/sys/src/cmd/samterm/plan9.c index a7e3d5b70..f00e5481b 100644 --- a/sys/src/cmd/samterm/plan9.c +++ b/sys/src/cmd/samterm/plan9.c @@ -14,7 +14,7 @@ static char exname[64]; void usage(void) { - fprint(2, "usage: samterm [-a]\n"); + fprint(2, "usage: samterm [-ai]\n"); threadexitsall("usage"); } @@ -27,6 +27,9 @@ getscreen(int argc, char **argv) case 'a': autoindent = 1; break; + case 'i': + spacesindent = 1; + break; default: usage(); }ARGEND diff --git a/sys/src/cmd/samterm/samterm.h b/sys/src/cmd/samterm/samterm.h index 7f5e1b0b7..75ff560ce 100644 --- a/sys/src/cmd/samterm/samterm.h +++ b/sys/src/cmd/samterm/samterm.h @@ -86,6 +86,7 @@ extern int hversion; extern int plumbfd; extern int exiting; extern int autoindent; +extern int spacesindent; Rune *gettext(Flayer*, long, ulong*); void *alloc(ulong n);