Add an option to set the key sent by backspace for those whose system

uses ^H rather than ^?. GitHub issue 1969.
This commit is contained in:
nicm
2019-11-14 07:55:01 +00:00
parent c225262e13
commit 08b07b1a08
5 changed files with 32 additions and 9 deletions

View File

@ -43,9 +43,6 @@ struct input_key_ent {
}; };
static const struct input_key_ent input_keys[] = { static const struct input_key_ent input_keys[] = {
/* Backspace key. */
{ KEYC_BSPACE, "\177", 0 },
/* Paste keys. */ /* Paste keys. */
{ KEYC_PASTE_START, "\033[200~", 0 }, { KEYC_PASTE_START, "\033[200~", 0 },
{ KEYC_PASTE_END, "\033[201~", 0 }, { KEYC_PASTE_END, "\033[201~", 0 },
@ -180,6 +177,13 @@ input_key(struct window_pane *wp, key_code key, struct mouse_event *m)
return; return;
} }
/* Is this backspace? */
if ((key & KEYC_MASK_KEY) == KEYC_BSPACE) {
key = options_get_number(global_options, "backspace");
if (key >= 0x7f)
key = '\177';
}
/* /*
* If this is a normal 7-bit key, just send it, with a leading escape * If this is a normal 7-bit key, just send it, with a leading escape
* if necessary. If it is a UTF-8 key, split it and send it. * if necessary. If it is a UTF-8 key, split it and send it.

View File

@ -159,7 +159,7 @@ key_string_get_modifiers(const char **string)
key_code key_code
key_string_lookup_string(const char *string) key_string_lookup_string(const char *string)
{ {
static const char *other = "!#()+,-.0123456789:;<=>?'\r\t"; static const char *other = "!#()+,-.0123456789:;<=>'\r\t";
key_code key; key_code key;
u_int u; u_int u;
key_code modifiers; key_code modifiers;
@ -196,7 +196,7 @@ key_string_lookup_string(const char *string)
/* Is this a standard ASCII key? */ /* Is this a standard ASCII key? */
if (string[1] == '\0' && (u_char)string[0] <= 127) { if (string[1] == '\0' && (u_char)string[0] <= 127) {
key = (u_char)string[0]; key = (u_char)string[0];
if (key < 32 || key == 127) if (key < 32)
return (KEYC_UNKNOWN); return (KEYC_UNKNOWN);
} else { } else {
/* Try as a UTF-8 key. */ /* Try as a UTF-8 key. */
@ -226,6 +226,8 @@ key_string_lookup_string(const char *string)
key -= 64; key -= 64;
else if (key == 32) else if (key == 32)
key = 0; key = 0;
else if (key == '?')
key = 127;
else if (key == 63) else if (key == 63)
key = KEYC_BSPACE; key = KEYC_BSPACE;
else else
@ -329,7 +331,7 @@ key_string_lookup_key(key_code key)
} }
/* Invalid keys are errors. */ /* Invalid keys are errors. */
if (key == 127 || key > 255) { if (key > 255) {
snprintf(out, sizeof out, "Invalid#%llx", key); snprintf(out, sizeof out, "Invalid#%llx", key);
return (out); return (out);
} }
@ -343,7 +345,9 @@ key_string_lookup_key(key_code key)
} else if (key >= 32 && key <= 126) { } else if (key >= 32 && key <= 126) {
tmp[0] = key; tmp[0] = key;
tmp[1] = '\0'; tmp[1] = '\0';
} else if (key >= 128) } else if (key == 127)
xsnprintf(tmp, sizeof tmp, "C-?");
else if (key >= 128)
xsnprintf(tmp, sizeof tmp, "\\%llo", key); xsnprintf(tmp, sizeof tmp, "\\%llo", key);
strlcat(out, tmp, sizeof out); strlcat(out, tmp, sizeof out);

View File

@ -147,6 +147,12 @@ static const char *options_table_status_format_default[] = {
/* Top-level options. */ /* Top-level options. */
const struct options_table_entry options_table[] = { const struct options_table_entry options_table[] = {
/* Server options. */ /* Server options. */
{ .name = "backspace",
.type = OPTIONS_TABLE_KEY,
.scope = OPTIONS_TABLE_SERVER,
.default_num = '\177',
},
{ .name = "buffer-limit", { .name = "buffer-limit",
.type = OPTIONS_TABLE_NUMBER, .type = OPTIONS_TABLE_NUMBER,
.scope = OPTIONS_TABLE_SERVER, .scope = OPTIONS_TABLE_SERVER,

View File

@ -217,6 +217,7 @@ spawn_pane(struct spawn_context *sc, char **cause)
u_int hlimit; u_int hlimit;
struct winsize ws; struct winsize ws;
sigset_t set, oldset; sigset_t set, oldset;
key_code key;
spawn_log(__func__, sc); spawn_log(__func__, sc);
@ -378,13 +379,17 @@ spawn_pane(struct spawn_context *sc, char **cause)
/* /*
* Update terminal escape characters from the session if available and * Update terminal escape characters from the session if available and
* force VERASE to tmux's \177. * force VERASE to tmux's backspace.
*/ */
if (tcgetattr(STDIN_FILENO, &now) != 0) if (tcgetattr(STDIN_FILENO, &now) != 0)
_exit(1); _exit(1);
if (s->tio != NULL) if (s->tio != NULL)
memcpy(now.c_cc, s->tio->c_cc, sizeof now.c_cc); memcpy(now.c_cc, s->tio->c_cc, sizeof now.c_cc);
now.c_cc[VERASE] = '\177'; key = options_get_number(global_options, "backspace");
if (key >= 0x7f)
now.c_cc[VERASE] = '\177';
else
now.c_cc[VERASE] = key;
if (tcsetattr(STDIN_FILENO, TCSANOW, &now) != 0) if (tcsetattr(STDIN_FILENO, TCSANOW, &now) != 0)
_exit(1); _exit(1);

4
tmux.1
View File

@ -2925,6 +2925,10 @@ omitted to toggle).
.Pp .Pp
Available server options are: Available server options are:
.Bl -tag -width Ds .Bl -tag -width Ds
.It Ic backspace Ar key
Set the key sent by
.Nm
for backspace.
.It Ic buffer-limit Ar number .It Ic buffer-limit Ar number
Set the number of buffers; as new buffers are added to the top of the stack, Set the number of buffers; as new buffers are added to the top of the stack,
old ones are removed from the bottom if necessary to maintain this maximum old ones are removed from the bottom if necessary to maintain this maximum