summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2010-12-11 16:05:58 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2010-12-11 16:05:58 +0000
commit8bc92ee092eadaa0b6814a734d1fc2635ef76eb9 (patch)
tree92fe6d2a7479a93b5a5f6182405360e01cba9173
parent78b3dd3594e0bd21bb808fbd71d461795466e016 (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.c7
-rw-r--r--usr.bin/tmux/status.c84
-rw-r--r--usr.bin/tmux/tmux.h6
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;