tmonth old bug fix from rob - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 2a373ea419dafeed391ae37d152f06625bdb7255
 (DIR) parent c1fca1adb018ad47beb0abfe4c3dbfcc87c81ebd
 (HTM) Author: rsc <devnull@localhost>
       Date:   Fri, 18 Mar 2005 18:05:48 +0000
       
       month old bug fix from rob
       
       Diffstat:
         M src/cmd/acme/text.c                 |      44 ++++++++++++++++++++-----------
         M src/cmd/acme/wind.c                 |       2 +-
       
       2 files changed, 30 insertions(+), 16 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c
       t@@ -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)
       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);
       t@@ -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;
       t@@ -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++;
 (DIR) diff --git a/src/cmd/acme/wind.c b/src/cmd/acme/wind.c
       t@@ -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;
                }
        }