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
> >



------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to