I've just applied something similar to this to make tmux support the
most common set and pass them through if xterm-keys is on. Binding them
in emacs is left as an exercise for the reader ;-).


On Fri, Feb 15, 2013 at 02:20:21AM +0000, Nicholas Marriott wrote:
> Actually I just did some tidying while I was looking at this so here's a
> diff against latest git:
> 
> diff --git a/input-keys.c b/input-keys.c
> index 0953ce7..1d75809 100644
> --- a/input-keys.c
> +++ b/input-keys.c
> @@ -130,6 +130,9 @@ const struct input_key_ent input_keys[] = {
>       { KEYC_KP_ENTER,        "\n",           0 },
>       { KEYC_KP_ZERO,         "0",            0 },
>       { KEYC_KP_PERIOD,       ".",            0 },
> +
> +     /* xterm modifyOtherKeys keys. */
> +     { '\r'|KEYC_CTRL,       "\033[27;5;13~", 0 },
>  };
>  
>  /* Translate a key code into an output key sequence. */
> diff --git a/key-string.c b/key-string.c
> index df17739..d646136 100644
> --- a/key-string.c
> +++ b/key-string.c
> @@ -170,7 +170,7 @@ key_string_lookup_string(const char *string)
>       }
>  
>       /* Convert the standard control keys. */
> -     if (key < KEYC_BASE && (modifiers & KEYC_CTRL)) {
> +     if (key < KEYC_BASE && key != '\r' && (modifiers & KEYC_CTRL)) {
>               if (key >= 97 && key <= 122)
>                       key -= 96;
>               else if (key >= 64 && key <= 95)
> diff --git a/tty-keys.c b/tty-keys.c
> index bd7fdb1..3c0427f 100644
> --- a/tty-keys.c
> +++ b/tty-keys.c
> @@ -174,6 +174,9 @@ const struct tty_default_key_raw tty_default_raw_keys[] = 
> {
>       { "\033[8@", KEYC_END|KEYC_CTRL|KEYC_SHIFT },
>       { "\033[6@", KEYC_NPAGE|KEYC_CTRL|KEYC_SHIFT },
>       { "\033[5@", KEYC_PPAGE|KEYC_CTRL|KEYC_SHIFT },
> +
> +     /* xterm modifyOtherKeys keys. */
> +     { "\033[27;5;13~", '\r'|KEYC_CTRL },
>  };
>  
>  /* Default terminfo(5) keys. */
> diff --git a/tty.c b/tty.c
> index 868032d..500757e 100644
> --- a/tty.c
> +++ b/tty.c
> @@ -223,7 +223,7 @@ tty_start_tty(struct tty *tty)
>               tty_puts(tty, "\033[?1000l");
>  
>       if (tty_term_has(tty->term, TTYC_XT))
> -             tty_puts(tty, "\033[c");
> +             tty_puts(tty, "\033[c\033[>4;1m");
>  
>       tty->cx = UINT_MAX;
>       tty->cy = UINT_MAX;
> @@ -287,6 +287,9 @@ tty_stop_tty(struct tty *tty)
>       if (tty_term_has(tty->term, TTYC_KMOUS))
>               tty_raw(tty, "\033[?1000l");
>  
> +     if (tty_term_has(tty->term, TTYC_XT))
> +             tty_puts(tty, "\033[>4m");
> +
>       tty_raw(tty, tty_term_string(tty->term, TTYC_RMCUP));
>  }
>  
> 
> 
> On Fri, Feb 15, 2013 at 01:48:27AM +0000, Nicholas Marriott wrote:
> > You can't bind arbitrary key strings at the moment and it wouldn't work
> > anyway because:
> > 
> > - The program must tell xterm to send these and tmux doesn't do this.
> > 
> > - emacs only accepts the keys when TERM=xterm, not when TERM=screen.
> > 
> > There has been some talk of supporting xterm modifyOtherKeys but so far
> > nobody has done it.
> > 
> > This diff will send the sequence to turn on modifyOtherKeys and pass
> > C-Enter through which should be enough for you if you can persuade emacs
> > to accept it inside tmux.
> > 
> > However I'm not going to commit it as it is, because I think we need to
> > a) support all the keys modifyOtherKeys affects, not just Enter b) only
> > send them through to the terminal inside if the application has
> > requested them with CSI 4;1m or CSI 4;2m and the xterm-keys option is
> > enabled. If you feel like picking it up that would be great otherwise
> > it'll have to wait til I get the time and inclination to finish it :-).
> > 
> > 
> > diff --git a/input-keys.c b/input-keys.c
> > index 0953ce7..1d75809 100644
> > --- a/input-keys.c
> > +++ b/input-keys.c
> > @@ -130,6 +130,9 @@ const struct input_key_ent input_keys[] = {
> >     { KEYC_KP_ENTER,        "\n",           0 },
> >     { KEYC_KP_ZERO,         "0",            0 },
> >     { KEYC_KP_PERIOD,       ".",            0 },
> > +
> > +   /* xterm modifyOtherKeys keys. */
> > +   { '\r'|KEYC_CTRL,       "\033[27;5;13~", 0 },
> >  };
> >  
> >  /* Translate a key code into an output key sequence. */
> > diff --git a/key-string.c b/key-string.c
> > index df17739..d646136 100644
> > --- a/key-string.c
> > +++ b/key-string.c
> > @@ -170,7 +170,7 @@ key_string_lookup_string(const char *string)
> >     }
> >  
> >     /* Convert the standard control keys. */
> > -   if (key < KEYC_BASE && (modifiers & KEYC_CTRL)) {
> > +   if (key < KEYC_BASE && key != '\r' && (modifiers & KEYC_CTRL)) {
> >             if (key >= 97 && key <= 122)
> >                     key -= 96;
> >             else if (key >= 64 && key <= 95)
> > diff --git a/tty-keys.c b/tty-keys.c
> > index 681f31b..08d846d 100644
> > --- a/tty-keys.c
> > +++ b/tty-keys.c
> > @@ -186,6 +186,9 @@ const struct tty_key_ent tty_keys[] = {
> >     { 0,    "\033[6@",      KEYC_NPAGE|KEYC_CTRL|KEYC_SHIFT,TTYKEY_RAW },
> >     { 0,    "\033[5@",      KEYC_PPAGE|KEYC_CTRL|KEYC_SHIFT,TTYKEY_RAW },
> >  
> > +   /* xterm modifyOtherKeys keys. */
> > +   { 0,    "\033[27;5;13~", '\r'|KEYC_CTRL,                TTYKEY_RAW },
> > +
> >     /* terminfo lookups below this line so they can override raw keys. */
> >  
> >     /* Function keys. */
> > diff --git a/tty.c b/tty.c
> > index e810f36..49a469c 100644
> > --- a/tty.c
> > +++ b/tty.c
> > @@ -223,7 +223,7 @@ tty_start_tty(struct tty *tty)
> >             tty_puts(tty, "\033[?1000l");
> >  
> >     if (tty_term_has(tty->term, TTYC_XT))
> > -           tty_puts(tty, "\033[c");
> > +           tty_puts(tty, "\033[c\033[>4;1m");
> >  
> >     tty->cx = UINT_MAX;
> >     tty->cy = UINT_MAX;
> > @@ -287,6 +287,9 @@ tty_stop_tty(struct tty *tty)
> >     if (tty_term_has(tty->term, TTYC_KMOUS))
> >             tty_raw(tty, "\033[?1000l");
> >  
> > +   if (tty_term_has(tty->term, TTYC_XT))
> > +           tty_puts(tty, "\033[>4m");
> > +
> >     tty_raw(tty, tty_term_string(tty->term, TTYC_RMCUP));
> >  }
> >  
> > 
> > 
> > 
> > 
> > 
> > 
> > On Thu, Feb 14, 2013 at 10:50:11PM +0100, Csaba Andras wrote:
> > > I use xterm. Without tmux emacs is able to tell the difference between
> > > Enter and C-Enter.
> > > 
> > > I couldn't use "cat" as you described to find out the code because cat
> > > interpreted it as a line end.
> > > 
> > > However I could figure out what is given to emacs by xterm with
> > > "strace -v -e trace=read"
> > > 
> > > Enter sends:        read(3, "\r", 1)                        = 1
> > > C-Enter sends:      read(3, "\33[27;5;13~", 10)             = 10
> > > 
> > > This is not the only key combination which gets eaten by tmux.
> > > I would prefer if tmux would send every sequence through if it was not
> > > meant for tmux control.
> > > If that's not possible do I have a chance to whitelist the sequences I
> > > want to allow?
> > > 
> > > Thx,
> > > Csaba
> > > 
> > > On Thu, Feb 14, 2013 at 11:47 AM, Nicholas Marriott
> > > <nicholas.marri...@gmail.com> wrote:
> > > >
> > > > C-Enter doesn't send anything unique in most terminals, what does it
> > > > send in yours outside tmux? Run "cat" then press C-Enter and tell me
> > > > what you see.
> > > >
> > > > Also tell me what terminal you are using.
> > > >
> > > >
> > > > On Tue, Feb 12, 2013 at 01:34:55AM +0100, Csaba Andras wrote:
> > > > >    Hi
> > > > >    Tmux doesn't forward a few keyboard combinations that I need for 
> > > > > org-mode
> > > > >    in emacs.
> > > > >    The first one is C-Enter (org-insert-heading-respect-content).
> > > > >    I've tried Bindkey :send-keys C-Enter but that doesn't work.
> > > > >    It seems to me that it is intentionally stopped. See this change 
> > > > > by*Micah
> > > > >    Cowan:
> > > > >    [1]http://sourceforge.net/mailarchive/message.php?msg_id=25446931
> > > > >    Is there a workaround for me to get C-Enter working?
> > > > >    Cheers,
> > > > >    Csaba
> > > > >
> > > > > References
> > > > >
> > > > >    Visible links
> > > > >    1. http://sourceforge.net/mailarchive/message.php?msg_id=25446931
> > > >
> > > > > ------------------------------------------------------------------------------
> > > > > Free Next-Gen Firewall Hardware Offer
> > > > > Buy your Sophos next-gen firewall before the end March 2013
> > > > > and get the hardware for free! Learn more.
> > > > > http://p.sf.net/sfu/sophos-d2d-feb
> > > >
> > > > > _______________________________________________
> > > > > tmux-users mailing list
> > > > > tmux-users@lists.sourceforge.net
> > > > > https://lists.sourceforge.net/lists/listinfo/tmux-users
> > > >

------------------------------------------------------------------------------
The Go Parallel Website, sponsored by Intel - in partnership with Geeknet, 
is your hub for all things parallel software development, from weekly thought 
leadership blogs to news, videos, case studies, tutorials, tech docs, 
whitepapers, evaluation guides, and opinion stories. Check out the most 
recent posts - join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to