diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-12-11 16:05:58 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2010-12-11 16:05:58 +0000 |
commit | 8bc92ee092eadaa0b6814a734d1fc2635ef76eb9 (patch) | |
tree | 92fe6d2a7479a93b5a5f6182405360e01cba9173 | |
parent | 78b3dd3594e0bd21bb808fbd71d461795466e016 (diff) |
Make the prompt history global for all clients which is much more useful than per-client history.
-rw-r--r-- | usr.bin/tmux/server-client.c | 7 | ||||
-rw-r--r-- | usr.bin/tmux/status.c | 84 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 6 |
3 files changed, 61 insertions, 36 deletions
diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index d2d8932effc..fc33dfad98e 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.42 2010/10/16 08:31:55 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.43 2010/12/11 16:05:57 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -70,8 +70,6 @@ server_client_create(int fd) fatal("gettimeofday failed"); memcpy(&c->activity_time, &c->creation_time, sizeof c->activity_time); - ARRAY_INIT(&c->prompt_hdata); - c->stdin_event = NULL; c->stdout_event = NULL; c->stderr_event = NULL; @@ -161,9 +159,6 @@ server_client_lost(struct client *c) xfree(c->prompt_string); if (c->prompt_buffer != NULL) xfree(c->prompt_buffer); - for (i = 0; i < ARRAY_LENGTH(&c->prompt_hdata); i++) - xfree(ARRAY_ITEM(&c->prompt_hdata, i)); - ARRAY_FREE(&c->prompt_hdata); if (c->cwd != NULL) xfree(c->cwd); diff --git a/usr.bin/tmux/status.c b/usr.bin/tmux/status.c index 2dbef7c1889..3912ccd8b81 100644 --- a/usr.bin/tmux/status.c +++ b/usr.bin/tmux/status.c @@ -1,4 +1,4 @@ -/* $OpenBSD: status.c,v 1.64 2010/12/06 22:51:02 nicm Exp $ */ +/* $OpenBSD: status.c,v 1.65 2010/12/11 16:05:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -41,9 +41,14 @@ void status_replace1(struct client *, struct winlink *, char **, char **, char *, size_t, int); void status_message_callback(int, short, void *); -void status_prompt_add_history(struct client *); +const char *status_prompt_up_history(u_int *); +const char *status_prompt_down_history(u_int *); +void status_prompt_add_history(const char *); char *status_prompt_complete(const char *); +/* Status prompt history. */ +ARRAY_DECL(, char *) status_prompt_history = ARRAY_INITIALIZER; + /* Retrieve options for left string. */ char * status_redraw_get_left(struct client *c, @@ -972,29 +977,20 @@ status_prompt_key(struct client *c, int key) } break; case MODEKEYEDIT_HISTORYUP: - if (ARRAY_LENGTH(&c->prompt_hdata) == 0) + s = status_prompt_up_history(&c->prompt_hindex); + if (s == NULL) break; xfree(c->prompt_buffer); - - c->prompt_buffer = xstrdup(ARRAY_ITEM(&c->prompt_hdata, - ARRAY_LENGTH(&c->prompt_hdata) - 1 - c->prompt_hindex)); - if (c->prompt_hindex != ARRAY_LENGTH(&c->prompt_hdata) - 1) - c->prompt_hindex++; - + c->prompt_buffer = xstrdup(s); c->prompt_index = strlen(c->prompt_buffer); c->flags |= CLIENT_STATUS; break; case MODEKEYEDIT_HISTORYDOWN: + s = status_prompt_down_history(&c->prompt_hindex); + if (s == NULL) + break; xfree(c->prompt_buffer); - - if (c->prompt_hindex != 0) { - c->prompt_hindex--; - c->prompt_buffer = xstrdup(ARRAY_ITEM( - &c->prompt_hdata, ARRAY_LENGTH( - &c->prompt_hdata) - 1 - c->prompt_hindex)); - } else - c->prompt_buffer = xstrdup(""); - + c->prompt_buffer = xstrdup(s); c->prompt_index = strlen(c->prompt_buffer); c->flags |= CLIENT_STATUS; break; @@ -1036,7 +1032,7 @@ status_prompt_key(struct client *c, int key) break; case MODEKEYEDIT_ENTER: if (*c->prompt_buffer != '\0') - status_prompt_add_history(c); + status_prompt_add_history(c->prompt_buffer); if (c->prompt_callbackfn(c->prompt_data, c->prompt_buffer) == 0) status_prompt_clear(c); break; @@ -1072,20 +1068,56 @@ status_prompt_key(struct client *c, int key) } } +/* Get previous line from the history. */ +const char * +status_prompt_up_history(u_int *idx) +{ + u_int size; + + /* + * History runs from 0 to size - 1. + * + * Index is from 0 to size. Zero is empty. + */ + + size = ARRAY_LENGTH(&status_prompt_history); + if (size == 0 || *idx == size) + return (NULL); + (*idx)++; + return (ARRAY_ITEM(&status_prompt_history, size - *idx)); +} + +/* Get next line from the history. */ +const char * +status_prompt_down_history(u_int *idx) +{ + u_int size; + + size = ARRAY_LENGTH(&status_prompt_history); + if (size == 0 || *idx == 0) + return (""); + (*idx)--; + if (*idx == 0) + return (""); + return (ARRAY_ITEM(&status_prompt_history, size - *idx)); +} + /* Add line to the history. */ void -status_prompt_add_history(struct client *c) +status_prompt_add_history(const char *line) { - if (ARRAY_LENGTH(&c->prompt_hdata) > 0 && - strcmp(ARRAY_LAST(&c->prompt_hdata), c->prompt_buffer) == 0) + u_int size; + + size = ARRAY_LENGTH(&status_prompt_history); + if (size > 0 && strcmp(ARRAY_LAST(&status_prompt_history), line) == 0) return; - if (ARRAY_LENGTH(&c->prompt_hdata) == PROMPT_HISTORY) { - xfree(ARRAY_FIRST(&c->prompt_hdata)); - ARRAY_REMOVE(&c->prompt_hdata, 0); + if (size == PROMPT_HISTORY) { + xfree(ARRAY_FIRST(&status_prompt_history)); + ARRAY_REMOVE(&status_prompt_history, 0); } - ARRAY_ADD(&c->prompt_hdata, xstrdup(c->prompt_buffer)); + ARRAY_ADD(&status_prompt_history, xstrdup(line)); } /* Complete word. */ diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index f0efd93f6f9..d116dbefe86 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.248 2010/12/06 22:51:02 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.249 2010/12/11 16:05:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1147,13 +1147,11 @@ struct client { int (*prompt_callbackfn)(void *, const char *); void (*prompt_freefn)(void *); void *prompt_data; + u_int prompt_hindex; #define PROMPT_SINGLE 0x1 int prompt_flags; - u_int prompt_hindex; - ARRAY_DECL(, char *) prompt_hdata; - struct mode_key_data prompt_mdata; struct session *session; |