Paul LeoNerd Evans wrote:

> Vim's keyboard input system revolves centrally around a queue of bytes.
> This worked well when all the world was serial terminals. In this new
> world of GUIs this model doesn't work so well. I advocate changing it to
> a queue of keypress events.
> 
> Over the past 7 years, I have been a member of the #vim channel on
> Freenode. Almost every week we get somebody in the channel who wonders
> such things as how to map Ctrl-Shift-T differently from Ctrl-T. We
> explain that isn't possible. Even in Gvim. Because of vim's input queue
> system. People often don't realise that Tab is Ctrl-I, or Enter is
> Ctrl-M. We have to explain why it's not possible to map one of these
> pairs without breaking the other. It's become apparent to me that the
> byte-based model is no longer appropriate if Vim is to remain relevant
> and current on newer platforms. It's time we changed the core.

That's not completely correct.  Vim can have a key modifier in the
queue, it can have CTRL and SHIFT before a T.  It's a design choice to
have CTRL-SHIFT-T and CTRL-T result in the same code.  See the global
variable "mod_mask".

It's possible to make a difference between the two when there is a
mapping for CTRL-SHIFT-T.  I actually thought that was working, but it
doesn't.  Perhaps this only works in combination with Alt, don't have
time right now to check the details.

> I would like to propose that the base of the input queue be turned into
> a queue of structures something like the following form:
> 
>  struct keypress {
>    enum {
>      UNICODE,
>      SPECIAL,
>    } type;
>    int keycode;
>    int modifiers;
>  };
> 
> In this scheme we can represent any of the keypresses vim can handle:
> 
>  A        = { .type = UNICODE, keycode = 'A',   .modifiers = 0 }
>  <Ctrl-T> = { .type = UNICODE, keycode = 'T',   .modifiers = CTRL }
>  <Enter>  = { .type = SPECIAL, keycode = ENTER, .modifiers = 0 }
> 
> In this scheme, it is simple to write the code that :map etc.. will use
> to recognise the keys and turn them into basic operations. It's also
> simple to generate these events from GUI events (such as from GTK or
> Win32).
> 
> This scheme is also relatively simple to generate from terminal input
> bytes, since vim already has this functionality.
> 
> Once using this scheme, gvim would now fully support mapping Tab, Ctrl-I
> and Ctrl-Shift-I as three separate independent keys. Newer terminals
> like xterm already posess ways to encode these three keystrokes
> differently at the byte level, and with e.g. libtermkey[*]'s help, vim
> could be taught how to recognise all these three too.

I think this is possible without changing the input queue.

> In recognition of the non-trivial amount of work required here, and as a
> token of my commitment to this issue, I would be happy to donate a
> further EUR100 to the vim development sponsorship on top of the EUR20 I
> have just sent, if we could come to a mutual agreement on how to proceed
> on this front. It would be great if we would be able to make this
> feature a reality; I would be happy to consider a further donation at
> that point.
> 
> I know this isn't the way terminals have worked for the past 20 years.
> However, it is the way "terminals", being the units of end-user
> interaction, will work for the next 20 years. It would be nice if vim
> were able to cope as well with the next 20 as it has with the last.
> 
> -----
> *: I have also been developing a library, libtermkey, which aims to be
>    a better way to read key press events from terminals than existing
>    solutions that are curses or terminfo-based. While it reads the
>    terminfo database, it also fully understands the extended ways that
>    xterm et.al. encode modified keypresses, in a way that would be
>    fully compatible with vim's core, and existing behaviours.
> 
>    http://www.leonerd.org.uk/code/libtermkey/

Now that sounds like a long awaited improvement.  The termcap/terminfo
system is completely inadequate.  Vim must have xterm special key
support built-in, since there is no way to define these keys with the
old libraries.

It would be great if someone can make a patch for Vim that uses this
library and is fully backwards compatible for the special xterm keys
codes.  That would be a good test for the library as well.

-- 
hundred-and-one symptoms of being an internet addict:
23. You can't call your mother...she doesn't have a modem.

 /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui