Make send -N work for all keys, not just in copy mode. From Artem Fokin.

pull/705/head
nicm 2016-11-29 12:54:46 +00:00
parent 9fc925ac51
commit 6b46c62bb4
2 changed files with 19 additions and 23 deletions

View File

@ -66,21 +66,16 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item)
const u_char *keystr; const u_char *keystr;
int i, literal; int i, literal;
key_code key; key_code key;
u_int np; u_int np = 1;
char *cause = NULL; char *cause = NULL;
if (args_has(args, 'N')) { if (args_has(args, 'N')) {
if (wp->mode == NULL || wp->mode->command == NULL) {
cmdq_error(item, "not in a mode");
return (CMD_RETURN_ERROR);
}
np = args_strtonum(args, 'N', 1, UINT_MAX, &cause); np = args_strtonum(args, 'N', 1, UINT_MAX, &cause);
if (cause != NULL) { if (cause != NULL) {
cmdq_error(item, "prefix %s", cause); cmdq_error(item, "repeat count %s", cause);
free(cause); free(cause);
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
} }
wp->modeprefix = np;
} }
if (args_has(args, 'X')) { if (args_has(args, 'X')) {
@ -88,6 +83,7 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item)
cmdq_error(item, "not in a mode"); cmdq_error(item, "not in a mode");
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
} }
wp->modeprefix = np;
if (!m->valid) if (!m->valid)
wp->mode->command(wp, c, s, args, NULL); wp->mode->command(wp, c, s, args, NULL);
else else
@ -95,9 +91,6 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item)
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
} }
if (args_has(args, 'N')) /* only with -X */
return (CMD_RETURN_NORMAL);
if (args_has(args, 'M')) { if (args_has(args, 'M')) {
wp = cmd_mouse_pane(m, &s, NULL); wp = cmd_mouse_pane(m, &s, NULL);
if (wp == NULL) { if (wp == NULL) {
@ -120,19 +113,22 @@ cmd_send_keys_exec(struct cmd *self, struct cmdq_item *item)
if (args_has(args, 'R')) if (args_has(args, 'R'))
input_reset(wp, 1); input_reset(wp, 1);
for (i = 0; i < args->argc; i++) { for (; np != 0; np--) {
literal = args_has(args, 'l'); for (i = 0; i < args->argc; i++) {
if (!literal) { literal = args_has(args, 'l');
key = key_string_lookup_string(args->argv[i]); if (!literal) {
if (key != KEYC_NONE && key != KEYC_UNKNOWN) key = key_string_lookup_string(args->argv[i]);
window_pane_key(wp, NULL, s, key, NULL); if (key != KEYC_NONE && key != KEYC_UNKNOWN)
else window_pane_key(wp, NULL, s, key, NULL);
literal = 1; else
} literal = 1;
if (literal) { }
for (keystr = args->argv[i]; *keystr != '\0'; keystr++) if (literal) {
window_pane_key(wp, NULL, s, *keystr, NULL); for (keystr = args->argv[i]; *keystr != '\0'; keystr++)
window_pane_key(wp, NULL, s, *keystr, NULL);
}
} }
} }
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);

2
tmux.1
View File

@ -2215,7 +2215,7 @@ the
.Sx WINDOWS AND PANES .Sx WINDOWS AND PANES
section. section.
.Fl N .Fl N
specifies a repeat count to a copy mode command. specifies a repeat count.
.It Xo Ic send-prefix .It Xo Ic send-prefix
.Op Fl 2 .Op Fl 2
.Op Fl t Ar target-pane .Op Fl t Ar target-pane