diff options
author | ppatience0 <ppatience0@gmail.com> | 2013-04-04 16:38:36 -0400 |
---|---|---|
committer | ppatience0 <ppatience0@gmail.com> | 2013-04-04 16:38:36 -0400 |
commit | 02f60df0f314a0090cf917dc383c35f92551af07 (patch) | |
tree | fd8773b4dcdf3c313a04d34cf381a4bb7f8389ca /sys/src/cmd/samterm | |
parent | 6bef56f0376ea1459271bb1e23c48e358d0ae4d7 (diff) |
sam, samterm: add -i flag to make tab insert spaces up to the next tabstop and backspace to delete spaces until the previous tabstop
Diffstat (limited to 'sys/src/cmd/samterm')
-rw-r--r-- | sys/src/cmd/samterm/main.c | 39 | ||||
-rw-r--r-- | sys/src/cmd/samterm/plan9.c | 5 | ||||
-rw-r--r-- | sys/src/cmd/samterm/samterm.h | 1 |
3 files changed, 42 insertions, 3 deletions
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<n-1; --p, i++) + ; + return p>=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); |