Treated tab expansion as a normal command. - 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 8e2e9e5d024f89ba01f40f68a8d4cdd04b47c454
 (DIR) parent aaf4e09b9bc9910b3502e4d781ea89d902fa0306
 (HTM) Author: Rob King <jking@deadpixi.com>
       Date:   Tue, 13 Sep 2016 10:55:22 -0500
       
       Treated tab expansion as a normal command.
       
       This removes a fairly large special case in the input code, further
       simplifying things.
       
       Diffstat:
         samterm/main.c                      |      37 ++++++++++++++++++++-----------
         samterm/samrc.c                     |       6 +++---
         samterm/samterm.h                   |       1 +
       
       3 files changed, 28 insertions(+), 16 deletions(-)
       ---
 (DIR) diff --git a/samterm/main.c b/samterm/main.c
       @@ -816,6 +816,27 @@ cmdwrite(Flayer *l, long a, Text *t)
        }
        
        static long
       +cmdtab(Flayer *l, long a, Text *t)
       +{
       +    flushtyping(0);
       +
       +    if (!expandtabs)
       +        pushkbd('\t');
       +    else{
       +        int col = 0, nspaces = 8, off = a;
       +        int i;
       +        while (off > 0 && raspc(&t->rasp, off - 1) != '\n')
       +            off--, col++;
       +
       +        nspaces = tabwidth - col % tabwidth;
       +        for (i = 0; i < nspaces; i++)
       +            pushkbd(' ');
       +    }
       +
       +    return a;
       +}
       +
       +static long
        cmdnone(Flayer *l, long a, Text *t)
        {
            return a;
       @@ -850,9 +871,11 @@ CommandEntry commands[Cmax] ={
            [Cdel]            = {cmddel,            true,  true},
            [Cwrite]          = {cmdwrite,          true,  false},
            [Ceol]            = {cmdeol,            false, false},
       -    [Cbol]            = {cmdbol,            false, false}
       +    [Cbol]            = {cmdbol,            false, false},
       +    [Ctab]            = {cmdtab,            false, false}
        };
        
       +
        void
        type(Flayer *l, int res)    /* what a bloody mess this is -- but it's getting better! */
        {
       @@ -879,18 +902,6 @@ type(Flayer *l, int res)    /* what a bloody mess this is -- but it's getting be
                if (k.k == Kcommand)
                    break;
        
       -        if (expandtabs && k.c == '\t' && k.k != Kcomposed){
       -            int col = 0, nspaces = 8, off = a;
       -            int i;
       -            while (off > 0 && raspc(&t->rasp, off - 1) != '\n')
       -                off--, col++;
       -
       -            nspaces = tabwidth - col % tabwidth;
       -            for (i = 0; i < nspaces; i++)
       -                pushkbd(' ');
       -            break;
       -        }
       -
                *p++ = k.c;
                if (k.c == '\n' || p >= buf + sizeof(buf) / sizeof(buf[0]))
                    break;
 (DIR) diff --git a/samterm/samrc.c b/samterm/samrc.c
       @@ -133,10 +133,10 @@ static Defaultbinding defaultbindings[] ={
            /* More fundamental stuff: backspace, delete, etc. */
            {0,           XK_BackSpace,     Kcommand, Cdel},
            {0,           XK_Delete,        Kcommand, Cdel},
       +    {0,           XK_Tab,           Kcommand, Ctab},
            {0,           XK_Return,        Kraw,     '\n'},
            {0,           XK_KP_Enter,      Kraw,     '\n'},
            {0,           XK_Linefeed,      Kraw,     '\r'},
       -    {0,           XK_Tab,           Kraw,     '\t'},
            {0,           XK_KP_0,          Kraw,     '0'},
            {0,           XK_KP_1,          Kraw,     '1'},
            {0,           XK_KP_2,          Kraw,     '2'},
       @@ -156,12 +156,12 @@ static Defaultbinding defaultbindings[] ={
        
            /* Support traditional control sequences. */
            {ControlMask, XK_h,             Kcommand, Cdel},
       -    {ControlMask, XK_i,             Kraw,     '\t'},
       +    {ControlMask, XK_i,             Kcommand, Ctab},
            {ControlMask, XK_j,             Kraw,     '\n'},
            {ControlMask, XK_m,             Kraw,     '\r'},
        
            /* Use Control-Tab to insert a literal tab when tab expansion is enabled. */
       -    {ControlMask, XK_Tab,           Kcomposed, '\t'},
       +    {ControlMask, XK_Tab,           Kraw,     '\t'},
        
            {0,           0,                Kend,     0}
        };
 (DIR) diff --git a/samterm/samterm.h b/samterm/samterm.h
       @@ -27,6 +27,7 @@ enum{
            Cwrite,                /* write file */
            Ceol,                  /* move to beginning of line */
            Cbol,                  /* move to end of line */
       +    Ctab,                  /* insert a possibly expanded tab */
            Cmax                   /* invalid command */
        };