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/main.c | |
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/main.c')
-rw-r--r-- | sys/src/cmd/samterm/main.c | 39 |
1 files changed, 37 insertions, 2 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); |