diff options
author | nicm <nicm> | 2019-11-14 07:55:01 +0000 |
---|---|---|
committer | nicm <nicm> | 2019-11-14 07:55:01 +0000 |
commit | 08b07b1a08ad02f7a195437deead0a60f971e1ee (patch) | |
tree | 008cb66149cd8540af544c6f73d4094d096dc18b | |
parent | c225262e132ded1b4e1e8c0bd21884e9da78ddb3 (diff) | |
download | rtmux-08b07b1a08ad02f7a195437deead0a60f971e1ee.tar.gz rtmux-08b07b1a08ad02f7a195437deead0a60f971e1ee.tar.bz2 rtmux-08b07b1a08ad02f7a195437deead0a60f971e1ee.zip |
Add an option to set the key sent by backspace for those whose system
uses ^H rather than ^?. GitHub issue 1969.
-rw-r--r-- | input-keys.c | 10 | ||||
-rw-r--r-- | key-string.c | 12 | ||||
-rw-r--r-- | options-table.c | 6 | ||||
-rw-r--r-- | spawn.c | 9 | ||||
-rw-r--r-- | tmux.1 | 4 |
5 files changed, 32 insertions, 9 deletions
diff --git a/input-keys.c b/input-keys.c index 6e521ae1..1325e813 100644 --- a/input-keys.c +++ b/input-keys.c @@ -43,9 +43,6 @@ struct input_key_ent { }; static const struct input_key_ent input_keys[] = { - /* Backspace key. */ - { KEYC_BSPACE, "\177", 0 }, - /* Paste keys. */ { KEYC_PASTE_START, "\033[200~", 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; } + /* 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 necessary. If it is a UTF-8 key, split it and send it. diff --git a/key-string.c b/key-string.c index a1ef4f51..0505623e 100644 --- a/key-string.c +++ b/key-string.c @@ -159,7 +159,7 @@ key_string_get_modifiers(const char **string) key_code key_string_lookup_string(const char *string) { - static const char *other = "!#()+,-.0123456789:;<=>?'\r\t"; + static const char *other = "!#()+,-.0123456789:;<=>'\r\t"; key_code key; u_int u; key_code modifiers; @@ -196,7 +196,7 @@ key_string_lookup_string(const char *string) /* Is this a standard ASCII key? */ if (string[1] == '\0' && (u_char)string[0] <= 127) { key = (u_char)string[0]; - if (key < 32 || key == 127) + if (key < 32) return (KEYC_UNKNOWN); } else { /* Try as a UTF-8 key. */ @@ -226,6 +226,8 @@ key_string_lookup_string(const char *string) key -= 64; else if (key == 32) key = 0; + else if (key == '?') + key = 127; else if (key == 63) key = KEYC_BSPACE; else @@ -329,7 +331,7 @@ key_string_lookup_key(key_code key) } /* Invalid keys are errors. */ - if (key == 127 || key > 255) { + if (key > 255) { snprintf(out, sizeof out, "Invalid#%llx", key); return (out); } @@ -343,7 +345,9 @@ key_string_lookup_key(key_code key) } else if (key >= 32 && key <= 126) { tmp[0] = key; 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); strlcat(out, tmp, sizeof out); diff --git a/options-table.c b/options-table.c index 77dbfb13..cbe5197d 100644 --- a/options-table.c +++ b/options-table.c @@ -147,6 +147,12 @@ static const char *options_table_status_format_default[] = { /* Top-level options. */ const struct options_table_entry options_table[] = { /* Server options. */ + { .name = "backspace", + .type = OPTIONS_TABLE_KEY, + .scope = OPTIONS_TABLE_SERVER, + .default_num = '\177', + }, + { .name = "buffer-limit", .type = OPTIONS_TABLE_NUMBER, .scope = OPTIONS_TABLE_SERVER, @@ -217,6 +217,7 @@ spawn_pane(struct spawn_context *sc, char **cause) u_int hlimit; struct winsize ws; sigset_t set, oldset; + key_code key; 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 - * force VERASE to tmux's \177. + * force VERASE to tmux's backspace. */ if (tcgetattr(STDIN_FILENO, &now) != 0) _exit(1); if (s->tio != NULL) 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) _exit(1); @@ -2925,6 +2925,10 @@ omitted to toggle). .Pp Available server options are: .Bl -tag -width Ds +.It Ic backspace Ar key +Set the key sent by +.Nm +for backspace. .It Ic buffer-limit Ar number 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 |