From cb2ac5c269d42d1f95e6dc6e5585c4ac01a360e4 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sat, 28 Mar 2009 14:08:09 +0000 Subject: [PATCH] Key repeating is now a property of the key binding not of the command. Repeat is turned on when the key is bound with the -r flag to bind-key. next/previous- window no longer repeat by default as it turned out to annoy me. --- CHANGES | 9 +++- TODO | 3 +- cmd-bind-key.c | 15 ++++--- cmd-down-pane.c | 4 +- cmd-next-window.c | 4 +- cmd-previous-window.c | 4 +- cmd-resize-pane-down.c | 4 +- cmd-resize-pane-up.c | 4 +- cmd-up-pane.c | 4 +- key-bindings.c | 100 +++++++++++++++++++++-------------------- server.c | 15 ++----- tmux.h | 6 +-- 12 files changed, 89 insertions(+), 83 deletions(-) diff --git a/CHANGES b/CHANGES index 94f456b0..2a9173c4 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +28 March 2009 + +* Key repeating is now a property of the key binding not of the command. + Repeat is turned on when the key is bound with the -r flag to bind-key. + next/previous-window no longer repeat by default as it turned out to annoy + me. + 27 March 2009 * Clear using ED when redrawing the screen. I foolishly assumed using spaces @@ -1145,7 +1152,7 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.261 2009-03-28 10:15:01 nicm Exp $ +$Id: CHANGES,v 1.262 2009-03-28 14:08:09 nicm Exp $ LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB ms diff --git a/TODO b/TODO index 91a115f5..1eeca67d 100644 --- a/TODO +++ b/TODO @@ -90,9 +90,8 @@ - better support for stupid margin terminals. strcmp for cons25 sucks, how can these be autodetected? - refer to windows by name etc (duplicates? fnmatch?) -- n/p repeat is annoying, turn off -- repeat should be a key flag and should be configurable (bind -r) +- document repeat behaviour and -r on bind-key - document status-keys - document break-pane - document -8 flag diff --git a/cmd-bind-key.c b/cmd-bind-key.c index d8dc0dff..1991bae9 100644 --- a/cmd-bind-key.c +++ b/cmd-bind-key.c @@ -1,4 +1,4 @@ -/* $Id: cmd-bind-key.c,v 1.19 2009-01-19 18:23:40 nicm Exp $ */ +/* $Id: cmd-bind-key.c,v 1.20 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -33,12 +33,13 @@ size_t cmd_bind_key_print(struct cmd *, char *, size_t); struct cmd_bind_key_data { int key; + int can_repeat; struct cmd_list *cmdlist; }; const struct cmd_entry cmd_bind_key_entry = { "bind-key", "bind", - "key command [arguments]", + "[-r] key command [arguments]", 0, NULL, cmd_bind_key_parse, @@ -56,11 +57,15 @@ cmd_bind_key_parse(struct cmd *self, int argc, char **argv, char **cause) int opt; self->data = data = xmalloc(sizeof *data); + data->can_repeat = 0; data->cmdlist = NULL; - while ((opt = getopt(argc, argv, "")) != -1) { + while ((opt = getopt(argc, argv, "r")) != -1) { switch (opt) { - default: + case 'r': + data->can_repeat = 1; + break; + default: goto usage; } } @@ -97,7 +102,7 @@ cmd_bind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx) if (data == NULL) return (0); - key_bindings_add(data->key, data->cmdlist); + key_bindings_add(data->key, data->can_repeat, data->cmdlist); data->cmdlist = NULL; /* avoid free */ return (0); diff --git a/cmd-down-pane.c b/cmd-down-pane.c index 7e436fe0..842db127 100644 --- a/cmd-down-pane.c +++ b/cmd-down-pane.c @@ -1,4 +1,4 @@ -/* $Id: cmd-down-pane.c,v 1.3 2009-01-19 18:23:40 nicm Exp $ */ +/* $Id: cmd-down-pane.c,v 1.4 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -29,7 +29,7 @@ int cmd_down_pane_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_down_pane_entry = { "down-pane", "downp", CMD_TARGET_WINDOW_USAGE, - CMD_CANREPEAT, + 0, cmd_target_init, cmd_target_parse, cmd_down_pane_exec, diff --git a/cmd-next-window.c b/cmd-next-window.c index cbd74c20..cee90af9 100644 --- a/cmd-next-window.c +++ b/cmd-next-window.c @@ -1,4 +1,4 @@ -/* $Id: cmd-next-window.c,v 1.15 2009-01-19 18:23:40 nicm Exp $ */ +/* $Id: cmd-next-window.c,v 1.16 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -30,7 +30,7 @@ int cmd_next_window_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_next_window_entry = { "next-window", "next", CMD_TARGET_SESSION_USAGE, - CMD_CANREPEAT|CMD_AFLAG, + CMD_AFLAG, cmd_next_window_init, cmd_target_parse, cmd_next_window_exec, diff --git a/cmd-previous-window.c b/cmd-previous-window.c index b2372777..e9c4124d 100644 --- a/cmd-previous-window.c +++ b/cmd-previous-window.c @@ -1,4 +1,4 @@ -/* $Id: cmd-previous-window.c,v 1.15 2009-01-19 18:23:40 nicm Exp $ */ +/* $Id: cmd-previous-window.c,v 1.16 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -30,7 +30,7 @@ int cmd_previous_window_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_previous_window_entry = { "previous-window", "prev", CMD_TARGET_SESSION_USAGE, - CMD_CANREPEAT|CMD_AFLAG, + CMD_AFLAG, cmd_previous_window_init, cmd_target_parse, cmd_previous_window_exec, diff --git a/cmd-resize-pane-down.c b/cmd-resize-pane-down.c index d6839ea3..adb27089 100644 --- a/cmd-resize-pane-down.c +++ b/cmd-resize-pane-down.c @@ -1,4 +1,4 @@ -/* $Id: cmd-resize-pane-down.c,v 1.6 2009-01-19 18:23:40 nicm Exp $ */ +/* $Id: cmd-resize-pane-down.c,v 1.7 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -32,7 +32,7 @@ int cmd_resize_pane_down_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_resize_pane_down_entry = { "resize-pane-down", "resizep-down", CMD_PANE_WINDOW_USAGE " [adjustment]", - CMD_ARG01|CMD_CANREPEAT, + CMD_ARG01, cmd_resize_pane_down_init, cmd_pane_parse, cmd_resize_pane_down_exec, diff --git a/cmd-resize-pane-up.c b/cmd-resize-pane-up.c index 578a4316..5c685c78 100644 --- a/cmd-resize-pane-up.c +++ b/cmd-resize-pane-up.c @@ -1,4 +1,4 @@ -/* $Id: cmd-resize-pane-up.c,v 1.6 2009-01-19 18:23:40 nicm Exp $ */ +/* $Id: cmd-resize-pane-up.c,v 1.7 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -32,7 +32,7 @@ int cmd_resize_pane_up_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_resize_pane_up_entry = { "resize-pane-up", "resizep-up", CMD_PANE_WINDOW_USAGE " [adjustment]", - CMD_ARG01|CMD_CANREPEAT, + CMD_ARG01, cmd_resize_pane_up_init, cmd_pane_parse, cmd_resize_pane_up_exec, diff --git a/cmd-up-pane.c b/cmd-up-pane.c index 28c20ab4..a78e140d 100644 --- a/cmd-up-pane.c +++ b/cmd-up-pane.c @@ -1,4 +1,4 @@ -/* $Id: cmd-up-pane.c,v 1.3 2009-01-19 18:23:40 nicm Exp $ */ +/* $Id: cmd-up-pane.c,v 1.4 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -29,7 +29,7 @@ int cmd_up_pane_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_up_pane_entry = { "up-pane", "upp", CMD_TARGET_WINDOW_USAGE, - CMD_CANREPEAT, + 0, cmd_target_init, cmd_target_parse, cmd_up_pane_exec, diff --git a/key-bindings.c b/key-bindings.c index 3b024d47..76940123 100644 --- a/key-bindings.c +++ b/key-bindings.c @@ -1,4 +1,4 @@ -/* $Id: key-bindings.c,v 1.62 2009-03-07 09:29:54 nicm Exp $ */ +/* $Id: key-bindings.c,v 1.63 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -44,7 +44,7 @@ key_bindings_lookup(int key) } void -key_bindings_add(int key, struct cmd_list *cmdlist) +key_bindings_add(int key, int can_repeat, struct cmd_list *cmdlist) { struct key_binding *bd; @@ -54,6 +54,7 @@ key_bindings_add(int key, struct cmd_list *cmdlist) SPLAY_INSERT(key_bindings, &key_bindings, bd); } else cmd_list_free(bd->cmdlist); + bd->can_repeat = can_repeat; bd->cmdlist = cmdlist; } @@ -75,54 +76,55 @@ key_bindings_init(void) { struct { int key; + int can_repeat; const struct cmd_entry *entry; } table[] = { - { '!', &cmd_break_pane_entry }, - { '"', &cmd_split_window_entry }, - { '#', &cmd_list_buffers_entry }, - { '&', &cmd_kill_window_entry }, - { ',', &cmd_command_prompt_entry }, - { '-', &cmd_delete_buffer_entry }, - { '.', &cmd_command_prompt_entry }, - { '0', &cmd_select_window_entry }, - { '1', &cmd_select_window_entry }, - { '2', &cmd_select_window_entry }, - { '3', &cmd_select_window_entry }, - { '4', &cmd_select_window_entry }, - { '5', &cmd_select_window_entry }, - { '6', &cmd_select_window_entry }, - { '7', &cmd_select_window_entry }, - { '8', &cmd_select_window_entry }, - { '9', &cmd_select_window_entry }, - { ':', &cmd_command_prompt_entry }, - { '=', &cmd_scroll_mode_entry }, - { '?', &cmd_list_keys_entry }, - { '[', &cmd_copy_mode_entry }, - { '\'', &cmd_select_prompt_entry }, - { ']', &cmd_paste_buffer_entry }, - { 'c', &cmd_new_window_entry }, - { 'd', &cmd_detach_client_entry }, - { 'f', &cmd_command_prompt_entry }, - { 'l', &cmd_last_window_entry }, - { 'n', &cmd_next_window_entry }, - { 'o', &cmd_down_pane_entry }, - { 'p', &cmd_previous_window_entry }, - { 'r', &cmd_refresh_client_entry }, - { 's', &cmd_choose_session_entry }, - { 't', &cmd_clock_mode_entry }, - { 'w', &cmd_choose_window_entry }, - { 'x', &cmd_kill_pane_entry, }, - { '\032', &cmd_suspend_client_entry }, - { KEYC_PPAGE, &cmd_scroll_mode_entry }, - { KEYC_ADDESC('n'), &cmd_next_window_entry }, - { KEYC_ADDESC('p'), &cmd_previous_window_entry }, - { KEYC_UP, &cmd_up_pane_entry }, - { KEYC_DOWN, &cmd_down_pane_entry }, - { KEYC_ADDESC(KEYC_UP), &cmd_resize_pane_up_entry }, - { KEYC_ADDESC(KEYC_DOWN), &cmd_resize_pane_down_entry }, - { KEYC_ADDCTL(KEYC_UP), &cmd_resize_pane_up_entry }, - { KEYC_ADDCTL(KEYC_DOWN), &cmd_resize_pane_down_entry }, - { META, &cmd_send_prefix_entry }, + { '!', 0, &cmd_break_pane_entry }, + { '"', 0, &cmd_split_window_entry }, + { '#', 0, &cmd_list_buffers_entry }, + { '&', 0, &cmd_kill_window_entry }, + { ',', 0, &cmd_command_prompt_entry }, + { '-', 0, &cmd_delete_buffer_entry }, + { '.', 0, &cmd_command_prompt_entry }, + { '0', 0, &cmd_select_window_entry }, + { '1', 0, &cmd_select_window_entry }, + { '2', 0, &cmd_select_window_entry }, + { '3', 0, &cmd_select_window_entry }, + { '4', 0, &cmd_select_window_entry }, + { '5', 0, &cmd_select_window_entry }, + { '6', 0, &cmd_select_window_entry }, + { '7', 0, &cmd_select_window_entry }, + { '8', 0, &cmd_select_window_entry }, + { '9', 0, &cmd_select_window_entry }, + { ':', 0, &cmd_command_prompt_entry }, + { '=', 0, &cmd_scroll_mode_entry }, + { '?', 0, &cmd_list_keys_entry }, + { '[', 0, &cmd_copy_mode_entry }, + { '\'', 0, &cmd_select_prompt_entry }, + { ']', 0, &cmd_paste_buffer_entry }, + { 'c', 0, &cmd_new_window_entry }, + { 'd', 0, &cmd_detach_client_entry }, + { 'f', 0, &cmd_command_prompt_entry }, + { 'l', 0, &cmd_last_window_entry }, + { 'n', 0, &cmd_next_window_entry }, + { 'o', 0, &cmd_down_pane_entry }, + { 'p', 0, &cmd_previous_window_entry }, + { 'r', 0, &cmd_refresh_client_entry }, + { 's', 0, &cmd_choose_session_entry }, + { 't', 0, &cmd_clock_mode_entry }, + { 'w', 0, &cmd_choose_window_entry }, + { 'x', 0, &cmd_kill_pane_entry, }, + { '\032', 0, &cmd_suspend_client_entry }, + { META, 0, &cmd_send_prefix_entry }, + { KEYC_PPAGE, 0, &cmd_scroll_mode_entry }, + { KEYC_ADDESC('n'), 0, &cmd_next_window_entry }, + { KEYC_ADDESC('p'), 0, &cmd_previous_window_entry }, + { KEYC_UP, 1, &cmd_up_pane_entry }, + { KEYC_DOWN, 1, &cmd_down_pane_entry }, + { KEYC_ADDESC(KEYC_UP), 1, &cmd_resize_pane_up_entry }, + { KEYC_ADDESC(KEYC_DOWN), 1, &cmd_resize_pane_down_entry }, + { KEYC_ADDCTL(KEYC_UP), 1, &cmd_resize_pane_up_entry }, + { KEYC_ADDCTL(KEYC_DOWN), 1, &cmd_resize_pane_down_entry }, }; u_int i; struct cmd *cmd; @@ -141,7 +143,7 @@ key_bindings_init(void) cmd->entry->init(cmd, table[i].key); TAILQ_INSERT_HEAD(cmdlist, cmd, qentry); - key_bindings_add(table[i].key, cmdlist); + key_bindings_add(table[i].key, table[i].can_repeat, cmdlist); } } diff --git a/server.c b/server.c index 9493073e..8f13f7da 100644 --- a/server.c +++ b/server.c @@ -1,4 +1,4 @@ -/* $Id: server.c,v 1.129 2009-03-27 17:04:04 nicm Exp $ */ +/* $Id: server.c,v 1.130 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -690,7 +690,7 @@ server_handle_client(struct client *c) struct timeval tv; struct key_binding *bd; struct cmd *cmd; - int key, prefix, status, xtimeout, can_repeat; + int key, prefix, status, xtimeout; int mode; u_char mouse[3]; @@ -748,15 +748,8 @@ server_handle_client(struct client *c) continue; } - /* Check repeat flag. */ - can_repeat = 1; - TAILQ_FOREACH(cmd, bd->cmdlist, qentry) { - if (!(cmd->entry->flags & CMD_CANREPEAT)) - can_repeat = 0; - } - /* If already repeating, but this key can't repeat, skip it. */ - if (c->flags & CLIENT_REPEAT && !can_repeat) { + if (c->flags & CLIENT_REPEAT && !bd->can_repeat) { c->flags &= ~CLIENT_REPEAT; if (key == prefix) c->flags |= CLIENT_PREFIX; @@ -766,7 +759,7 @@ server_handle_client(struct client *c) } /* If this key can repeat, reset the repeat flags and timer. */ - if (xtimeout != 0 && can_repeat) { + if (xtimeout != 0 && bd->can_repeat) { c->flags |= CLIENT_PREFIX|CLIENT_REPEAT; tv.tv_sec = xtimeout / 1000; diff --git a/tmux.h b/tmux.h index 9c7f9e28..7ed6bd93 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.285 2009-03-28 10:15:01 nicm Exp $ */ +/* $Id: tmux.h,v 1.286 2009-03-28 14:08:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -888,7 +888,6 @@ struct cmd_entry { #define CMD_CANTNEST 0x2 #define CMD_ARG1 0x4 #define CMD_ARG01 0x8 -#define CMD_CANREPEAT 0x10 #define CMD_KFLAG 0x10 #define CMD_DFLAG 0x20 #define CMD_GFLAG 0x40 @@ -944,6 +943,7 @@ struct cmd_pane_data { struct key_binding { int key; struct cmd_list *cmdlist; + int can_repeat; SPLAY_ENTRY(key_binding) entry; }; @@ -1291,7 +1291,7 @@ extern struct key_bindings key_bindings; int key_bindings_cmp(struct key_binding *, struct key_binding *); SPLAY_PROTOTYPE(key_bindings, key_binding, entry, key_bindings_cmp); struct key_binding *key_bindings_lookup(int); -void key_bindings_add(int, struct cmd_list *); +void key_bindings_add(int, int, struct cmd_list *); void key_bindings_remove(int); void key_bindings_init(void); void key_bindings_free(void);