git: 9front

Download patch

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);
--