mirror of
https://github.com/tmux/tmux.git
synced 2024-11-17 18:08:51 +00:00
Have tmux recognise pasted texts wrapped in bracket paste sequences,
rather than only forwarding them to the program inside. From Andrew Onyshchuk in GitHub issue 3431.
This commit is contained in:
parent
b41892622d
commit
483cc77c1c
@ -497,6 +497,9 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
|
||||
ike = input_key_get(key & ~KEYC_EXTENDED);
|
||||
if (ike != NULL) {
|
||||
log_debug("found key 0x%llx: \"%s\"", key, ike->data);
|
||||
if ((key == KEYC_PASTE_START || key == KEYC_PASTE_END) &&
|
||||
(~s->mode & MODE_BRACKETPASTE))
|
||||
return (0);
|
||||
if ((key & KEYC_META) && (~key & KEYC_IMPLIED_META))
|
||||
input_key_write(__func__, bev, "\033", 1);
|
||||
input_key_write(__func__, bev, ike->data, strlen(ike->data));
|
||||
|
@ -45,6 +45,7 @@ static void server_client_check_modes(struct client *);
|
||||
static void server_client_set_title(struct client *);
|
||||
static void server_client_set_path(struct client *);
|
||||
static void server_client_reset_state(struct client *);
|
||||
static int server_client_is_bracket_pasting(struct client *, key_code);
|
||||
static int server_client_assume_paste(struct session *);
|
||||
static void server_client_update_latest(struct client *);
|
||||
|
||||
@ -1757,6 +1758,25 @@ out:
|
||||
return (key);
|
||||
}
|
||||
|
||||
/* Is this a bracket paste key? */
|
||||
static int
|
||||
server_client_is_bracket_pasting(struct client *c, key_code key)
|
||||
{
|
||||
if (key == KEYC_PASTE_START) {
|
||||
c->flags |= CLIENT_BRACKETPASTING;
|
||||
log_debug("%s: bracket paste on", c->name);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (key == KEYC_PASTE_END) {
|
||||
c->flags &= ~CLIENT_BRACKETPASTING;
|
||||
log_debug("%s: bracket paste off", c->name);
|
||||
return (1);
|
||||
}
|
||||
|
||||
return !!(c->flags & CLIENT_BRACKETPASTING);
|
||||
}
|
||||
|
||||
/* Is this fast enough to probably be a paste? */
|
||||
static int
|
||||
server_client_assume_paste(struct session *s)
|
||||
@ -1865,6 +1885,10 @@ server_client_key_callback(struct cmdq_item *item, void *data)
|
||||
if (KEYC_IS_MOUSE(key) && !options_get_number(s->options, "mouse"))
|
||||
goto forward_key;
|
||||
|
||||
/* Forward if bracket pasting. */
|
||||
if (server_client_is_bracket_pasting(c, key))
|
||||
goto forward_key;
|
||||
|
||||
/* Treat everything as a regular key when pasting is detected. */
|
||||
if (!KEYC_IS_MOUSE(key) && server_client_assume_paste(s))
|
||||
goto forward_key;
|
||||
|
1
tmux.h
1
tmux.h
@ -1811,6 +1811,7 @@ struct client {
|
||||
#define CLIENT_CONTROL_WAITEXIT 0x200000000ULL
|
||||
#define CLIENT_WINDOWSIZECHANGED 0x400000000ULL
|
||||
#define CLIENT_CLIPBOARDBUFFER 0x800000000ULL
|
||||
#define CLIENT_BRACKETPASTING 0x1000000000ULL
|
||||
#define CLIENT_ALLREDRAWFLAGS \
|
||||
(CLIENT_REDRAWWINDOW| \
|
||||
CLIENT_REDRAWSTATUS| \
|
||||
|
12
tty.c
12
tty.c
@ -341,6 +341,8 @@ tty_start_tty(struct tty *tty)
|
||||
tty_puts(tty, "\033[?1000l\033[?1002l\033[?1003l");
|
||||
tty_puts(tty, "\033[?1006l\033[?1005l");
|
||||
}
|
||||
if (tty_term_has(tty->term, TTYC_ENBP))
|
||||
tty_putcode(tty, TTYC_ENBP);
|
||||
|
||||
evtimer_set(&tty->start_timer, tty_start_timer_callback, tty);
|
||||
evtimer_add(&tty->start_timer, &tv);
|
||||
@ -417,8 +419,6 @@ tty_stop_tty(struct tty *tty)
|
||||
else if (tty_term_has(tty->term, TTYC_SS))
|
||||
tty_raw(tty, tty_term_string1(tty->term, TTYC_SS, 0));
|
||||
}
|
||||
if (tty->mode & MODE_BRACKETPASTE)
|
||||
tty_raw(tty, tty_term_string(tty->term, TTYC_DSBP));
|
||||
if (tty->ccolour != -1)
|
||||
tty_raw(tty, tty_term_string(tty->term, TTYC_CR));
|
||||
|
||||
@ -427,6 +427,8 @@ tty_stop_tty(struct tty *tty)
|
||||
tty_raw(tty, "\033[?1000l\033[?1002l\033[?1003l");
|
||||
tty_raw(tty, "\033[?1006l\033[?1005l");
|
||||
}
|
||||
if (tty_term_has(tty->term, TTYC_DSBP))
|
||||
tty_raw(tty, tty_term_string(tty->term, TTYC_DSBP));
|
||||
|
||||
if (tty->term->flags & TERM_VT100LIKE)
|
||||
tty_raw(tty, "\033[?7727l");
|
||||
@ -825,12 +827,6 @@ tty_update_mode(struct tty *tty, int mode, struct screen *s)
|
||||
else if (mode & MODE_MOUSE_STANDARD)
|
||||
tty_puts(tty, "\033[?1000h");
|
||||
}
|
||||
if (changed & MODE_BRACKETPASTE) {
|
||||
if (mode & MODE_BRACKETPASTE)
|
||||
tty_putcode(tty, TTYC_ENBP);
|
||||
else
|
||||
tty_putcode(tty, TTYC_DSBP);
|
||||
}
|
||||
tty->mode = mode;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user