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 */
};