Commit Diff


commit - c1fca1adb018ad47beb0abfe4c3dbfcc87c81ebd
commit + 2a373ea419dafeed391ae37d152f06625bdb7255
blob - b1e9e08e48f06affbee80e47d69d620189b60dac
blob + 20d00cb9374f344b74f5423c66f47b3711298394
--- src/cmd/acme/text.c
+++ src/cmd/acme/text.c
@@ -386,6 +386,14 @@ textinsert(Text *t, uint q0, Rune *r, uint n, int tofi
 	}
 }
 
+void
+typecommit(Text *t)
+{
+	if(t->w != nil)
+		wincommit(t->w, t);
+	else
+		textcommit(t, TRUE);
+}
 
 void
 textfill(Text *t)
@@ -395,12 +403,8 @@ textfill(Text *t)
 
 	if(t->fr.lastlinefull || t->nofill)
 		return;
-	if(t->ncache > 0){
-		if(t->w != nil)
-			wincommit(t->w, t);
-		else
-			textcommit(t, TRUE);
-	}
+	if(t->ncache > 0)
+		typecommit(t);
 	rp = fbufalloc();
 	do{
 		n = t->file->b.nc-(t->org+t->fr.nchars);
@@ -649,16 +653,13 @@ texttype(Text *t, Rune r)
 	switch(r){
 	case Kleft:
 		if(t->q0 > 0){
-			if(t->w)
-				wincommit(t->w, t);
-			else
-				textcommit(t, TRUE);
+			typecommit(t);
 			textshow(t, t->q0-1, t->q0-1, TRUE);
 		}
 		return;
 	case Kright:
 		if(t->q1 < t->file->b.nc){
-			wincommit(t->w, t);
+			typecommit(t);
 			textshow(t, t->q1+1, t->q1+1, TRUE);
 		}
 		return;
@@ -689,15 +690,28 @@ texttype(Text *t, Rune r)
 		textsetorigin(t, q0, TRUE);
 		return;
 	case Khome:
+		typecommit(t);
 		textshow(t, 0, 0, FALSE);
 		return;
 	case Kend:
-		if(t->w)
-			wincommit(t->w, t);
-		else
-			textcommit(t, TRUE);
+		typecommit(t);
 		textshow(t, t->file->b.nc, t->file->b.nc, FALSE);
 		return;
+	case 0x01:	/* ^A: beginning of line */
+		typecommit(t);
+		/* go to where ^U would erase, if not already at BOL */
+		nnb = 0;
+		if(t->q0>0 && textreadc(t, t->q0-1)!='\n')
+			nnb = textbswidth(t, 0x15);
+		textshow(t, t->q0-nnb, t->q0-nnb, TRUE);
+		return;
+	case 0x05:	/* ^E: end of line */
+		typecommit(t);
+		q0 = t->q0;
+		while(q0<t->file->b.nc && textreadc(t, q0)!='\n')
+			q0++;
+		textshow(t, q0, q0, TRUE);
+		return;
 	}
 	if(t->what == Body){
 		seq++;
blob - 336a65fe9d0bd5c6a2839189a728c9ece76ff313
blob + 66edbc803315d9829718b7774c40a85182b48d5b
--- src/cmd/acme/wind.c
+++ src/cmd/acme/wind.c
@@ -80,9 +80,9 @@ wininit(Window *w, Window *clone, Rectangle r)
 //assert(w->body.w == w);
 	if(clone){
 		w->dirty = clone->dirty;
+		w->autoindent = clone->autoindent;
 		textsetselect(&w->body, clone->body.q0, clone->body.q1);
 		winsettag(w);
-		w->autoindent = clone->autoindent;
 	}
 }