aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd-new-session.c33
-rw-r--r--input-keys.c10
-rw-r--r--input.c2
-rw-r--r--key-string.c12
-rw-r--r--options-table.c6
-rw-r--r--spawn.c9
-rw-r--r--tmux.14
-rw-r--r--tty.c8
8 files changed, 58 insertions, 26 deletions
diff --git a/cmd-new-session.c b/cmd-new-session.c
index c7c407c6..c76b564e 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -94,26 +94,31 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
return (CMD_RETURN_ERROR);
}
- if (args_has(args, 's')) {
- newname = format_single(item, args_get(args, 's'), c, NULL,
- NULL, NULL);
+ tmp = args_get(args, 's');
+ if (tmp != NULL) {
+ newname = format_single(item, tmp, c, NULL, NULL, NULL);
if (!session_check_name(newname)) {
cmdq_error(item, "bad session name: %s", newname);
goto fail;
}
- if ((as = session_find(newname)) != NULL) {
- if (args_has(args, 'A')) {
- retval = cmd_attach_session(item,
- newname, args_has(args, 'D'),
- args_has(args, 'X'), 0, NULL,
- args_has(args, 'E'));
- free(newname);
- return (retval);
- }
- cmdq_error(item, "duplicate session: %s", newname);
- goto fail;
+ }
+ if (args_has(args, 'A')) {
+ if (newname != NULL)
+ as = session_find(newname);
+ else
+ as = item->target.s;
+ if (as != NULL) {
+ retval = cmd_attach_session(item, as->name,
+ args_has(args, 'D'), args_has(args, 'X'), 0, NULL,
+ args_has(args, 'E'));
+ free(newname);
+ return (retval);
}
}
+ if (newname != NULL && session_find(newname) != NULL) {
+ cmdq_error(item, "duplicate session: %s", newname);
+ goto fail;
+ }
/* Is this going to be part of a session group? */
group = args_get(args, 't');
diff --git a/input-keys.c b/input-keys.c
index 9e47a553..9a00ebef 100644
--- a/input-keys.c
+++ b/input-keys.c
@@ -42,9 +42,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 },
@@ -179,6 +176,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/input.c b/input.c
index ee12301c..cec46a99 100644
--- a/input.c
+++ b/input.c
@@ -876,7 +876,7 @@ input_set_state(struct window_pane *wp, const struct input_transition *itr)
void
input_parse(struct window_pane *wp)
{
- struct evbuffer *evb = wp->event->input;
+ struct evbuffer *evb = wp->event->input;
input_parse_buffer(wp, EVBUFFER_DATA(evb), EVBUFFER_LENGTH(evb));
evbuffer_drain(evb, EVBUFFER_LENGTH(evb));
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 c94939c6..816f4a7f 100644
--- a/options-table.c
+++ b/options-table.c
@@ -146,6 +146,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,
diff --git a/spawn.c b/spawn.c
index 2b361bd9..2a8a9cb3 100644
--- a/spawn.c
+++ b/spawn.c
@@ -215,6 +215,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);
@@ -376,13 +377,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);
diff --git a/tmux.1 b/tmux.1
index 971d164b..bb713d4a 100644
--- a/tmux.1
+++ b/tmux.1
@@ -2930,6 +2930,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
diff --git a/tty.c b/tty.c
index f8abb17a..d77bb440 100644
--- a/tty.c
+++ b/tty.c
@@ -2106,7 +2106,9 @@ tty_cursor(struct tty *tty, u_int cx, u_int cy)
if ((u_int) abs(change) > cx && tty_term_has(term, TTYC_HPA)) {
tty_putcode1(tty, TTYC_HPA, cx);
goto out;
- } else if (change > 0 && tty_term_has(term, TTYC_CUB)) {
+ } else if (change > 0 &&
+ tty_term_has(term, TTYC_CUB) &&
+ !tty_use_margin(tty)) {
if (change == 2 && tty_term_has(term, TTYC_CUB1)) {
tty_putcode(tty, TTYC_CUB1);
tty_putcode(tty, TTYC_CUB1);
@@ -2114,7 +2116,9 @@ tty_cursor(struct tty *tty, u_int cx, u_int cy)
}
tty_putcode1(tty, TTYC_CUB, change);
goto out;
- } else if (change < 0 && tty_term_has(term, TTYC_CUF)) {
+ } else if (change < 0 &&
+ tty_term_has(term, TTYC_CUF) &&
+ !tty_use_margin(tty)) {
tty_putcode1(tty, TTYC_CUF, -change);
goto out;
}