Whoops, try this instead please:
Index: options-table.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/options-table.c,v
retrieving revision 1.30
diff -u -p -r1.30 options-table.c
--- options-table.c 27 Nov 2012 13:52:23 -0000 1.30
+++ options-table.c 24 Dec 2012 12:21:00 -0000
@@ -91,6 +91,13 @@ const struct options_table_entry server_
/* Session options. */
const struct options_table_entry session_options_table[] = {
+ { .name = "assume-paste-time",
+ .type = OPTIONS_TABLE_NUMBER,
+ .minimum = 0,
+ .maximum = INT_MAX,
+ .default_num = 1,
+ },
+
{ .name = "base-index",
.type = OPTIONS_TABLE_NUMBER,
.minimum = 0,
Index: server-client.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/server-client.c,v
retrieving revision 1.81
diff -u -p -r1.81 server-client.c
--- server-client.c 26 Oct 2012 14:35:42 -0000 1.81
+++ server-client.c 24 Dec 2012 12:21:01 -0000
@@ -34,6 +34,7 @@ void server_client_check_exit(struct cli
void server_client_check_redraw(struct client *);
void server_client_set_title(struct client *);
void server_client_reset_state(struct client *);
+int server_client_assume_paste(struct session *);
int server_client_msg_dispatch(struct client *);
void server_client_msg_command(struct client *, struct msg_command_data *);
@@ -325,6 +326,22 @@ server_client_check_mouse(struct client
window_pane_mouse(wp, c->session, m);
}
+/* Is this fast enough to probably be a paste? */
+int
+server_client_assume_paste(struct session *s)
+{
+ struct timeval tv;
+ u_int t;
+
+ if ((t = options_get_number(&s->options, "assume-paste-time")) == 0)
+ return 0;
+
+ timersub(&s->activity_time, &s->last_activity_time, &tv);
+ if (tv.tv_sec == 0 && tv.tv_usec < t * 1000)
+ return 1;
+ return 0;
+}
+
/* Handle data key input from client. */
void
server_client_handle_key(struct client *c, int key)
@@ -334,7 +351,7 @@ server_client_handle_key(struct client *
struct window_pane *wp;
struct timeval tv;
struct key_binding *bd;
- int xtimeout, isprefix;
+ int xtimeout, isprefix, ispaste;
/* Check the client is good to accept input. */
if ((c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0)
@@ -346,6 +363,9 @@ server_client_handle_key(struct client *
/* Update the activity timer. */
if (gettimeofday(&c->activity_time, NULL) != 0)
fatal("gettimeofday failed");
+
+ memcpy(&s->last_activity_time, &s->activity_time,
+ sizeof s->last_activity_time);
memcpy(&s->activity_time, &c->activity_time, sizeof s->activity_time);
w = c->session->curw->window;
@@ -382,25 +402,31 @@ server_client_handle_key(struct client *
}
/* Is this a prefix key? */
- if (key == options_get_number(&c->session->options, "prefix"))
+ if (key == options_get_number(&s->options, "prefix"))
isprefix = 1;
- else if (key == options_get_number(&c->session->options, "prefix2"))
+ else if (key == options_get_number(&s->options, "prefix2"))
isprefix = 1;
else
isprefix = 0;
+ /* Treat prefix as a regular key when pasting is detected. */
+ ispaste = server_client_assume_paste(s);
+ if (ispaste)
+ isprefix = 0;
+
/* No previous prefix key. */
if (!(c->flags & CLIENT_PREFIX)) {
- if (isprefix)
+ if (isprefix) {
c->flags |= CLIENT_PREFIX;
- else {
- /* Try as a non-prefix key binding. */
- if ((bd = key_bindings_lookup(key)) == NULL) {
- if (!(c->flags & CLIENT_READONLY))
- window_pane_key(wp, c->session, key);
- } else
- key_bindings_dispatch(bd, c);
+ return;
}
+
+ /* Try as a non-prefix key binding. */
+ if (ispaste || (bd = key_bindings_lookup(key)) == NULL) {
+ if (!(c->flags & CLIENT_READONLY))
+ window_pane_key(wp, s, key);
+ } else
+ key_bindings_dispatch(bd, c);
return;
}
@@ -413,7 +439,7 @@ server_client_handle_key(struct client *
if (isprefix)
c->flags |= CLIENT_PREFIX;
else if (!(c->flags & CLIENT_READONLY))
- window_pane_key(wp, c->session, key);
+ window_pane_key(wp, s, key);
}
return;
}
@@ -424,12 +450,12 @@ server_client_handle_key(struct client *
if (isprefix)
c->flags |= CLIENT_PREFIX;
else if (!(c->flags & CLIENT_READONLY))
- window_pane_key(wp, c->session, key);
+ window_pane_key(wp, s, key);
return;
}
/* If this key can repeat, reset the repeat flags and timer. */
- xtimeout = options_get_number(&c->session->options, "repeat-time");
+ xtimeout = options_get_number(&s->options, "repeat-time");
if (xtimeout != 0 && bd->can_repeat) {
c->flags |= CLIENT_PREFIX|CLIENT_REPEAT;
Index: tmux.1
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tmux.1,v
retrieving revision 1.308
diff -u -p -r1.308 tmux.1
--- tmux.1 27 Nov 2012 15:09:35 -0000 1.308
+++ tmux.1 24 Dec 2012 12:21:07 -0000
@@ -2031,6 +2031,13 @@ interactive menu when required.
.Pp
Available session options are:
.Bl -tag -width Ds
+.It Ic assume-paste-time Ar milliseconds
+If keys are entered faster than one in
+.Ar milliseconds ,
+they are assumed to have been pasted rather than typed and
+.Nm
+key bindings are not processed.
+The default is one millisecond and zero disables.
.It Ic base-index Ar index
Set the base index from which an unused index should be searched when a new
window is created.
Index: tmux.h
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tmux.h,v
retrieving revision 1.368
diff -u -p -r1.368 tmux.h
--- tmux.h 27 Nov 2012 22:59:34 -0000 1.368
+++ tmux.h 24 Dec 2012 12:21:08 -0000
@@ -1095,6 +1095,7 @@ struct session {
struct timeval creation_time;
struct timeval activity_time;
+ struct timeval last_activity_time;
u_int sx;
u_int sy;
@@ -1706,7 +1707,6 @@ int paste_replace(struct paste_stack *
char *paste_print(struct paste_buffer *, size_t);
void paste_send_pane(struct paste_buffer *, struct window_pane *,
const char *, int);
-
/* clock.c */
extern const char clock_table[14][5][5];
On Sun, Dec 23, 2012 at 01:17:25AM +0100, Marcin Kulik wrote:
> Yes, patch -l solved that.
>
> But it seems sth is wrong. Default value (1) doesn't do anything, tmux
> is still interpreting prefix key when pasting. Also, when I try to set
> assume-paste-time I can only do that with value 0. Higher values (like
> 1) give me "Value is too large: 1".
>
> On Fri, Dec 21, 2012 at 2:01 PM, Nicholas Marriott
> <[email protected]> wrote:
> > Does it work with patch -l?
> >
> >
> > On Fri, Dec 21, 2012 at 12:57:59PM +0100, Marcin Kulik wrote:
> >> Hey,
> >>
> >> I was trying to apply this patch but with no luck. I'm running: patch
> >> -p0 < 0001-nick.patch but I'm getting:
> >>
> >> patching file options-table.c
> >> Hunk #1 FAILED at 91.
> >> 1 out of 1 hunk FAILED -- saving rejects to file options-table.c.rej
> >> patching file server-client.c
> >> Hunk #1 FAILED at 34.
> >> Hunk #2 succeeded at 324 with fuzz 1 (offset -1 lines).
> >> Hunk #3 FAILED at 350.
> >> Hunk #4 FAILED at 362.
> >> Hunk #5 FAILED at 398.
> >> Hunk #6 FAILED at 429.
> >> Hunk #7 FAILED at 440.
> >> 6 out of 7 hunks FAILED -- saving rejects to file server-client.c.rej
> >> patching file tmux.1
> >> Hunk #1 succeeded at 2035 (offset 4 lines).
> >> patching file tmux.h
> >> Hunk #1 FAILED at 1095.
> >> 1 out of 1 hunk FAILED -- saving rejects to file tmux.h.rej
> >>
> >> I tried to apply it on several revisions from 27th Nov, also on
> >> current master but no luck.
> >>
> >> Marcin
> >>
> >> On Tue, Nov 27, 2012 at 3:15 PM, Nicholas Marriott
> >> <[email protected]> wrote:
> >> > Hi
> >> >
> >> > Sorry for the delay.
> >> >
> >> > This needs to handle -n key bindings too and unfortunately I think it
> >> > needs to be an option. Try this please:
> >> >
> >> > Index: options-table.c
> >> > ===================================================================
> >> > RCS file: /cvs/src/usr.bin/tmux/options-table.c,v
> >> > retrieving revision 1.30
> >> > diff -u -p -r1.30 options-table.c
> >> > --- options-table.c 27 Nov 2012 13:52:23 -0000 1.30
> >> > +++ options-table.c 27 Nov 2012 14:14:20 -0000
> >> > @@ -91,6 +91,11 @@ const struct options_table_entry server_
> >> >
> >> > /* Session options. */
> >> > const struct options_table_entry session_options_table[] = {
> >> > + { .name = "assume-paste-time",
> >> > + .type = OPTIONS_TABLE_NUMBER,
> >> > + .default_num = 1,
> >> > + },
> >> > +
> >> > { .name = "base-index",
> >> > .type = OPTIONS_TABLE_NUMBER,
> >> > .minimum = 0,
> >> > Index: server-client.c
> >> > ===================================================================
> >> > RCS file: /cvs/src/usr.bin/tmux/server-client.c,v
> >> > retrieving revision 1.81
> >> > diff -u -p -r1.81 server-client.c
> >> > --- server-client.c 26 Oct 2012 14:35:42 -0000 1.81
> >> > +++ server-client.c 27 Nov 2012 14:14:25 -0000
> >> > @@ -34,6 +34,7 @@ void server_client_check_exit(struct cli
> >> > void server_client_check_redraw(struct client *);
> >> > void server_client_set_title(struct client *);
> >> > void server_client_reset_state(struct client *);
> >> > +int server_client_assume_paste(struct session *);
> >> >
> >> > int server_client_msg_dispatch(struct client *);
> >> > void server_client_msg_command(struct client *, struct
> >> > msg_command_data *);
> >> > @@ -325,6 +326,22 @@ server_client_check_mouse(struct client
> >> > window_pane_mouse(wp, c->session, m);
> >> > }
> >> >
> >> > +/* Is this fast enough to probably be a paste? */
> >> > +int
> >> > +server_client_assume_paste(struct session *s)
> >> > +{
> >> > + struct timeval tv;
> >> > + u_int t;
> >> > +
> >> > + if ((t = options_get_number(&s->options, "assume-paste-time"))
> >> > == 0)
> >> > + return 0;
> >> > +
> >> > + timersub(&s->activity_time, &s->last_activity_time, &tv);
> >> > + if (tv.tv_sec == 0 && tv.tv_usec < t * 1000)
> >> > + return 1;
> >> > + return 0;
> >> > +}
> >> > +
> >> > /* Handle data key input from client. */
> >> > void
> >> > server_client_handle_key(struct client *c, int key)
> >> > @@ -334,7 +351,7 @@ server_client_handle_key(struct client *
> >> > struct window_pane *wp;
> >> > struct timeval tv;
> >> > struct key_binding *bd;
> >> > - int xtimeout, isprefix;
> >> > + int xtimeout, isprefix, ispaste;
> >> >
> >> > /* Check the client is good to accept input. */
> >> > if ((c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0)
> >> > @@ -346,6 +363,9 @@ server_client_handle_key(struct client *
> >> > /* Update the activity timer. */
> >> > if (gettimeofday(&c->activity_time, NULL) != 0)
> >> > fatal("gettimeofday failed");
> >> > +
> >> > + memcpy(&s->last_activity_time, &s->activity_time,
> >> > + sizeof s->last_activity_time);
> >> > memcpy(&s->activity_time, &c->activity_time, sizeof
> >> > s->activity_time);
> >> >
> >> > w = c->session->curw->window;
> >> > @@ -382,25 +402,31 @@ server_client_handle_key(struct client *
> >> > }
> >> >
> >> > /* Is this a prefix key? */
> >> > - if (key == options_get_number(&c->session->options, "prefix"))
> >> > + if (key == options_get_number(&s->options, "prefix"))
> >> > isprefix = 1;
> >> > - else if (key == options_get_number(&c->session->options,
> >> > "prefix2"))
> >> > + else if (key == options_get_number(&s->options, "prefix2"))
> >> > isprefix = 1;
> >> > else
> >> > isprefix = 0;
> >> >
> >> > + /* Treat prefix as a regular key when pasting is detected. */
> >> > + ispaste = server_client_assume_paste(s);
> >> > + if (ispaste)
> >> > + isprefix = 0;
> >> > +
> >> > /* No previous prefix key. */
> >> > if (!(c->flags & CLIENT_PREFIX)) {
> >> > - if (isprefix)
> >> > + if (isprefix) {
> >> > c->flags |= CLIENT_PREFIX;
> >> > - else {
> >> > - /* Try as a non-prefix key binding. */
> >> > - if ((bd = key_bindings_lookup(key)) == NULL) {
> >> > - if (!(c->flags & CLIENT_READONLY))
> >> > - window_pane_key(wp, c->session,
> >> > key);
> >> > - } else
> >> > - key_bindings_dispatch(bd, c);
> >> > + return;
> >> > }
> >> > +
> >> > + /* Try as a non-prefix key binding. */
> >> > + if (ispaste || (bd = key_bindings_lookup(key)) == NULL) {
> >> > + if (!(c->flags & CLIENT_READONLY))
> >> > + window_pane_key(wp, s, key);
> >> > + } else
> >> > + key_bindings_dispatch(bd, c);
> >> > return;
> >> > }
> >> >
> >> > @@ -413,7 +439,7 @@ server_client_handle_key(struct client *
> >> > if (isprefix)
> >> > c->flags |= CLIENT_PREFIX;
> >> > else if (!(c->flags & CLIENT_READONLY))
> >> > - window_pane_key(wp, c->session, key);
> >> > + window_pane_key(wp, s, key);
> >> > }
> >> > return;
> >> > }
> >> > @@ -424,12 +450,12 @@ server_client_handle_key(struct client *
> >> > if (isprefix)
> >> > c->flags |= CLIENT_PREFIX;
> >> > else if (!(c->flags & CLIENT_READONLY))
> >> > - window_pane_key(wp, c->session, key);
> >> > + window_pane_key(wp, s, key);
> >> > return;
> >> > }
> >> >
> >> > /* If this key can repeat, reset the repeat flags and timer. */
> >> > - xtimeout = options_get_number(&c->session->options,
> >> > "repeat-time");
> >> > + xtimeout = options_get_number(&s->options, "repeat-time");
> >> > if (xtimeout != 0 && bd->can_repeat) {
> >> > c->flags |= CLIENT_PREFIX|CLIENT_REPEAT;
> >> >
> >> > Index: tmux.1
> >> > ===================================================================
> >> > RCS file: /cvs/src/usr.bin/tmux/tmux.1,v
> >> > retrieving revision 1.307
> >> > diff -u -p -r1.307 tmux.1
> >> > --- tmux.1 27 Nov 2012 13:52:23 -0000 1.307
> >> > +++ tmux.1 27 Nov 2012 14:14:29 -0000
> >> > @@ -2031,6 +2031,13 @@ interactive menu when required.
> >> > .Pp
> >> > Available session options are:
> >> > .Bl -tag -width Ds
> >> > +.It Ic assume-paste-time Ar milliseconds
> >> > +If keys are entered faster than one in
> >> > +.Ar milliseconds ,
> >> > +they are assumed to have been pasted rather than typed and
> >> > +.Nm
> >> > +key bindings are not processed.
> >> > +The default is one millisecond and zero disables.
> >> > .It Ic base-index Ar index
> >> > Set the base index from which an unused index should be searched when a
> >> > new
> >> > window is created.
> >> > Index: tmux.h
> >> > ===================================================================
> >> > RCS file: /cvs/src/usr.bin/tmux/tmux.h,v
> >> > retrieving revision 1.364
> >> > diff -u -p -r1.364 tmux.h
> >> > --- tmux.h 22 Nov 2012 14:41:11 -0000 1.364
> >> > +++ tmux.h 27 Nov 2012 14:14:32 -0000
> >> > @@ -1095,6 +1095,7 @@ struct session {
> >> >
> >> > struct timeval creation_time;
> >> > struct timeval activity_time;
> >> > + struct timeval last_activity_time;
> >> >
> >> > u_int sx;
> >> > u_int sy;
> >> >
> >> >
> >> >
> >> > On Thu, Oct 18, 2012 at 06:40:18PM +0200, Marcin Kulik wrote:
> >> >> Sure, previous version of patch attached.
> >> >> I used both versions and both worked well for me.
> >> >> As for the case of remote host (tcp delay etc) - both versions (with
> >> >> read_len and with time) can fail in this scenario, no?
> >> >>
> >> >> On Thu, Oct 18, 2012 at 4:24 PM, Nicholas Marriott
> >> >> <[email protected]> wrote:
> >> >> > Hmmmf I like the idea but like others have pointed out this will screw
> >> >> > up when using a remote host.
> >> >> >
> >> >> > Maybe your original version with the time was better, can you show me
> >> >> > it
> >> >> > again?
> >> >> >
> >> >> >
> >> >> > On Mon, Oct 15, 2012 at 04:16:00PM +0200, Marcin Kulik wrote:
> >> >> >> Hi guys,
> >> >> >>
> >> >> >> First, I'd like to give huge kudos to all you tmux developers,
> >> >> >> contributors and users. This is brilliant piece of software. Thanks!
> >> >> >>
> >> >> >> Second, I've been discussing small patch I created (attached) for
> >> >> >> tmux
> >> >> >> with Thomas Adam on #tmux and we think it's good enough to go into
> >> >> >> master.
> >> >> >>
> >> >> >> What it does is basically changing the way tmux handles prefix key
> >> >> >> detection. Without the patch when you paste some text into your
> >> >> >> terminal and this text contains prefix key (byte) tmux is
> >> >> >> interpreting
> >> >> >> the prefix like usual and invoking command connected to key binding
> >> >> >> for the character after the prefix.
> >> >> >> With this patch tmux detects if the currently handled prefix keypress
> >> >> >> belongs to longer (>1 in length) stdin read and when this is true it
> >> >> >> treats prefix key like any other, non-special key.
> >> >> >>
> >> >> >> This basically allows for comfortable use of printable character like
> >> >> >> backtick (`) as a prefix without a drawback like possibility of
> >> >> >> messing up the session/window when pasting bash/sql/other code that
> >> >> >> has backticks included.
> >> >> >>
> >> >> >> Marcin
> >> >> >
> >> >> >
> >> >> >> ------------------------------------------------------------------------------
> >> >> >> Don't let slow site performance ruin your business. Deploy New Relic
> >> >> >> APM
> >> >> >> Deploy New Relic app performance management and know exactly
> >> >> >> what is happening inside your Ruby, Python, PHP, Java, and .NET app
> >> >> >> Try New Relic at no cost today and get our sweet Data Nerd shirt too!
> >> >> >> http://p.sf.net/sfu/newrelic-dev2dev
> >> >> >
> >> >> >> _______________________________________________
> >> >> >> tmux-users mailing list
> >> >> >> [email protected]
> >> >> >> https://lists.sourceforge.net/lists/listinfo/tmux-users
> >> >> >
> >> >
> >> >
------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users