1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-29 17:31:02 +01:00

Joakim Rosqvist: 27591 as modified in 27594:

KEYBOARD_HACK variable
This commit is contained in:
Peter Stephenson 2010-01-13 12:05:22 +00:00
parent a7ea114f96
commit 036cb0ce95
7 changed files with 95 additions and 14 deletions

View file

@ -291,20 +291,32 @@ inputline(void)
zputs(ingetcline, stderr);
fflush(stderr);
}
if (*ingetcline && ingetcline[strlen(ingetcline) - 1] == '\n' &&
interact && isset(SUNKEYBOARDHACK) && isset(SHINSTDIN) &&
SHTTY != -1 && *ingetcline && ingetcline[1] &&
ingetcline[strlen(ingetcline) - 2] == '`') {
/* Junk an unmatched "`" at the end of the line. */
int ct;
char *ptr;
if (keyboardhackchar && *ingetcline &&
ingetcline[strlen(ingetcline) - 1] == '\n' &&
interact && isset(SHINSTDIN) &&
SHTTY != -1 && ingetcline[1])
{
char *stripptr = ingetcline + strlen(ingetcline) - 2;
if (*stripptr == keyboardhackchar) {
/* Junk an unwanted character at the end of the line.
(key too close to return key) */
int ct = 1; /* force odd */
char *ptr;
for (ct = 0, ptr = ingetcline; *ptr; ptr++)
if (*ptr == '`')
ct++;
if (ct & 1) {
ptr[-2] = '\n';
ptr[-1] = '\0';
if (keyboardhackchar == '\'' || keyboardhackchar == '"' ||
keyboardhackchar == '`') {
/*
* for the chars above, also require an odd count before
* junking
*/
for (ct = 0, ptr = ingetcline; *ptr; ptr++)
if (*ptr == keyboardhackchar)
ct++;
}
if (ct & 1) {
stripptr[0] = '\n';
stripptr[1] = '\0';
}
}
}
isfirstch = 1;

View file

@ -748,6 +748,9 @@ dosetopt(int optno, int value, int force)
} else if ((optno == EMACSMODE || optno == VIMODE) && value) {
zleentry(ZLE_CMD_SET_KEYMAP, optno);
opts[(optno == EMACSMODE) ? VIMODE : EMACSMODE] = 0;
} else if (optno == SUNKEYBOARDHACK) {
/* for backward compatibility */
keyboardhackchar = (value ? '`' : '\0');
}
opts[optno] = value;
if (optno == BANGHIST || optno == SHINSTDIN)

View file

@ -108,6 +108,9 @@ zlong lineno, /* $LINENO */
mod_export unsigned char bangchar;
/**/
unsigned char hatchar, hashchar;
/**/
unsigned char keyboardhackchar = '\0';
/* $SECONDS = now.tv_sec - shtimer.tv_sec
* + (now.tv_usec - shtimer.tv_usec) / 1000000.0
@ -204,6 +207,8 @@ static const struct gsu_scalar ifs_gsu =
{ ifsgetfn, ifssetfn, stdunsetfn };
static const struct gsu_scalar underscore_gsu =
{ underscoregetfn, nullstrsetfn, stdunsetfn };
static const struct gsu_scalar keyboard_hack_gsu =
{ keyboardhackgetfn, keyboardhacksetfn, stdunsetfn };
#ifdef USE_LOCALE
static const struct gsu_scalar lc_blah_gsu =
{ strgetfn, lcsetfn, stdunsetfn };
@ -273,6 +278,7 @@ IPDEF2("TERM", term_gsu, 0),
IPDEF2("WORDCHARS", wordchars_gsu, 0),
IPDEF2("IFS", ifs_gsu, PM_DONTIMPORT),
IPDEF2("_", underscore_gsu, PM_READONLY),
IPDEF2("KEYBOARD_HACK", keyboard_hack_gsu, PM_DONTIMPORT),
#ifdef USE_LOCALE
# define LCIPDEF(name) IPDEF2(name, lc_blah_gsu, PM_UNSET)
@ -3834,6 +3840,46 @@ errnogetfn(UNUSED(Param pm))
return errno;
}
/* Function to get value for special parameter `KEYBOARD_HACK' */
/**/
char *
keyboardhackgetfn(UNUSED(Param pm))
{
static char buf[2];
buf[0] = keyboardhackchar;
buf[1] = '\0';
return buf;
}
/* Function to set value of special parameter `KEYBOARD_HACK' */
/**/
void
keyboardhacksetfn(UNUSED(Param pm), char *x)
{
if (x) {
int len, i;
unmetafy(x, &len);
if (len > 1) {
len = 1;
zwarn("Only one KEYBOARD_HACK character can be defined"); /* could be changed if needed */
}
for (i = 0; i < len; i++) {
if (!isascii(STOUC(x[i]))) {
zwarn("KEYBOARD_HACK can only contain ASCII characters");
return;
}
}
keyboardhackchar = len ? STOUC(x[0]) : '\0';
free(x);
} else
keyboardhackchar = '\0';
}
/* Function to get value for special parameter `histchar' */
/**/