ref: 8ab23e7130afafaa37dc28120bae79559d901eb3
parent: 35d8ccee13d4b424a2a26bc32c068631cf113ea6
author: ppatience0 <ppatience0@gmail.com>
date: Thu Apr 4 12:38:36 EDT 2013
sam, samterm: add -i flag to make tab insert spaces up to the next tabstop and backspace to delete spaces until the previous tabstop
--- a/sys/src/cmd/sam/sam.c
+++ b/sys/src/cmd/sam/sam.c
@@ -64,6 +64,9 @@
case 'a':
*ap++ = "-a";
break;
+ case 'i':
+ *ap++ = "-i";
+ break;
}ARGEND
*ap = nil;
--- a/sys/src/cmd/samterm/main.c
+++ b/sys/src/cmd/samterm/main.c
@@ -24,6 +24,7 @@
char hasunlocked = 0;
int maxtab = 8;
int autoindent;
+int spacesindent;
void
threadmain(int argc, char *argv[])
@@ -348,7 +349,34 @@
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)
{int c;
@@ -506,7 +534,14 @@
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 @@
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);
--- a/sys/src/cmd/samterm/plan9.c
+++ b/sys/src/cmd/samterm/plan9.c
@@ -14,7 +14,7 @@
void
usage(void)
{- fprint(2, "usage: samterm [-a]\n");
+ fprint(2, "usage: samterm [-ai]\n");
threadexitsall("usage");}
@@ -26,6 +26,9 @@
ARGBEGIN{case 'a':
autoindent = 1;
+ break;
+ case 'i':
+ spacesindent = 1;
break;
default:
usage();
--- a/sys/src/cmd/samterm/samterm.h
+++ b/sys/src/cmd/samterm/samterm.h
@@ -86,6 +86,7 @@
extern int plumbfd;
extern int exiting;
extern int autoindent;
+extern int spacesindent;
Rune *gettext(Flayer*, long, ulong*);
void *alloc(ulong n);
--
⑨