diff --git a/cmd-send-keys.c b/cmd-send-keys.c index 8181e563..2e4775aa 100644 --- a/cmd-send-keys.c +++ b/cmd-send-keys.c @@ -19,6 +19,7 @@ #include #include +#include #include "tmux.h" @@ -30,8 +31,8 @@ int cmd_send_keys_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_send_keys_entry = { "send-keys", "send", - "t:", 0, -1, - "[-t target-pane] key ...", + "Rt:", 0, -1, + "[-R] [-t target-pane] key ...", 0, NULL, NULL, @@ -44,12 +45,29 @@ cmd_send_keys_exec(struct cmd *self, struct cmd_ctx *ctx) struct args *args = self->args; struct window_pane *wp; struct session *s; + struct input_ctx *ictx; const char *str; int i, key; if (cmd_find_pane(ctx, args_get(args, 't'), &s, &wp) == NULL) return (-1); + if (args_has(args, 'R')) { + ictx = &wp->ictx; + + memcpy(&ictx->cell, &grid_default_cell, sizeof ictx->cell); + memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell); + ictx->old_cx = 0; + ictx->old_cy = 0; + + if (wp->mode == NULL) + screen_write_start(&ictx->ctx, wp, &wp->base); + else + screen_write_start(&ictx->ctx, NULL, &wp->base); + screen_write_reset(&ictx->ctx); + screen_write_stop(&ictx->ctx); + } + for (i = 0; i < args->argc; i++) { str = args->argv[i]; diff --git a/input.c b/input.c index 6fd2d90a..f5ffe8f2 100644 --- a/input.c +++ b/input.c @@ -978,17 +978,7 @@ input_esc_dispatch(struct input_ctx *ictx) ictx->old_cx = 0; ictx->old_cy = 0; - screen_reset_tabs(sctx->s); - - screen_write_scrollregion(sctx, 0, screen_size_y(sctx->s) - 1); - - screen_write_insertmode(sctx, 0); - screen_write_kcursormode(sctx, 0); - screen_write_kkeypadmode(sctx, 0); - screen_write_mousemode_off(sctx); - - screen_write_clearscreen(sctx); - screen_write_cursormove(sctx, 0, 0); + screen_write_reset(sctx->s); break; case INPUT_ESC_IND: screen_write_linefeed(sctx, 0); diff --git a/screen-write.c b/screen-write.c index d1d02c7c..784f02e2 100644 --- a/screen-write.c +++ b/screen-write.c @@ -46,6 +46,24 @@ screen_write_stop(unused struct screen_write_ctx *ctx) { } + +/* Reset screen state. */ +void +screen_write_reset(struct screen_write_ctx *ctx) +{ + screen_reset_tabs(ctx->s); + + screen_write_scrollregion(ctx, 0, screen_size_y(ctx->s) - 1); + + screen_write_insertmode(ctx, 0); + screen_write_kcursormode(ctx, 0); + screen_write_kkeypadmode(ctx, 0); + screen_write_mousemode_off(ctx); + + screen_write_clearscreen(ctx); + screen_write_cursormove(ctx, 0, 0); +} + /* Write character. */ void screen_write_putc( diff --git a/tmux.1 b/tmux.1 index 6a73949a..b72c636d 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1634,6 +1634,7 @@ are listed; this may be one of: or .Em emacs-copy . .It Xo Ic send-keys +.Fl R .Op Fl t Ar target-pane .Ar key Ar ... .Xc @@ -1648,6 +1649,9 @@ or ) to send; if the string is not recognised as a key, it is sent as a series of characters. All arguments are sent sequentially from first to last. +The +.Fl R +flag causes the terminal state to be reset. .It Ic send-prefix Op Fl t Ar target-pane Send the prefix key to a window as if it was pressed. If multiple prefix keys are configured, only the first is sent. diff --git a/tmux.h b/tmux.h index effa15a1..617741d7 100644 --- a/tmux.h +++ b/tmux.h @@ -1832,6 +1832,7 @@ char *grid_view_string_cells(struct grid *, u_int, u_int, u_int); void screen_write_start( struct screen_write_ctx *, struct window_pane *, struct screen *); void screen_write_stop(struct screen_write_ctx *); +void screen_write_reset(struct screen_write_ctx *); size_t printflike2 screen_write_cstrlen(int, const char *, ...); void printflike5 screen_write_cnputs(struct screen_write_ctx *, ssize_t, struct grid_cell *, int, const char *, ...);