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:
parent
a7ea114f96
commit
036cb0ce95
7 changed files with 95 additions and 14 deletions
38
Src/input.c
38
Src/input.c
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
46
Src/params.c
46
Src/params.c
|
|
@ -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' */
|
||||
|
||||
/**/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue