diff options
-rw-r--r-- | src/cmd/acme/text.c | 44 | ||||
-rw-r--r-- | src/cmd/acme/wind.c | 2 |
2 files changed, 30 insertions, 16 deletions
diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c index b1e9e08e..20d00cb9 100644 --- a/src/cmd/acme/text.c +++ b/src/cmd/acme/text.c @@ -386,6 +386,14 @@ textinsert(Text *t, uint q0, Rune *r, uint n, int tofile) } } +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++; diff --git a/src/cmd/acme/wind.c b/src/cmd/acme/wind.c index 336a65fe..66edbc80 100644 --- a/src/cmd/acme/wind.c +++ b/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; } } |