Merge pull request #3 from deadpixi/wordstar - sam - An updated version of the sam text editor.
 (HTM) git clone git://vernunftzentrum.de/sam.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit c0e7b09dcf26f2ce827dfcb1a646809618f74396
 (DIR) parent 4c7dcf44a81be2d8469cac905563052c90c82375
 (HTM) Author: Rob King <deadpixi@users.noreply.github.com>
       Date:   Tue,  4 Aug 2015 21:49:21 -0500
       
       Merge pull request #3 from deadpixi/wordstar
       
       Added Wordstar-like cursor movement commands.
       Diffstat:
         samterm/main.c                      |      88 +++++++++++++++++++++++++++++--
       
       1 file changed, 83 insertions(+), 5 deletions(-)
       ---
 (DIR) diff --git a/samterm/main.c b/samterm/main.c
       @@ -427,9 +427,9 @@ flushtyping(int clearesc)
                XFlush(_dpy);
        }
        
       -#define        SCROLLKEY        0x80
       -#define        UPKEY                0x81
       -#define        ESC                0x1B
       +#define SCROLLKEY        0x80
       +#define UPKEY                0x81
       +#define ESC                0x1B
        
        void
        type(Flayer *l, int res)        /* what a bloody mess this is */
       @@ -437,7 +437,7 @@ type(Flayer *l, int res)        /* what a bloody mess this is */
                Text *t = (Text *)l->user1;
                Rune buf[100];
                Rune *p = buf;
       -        int c, backspacing;
       +        int c, backspacing, moving;
                long a;
                int scrollkey, upkey;
        
       @@ -456,13 +456,21 @@ type(Flayer *l, int res)        /* what a bloody mess this is */
                if(a!=l->p1 && !scrollkey && !upkey){
                        flushtyping(1);
                        cut(t, t->front, 1, 1);
       -                return;        /* it may now be locked */
       +                return; /* it may now be locked */
                }
                backspacing = 0;
       +        moving = 0;
                while((c = kbdchar())>0){
                        if(res == RKeyboard){
                                if(c == UPKEY || c==SCROLLKEY || c==ESC)
                                        break;
       +
       +                        /* ctrl-s, ctrl-e, ctrl-d, ctrl-x */
       +                        if (c==0x13 || c==0x04 || c==0x05 || c==0x18){
       +                                moving = 1;
       +                                break;
       +                        }
       +
                                /* backspace, ctrl-u, ctrl-w, del */
                                if(c=='\b' || c==0x15 || c==0x17 || c==0x7F){
                                        backspacing = 1;
       @@ -496,6 +504,76 @@ type(Flayer *l, int res)        /* what a bloody mess this is */
                        flushtyping(0);
                        outTsll(Torigin, t->tag, l->origin, l->f.maxlines+1);
                        /* backspacing immediately after outcmd(): sorry */
       +        } else if (moving){
       +                switch(c){
       +                case 0x13: /* ctrl-s */
       +            flushtyping(0);
       +            if (a > 0)
       +                    a--;
       +            flsetselect(l, a, a);
       +            center(l, a);
       +                break;
       +
       +            case 0x04: /* ctrl-d */
       +                flushtyping(0);
       +                if (a < t->rasp.nrunes)
       +                        a++;
       +                flsetselect(l, a, a);
       +                center(l, a);
       +                break;
       +    
       +            case 0x05: /* ctrl-e */
       +                flushtyping(1);
       +                if (a > 0){
       +                    long n0, n1, count = 0;
       +                    while (a > 0 && raspc(&t->rasp, a - 1) != '\n'){
       +                        a--;
       +                        count++;
       +                    }
       +                    if (a > 0){
       +                        n1 = a;
       +                        a--;
       +                        while (a > 0 && raspc(&t->rasp, a - 1) != '\n')
       +                            a--;
       +    
       +                        n0 = a;
       +                        a = (n0 + count > n1) ? n1 - 1 : n0 + count;
       +                        flsetselect(l, a, a);
       +                        center(l, a);
       +                    }
       +            }
       +            break;
       +
       +            case 0x18: /* ctrl-x */
       +                flushtyping(1);
       +                if (a < t->rasp.nrunes){
       +                        long n0, n1, n2, p0, count = 0;
       +        
       +                        p0 = a;
       +                        while (a > 0 && raspc(&t->rasp, a - 1) != '\n'){
       +                            a--;
       +                            count++;
       +                        }
       +                        n0 = a;
       +        
       +                        a = p0;
       +                        while (a < t->rasp.nrunes && raspc(&t->rasp, a) != '\n')
       +                            a++;
       +                        n1 = ++a;
       +        
       +                        a++;
       +                        while (a < t->rasp.nrunes && raspc(&t->rasp, a) != '\n')
       +                            a++;
       +                        n2 = a;
       +        
       +                        if (n2 < t->rasp.nrunes && n1 != n2){
       +                            a = (n1 + count > n2) ? n2 : n1 + count;
       +                            flsetselect(l, a, a);
       +                            center(l, a);
       +                        }
       +                }
       +            break;
       +                }
                }else if(backspacing && !lock){
                        if(l->f.p0>0 && a>0){
                                switch(c){