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 Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft MVPs and experts. ON SALE this month only -- learn more at: http://p.sf.net/sfu/learnmore_122712 _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users