Allow setty to set chars using char=value

This commit is contained in:
christos 2003-10-18 22:24:34 +00:00
parent 492c11116f
commit 730f23e551
2 changed files with 142 additions and 4 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: editrc.5,v 1.16 2003/06/27 18:57:09 wiz Exp $
.\" $NetBSD: editrc.5,v 1.17 2003/10/18 22:24:34 christos Exp $
.\"
.\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
.\" All rights reserved.
@ -251,6 +251,7 @@ No sanity checking is done.
.Op Ar +mode
.Op Ar -mode
.Op Ar mode
.Op Ar char=c
.Xc
Control which tty modes that
.Nm
@ -291,6 +292,15 @@ fixes
on or off or removes control of
.Ar mode
in the chosen set.
.Pp
.Ic Setty
can also be used to set tty characters to particular values using
.Ar char=value .
If
.Ar value
is empty
then the character is set to
.Dv _POSIX_VDISABLE .
.El
.Sh EDITOR COMMANDS
The following editor commands are available for use in key bindings:

View File

@ -1,4 +1,4 @@
/* $NetBSD: tty.c,v 1.18 2003/08/07 16:44:34 agc Exp $ */
/* $NetBSD: tty.c,v 1.19 2003/10/18 22:24:34 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -37,13 +37,14 @@
#if 0
static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: tty.c,v 1.18 2003/08/07 16:44:34 agc Exp $");
__RCSID("$NetBSD: tty.c,v 1.19 2003/10/18 22:24:34 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/*
* tty.c: tty interface stuff
*/
#include <assert.h>
#include "tty.h"
#include "el.h"
@ -451,6 +452,7 @@ private const ttymodes_t ttymodes[] = {
#define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
#define tty__cooked_mode(td) ((td)->c_lflag & ICANON)
private int tty__getcharindex(int);
private void tty__getchar(struct termios *, unsigned char *);
private void tty__setchar(struct termios *, unsigned char *);
private speed_t tty__getspeed(struct termios *);
@ -584,6 +586,113 @@ tty__getspeed(struct termios *td)
return (spd);
}
/* tty__getspeed():
* Return the index of the asked char in the c_cc array
*/
private int
tty__getcharindex(int i)
{
switch (i) {
#ifdef VINTR
case C_INTR:
return VINTR;
#endif /* VINTR */
#ifdef VQUIT
case C_QUIT:
return VQUIT;
#endif /* VQUIT */
#ifdef VERASE
case C_ERASE:
return VERASE;
#endif /* VERASE */
#ifdef VKILL
case C_KILL:
return VKILL;
#endif /* VKILL */
#ifdef VEOF
case C_EOF:
return VEOF;
#endif /* VEOF */
#ifdef VEOL
case C_EOL:
return VEOL;
#endif /* VEOL */
#ifdef VEOL2
case C_EOL2:
return VEOL2;
#endif /* VEOL2 */
#ifdef VSWTCH
case C_SWTCH:
return VSWTCH;
#endif /* VSWTCH */
#ifdef VDSWTCH
case C_DSWTCH:
return VDSWTCH;
#endif /* VDSWTCH */
#ifdef VERASE2
case C_ERASE2:
return VERASE2;
#endif /* VERASE2 */
#ifdef VSTART
case C_START:
return VSTART;
#endif /* VSTART */
#ifdef VSTOP
case C_STOP:
return VSTOP;
#endif /* VSTOP */
#ifdef VWERASE
case C_WERASE:
return VWERASE;
#endif /* VWERASE */
#ifdef VSUSP
case C_SUSP:
return VSUSP;
#endif /* VSUSP */
#ifdef VDSUSP
case C_DSUSP:
return VDSUSP;
#endif /* VDSUSP */
#ifdef VREPRINT
case C_REPRINT:
return VREPRINT;
#endif /* VREPRINT */
#ifdef VDISCARD
case C_DISCARD:
return VDISCARD;
#endif /* VDISCARD */
#ifdef VLNEXT
case C_LNEXT:
return VLNEXT;
#endif /* VLNEXT */
#ifdef VSTATUS
case C_STATUS:
return VSTATUS;
#endif /* VSTATUS */
#ifdef VPAGE
case C_PAGE:
return VPAGE;
#endif /* VPAGE */
#ifdef VPGOFF
case C_PGOFF:
return VPGOFF;
#endif /* VPGOFF */
#ifdef VKILL2
case C_KILL2:
return VKILL2;
#endif /* KILL2 */
#ifdef VMIN
case C_MIN:
return VMIN;
#endif /* VMIN */
#ifdef VTIME
case C_TIME:
return VTIME;
#endif /* VTIME */
default:
return -1;
}
}
/* tty__getchar():
* Get the tty characters
@ -1044,6 +1153,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
int aflag = 0;
const char *s, *d;
const char *name;
struct termios *tios = &el->el_tty.t_ex;
int z = EX_IO;
if (argv == NULL)
@ -1058,14 +1168,17 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
break;
case 'd':
argv++;
tios = &el->el_tty.t_ed;
z = ED_IO;
break;
case 'x':
argv++;
tios = &el->el_tty.t_ex;
z = EX_IO;
break;
case 'q':
argv++;
tios = &el->el_tty.t_ts;
z = QU_IO;
break;
default:
@ -1115,6 +1228,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
return (0);
}
while (argv && (s = *argv++)) {
char *p;
switch (*s) {
case '+':
case '-':
@ -1125,8 +1239,11 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
break;
}
d = s;
if ((p = strchr(s, '=')) != NULL)
*p++ = '\0';
for (m = ttymodes; m->m_name; m++)
if (strcmp(m->m_name, d) == 0)
if (strcmp(m->m_name, d) == 0 &&
(p == NULL || m->m_type == MD_CHAR))
break;
if (!m->m_name) {
@ -1134,6 +1251,17 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
"%s: Invalid argument `%s'.\n", name, d);
return (-1);
}
if (p) {
int c = ffs((int)m->m_value);
int v = *p ? parse__escape((const char **const) &p) :
el->el_tty.t_vdisable;
assert(c-- != 0);
c = tty__getcharindex(c);
assert(c != -1);
printf("setting %d to %d\n", c, v);
tios->c_cc[c] = v;
continue;
}
switch (x) {
case '+':
el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value;