sam, samterm: add -i flag to make tab insert spaces up to the next tabstop and backspace to delete spaces until the previous tabstop
This commit is contained in:
parent
6bef56f037
commit
02f60df0f3
|
@ -64,6 +64,9 @@ void main(int argc, char *argv[])
|
||||||
case 'a':
|
case 'a':
|
||||||
*ap++ = "-a";
|
*ap++ = "-a";
|
||||||
break;
|
break;
|
||||||
|
case 'i':
|
||||||
|
*ap++ = "-i";
|
||||||
|
break;
|
||||||
}ARGEND
|
}ARGEND
|
||||||
*ap = nil;
|
*ap = nil;
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ char hostlock = 1;
|
||||||
char hasunlocked = 0;
|
char hasunlocked = 0;
|
||||||
int maxtab = 8;
|
int maxtab = 8;
|
||||||
int autoindent;
|
int autoindent;
|
||||||
|
int spacesindent;
|
||||||
|
|
||||||
void
|
void
|
||||||
threadmain(int argc, char *argv[])
|
threadmain(int argc, char *argv[])
|
||||||
|
@ -348,6 +349,33 @@ raspc(Rasp *r, long p)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
getcol(Rasp *r, long p)
|
||||||
|
{
|
||||||
|
int col;
|
||||||
|
|
||||||
|
for(col = 0; p > 0 && raspc(r, p-1)!='\n'; p--, col++)
|
||||||
|
;
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
long
|
||||||
|
del(Rasp *r, long o, long p)
|
||||||
|
{
|
||||||
|
int i, col, n;
|
||||||
|
|
||||||
|
if(--p < o)
|
||||||
|
return o;
|
||||||
|
if(!spacesindent || raspc(r, p)!=' ')
|
||||||
|
return p;
|
||||||
|
col = getcol(r, p) + 1;
|
||||||
|
if((n = col % maxtab) == 0)
|
||||||
|
n = maxtab;
|
||||||
|
for(i = 0; p-1>=o && raspc(r, p-1)==' ' && i<n-1; --p, i++)
|
||||||
|
;
|
||||||
|
return p>=o? p : o;
|
||||||
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
ctlw(Rasp *r, long o, long p)
|
ctlw(Rasp *r, long o, long p)
|
||||||
{
|
{
|
||||||
|
@ -506,7 +534,14 @@ type(Flayer *l, int res) /* what a bloody mess this is */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*p++ = c;
|
if(spacesindent && c == '\t'){
|
||||||
|
int i, col, n;
|
||||||
|
col = getcol(&t->rasp, a);
|
||||||
|
n = maxtab - col % maxtab;
|
||||||
|
for(i = 0; i < n && p < buf+nelem(buf); i++)
|
||||||
|
*p++ = ' ';
|
||||||
|
} else
|
||||||
|
*p++ = c;
|
||||||
if(autoindent)
|
if(autoindent)
|
||||||
if(c == '\n'){
|
if(c == '\n'){
|
||||||
/* autoindent */
|
/* autoindent */
|
||||||
|
@ -587,7 +622,7 @@ type(Flayer *l, int res) /* what a bloody mess this is */
|
||||||
switch(c){
|
switch(c){
|
||||||
case '\b':
|
case '\b':
|
||||||
case 0x7F: /* del */
|
case 0x7F: /* del */
|
||||||
l->p0 = a-1;
|
l->p0 = del(&t->rasp, l->origin, a);
|
||||||
break;
|
break;
|
||||||
case 0x15: /* ctrl-u */
|
case 0x15: /* ctrl-u */
|
||||||
l->p0 = ctlu(&t->rasp, l->origin, a);
|
l->p0 = ctlu(&t->rasp, l->origin, a);
|
||||||
|
|
|
@ -14,7 +14,7 @@ static char exname[64];
|
||||||
void
|
void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
fprint(2, "usage: samterm [-a]\n");
|
fprint(2, "usage: samterm [-ai]\n");
|
||||||
threadexitsall("usage");
|
threadexitsall("usage");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,9 @@ getscreen(int argc, char **argv)
|
||||||
case 'a':
|
case 'a':
|
||||||
autoindent = 1;
|
autoindent = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'i':
|
||||||
|
spacesindent = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
}ARGEND
|
}ARGEND
|
||||||
|
|
|
@ -86,6 +86,7 @@ extern int hversion;
|
||||||
extern int plumbfd;
|
extern int plumbfd;
|
||||||
extern int exiting;
|
extern int exiting;
|
||||||
extern int autoindent;
|
extern int autoindent;
|
||||||
|
extern int spacesindent;
|
||||||
|
|
||||||
Rune *gettext(Flayer*, long, ulong*);
|
Rune *gettext(Flayer*, long, ulong*);
|
||||||
void *alloc(ulong n);
|
void *alloc(ulong n);
|
||||||
|
|
Loading…
Reference in a new issue