Hi Nicholas, Any plans for merging this?
On Thu, Dec 27, 2012 at 6:18 PM, Marcin Kulik <marcin.ku...@gmail.com> wrote: > This seems to be working great. So far so good. > > On Mon, Dec 24, 2012 at 1:21 PM, Nicholas Marriott > <nicholas.marri...@gmail.com> wrote: >> 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 >>> <nicholas.marri...@gmail.com> 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 >>> >> <nicholas.marri...@gmail.com> 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 >>> >> >> <nicholas.marri...@gmail.com> 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 >>> >> >> >> tmux-users@lists.sourceforge.net >>> >> >> >> https://lists.sourceforge.net/lists/listinfo/tmux-users >>> >> >> > >>> >> > >>> >> > ------------------------------------------------------------------------------ Master SQL Server Development, Administration, T-SQL, SSAS, SSIS, SSRS and more. Get SQL Server skills now (including 2012) with LearnDevNow - 200+ hours of step-by-step video tutorials by Microsoft MVPs and experts. SALE $99.99 this month only - learn more at: http://p.sf.net/sfu/learnmore_122512 _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users