[erlang-questions] Reading (and ignoring) escape-sequences

Mazen Harake mazen.harake@REDACTED
Wed Mar 24 12:11:07 CET 2010


I think you misunderstood a little of what my problem was; let me try to 
describe the problem in another way.

Take the following assumptions:

1) You have a menu in the terminal, this menu "pops up" prompting for an 
optional selection
2) You can perform one of the following two actions:
     a) Exit: Press Esc (\027) to exit the menu and don't make a selection
     b) Move: Press UpArrow (\027[A) or DownArrow (\027B) to move 
between selections
3) The program reads character by character

In order to distinguish between action a and b you have to be able to 
(very quickly) peek at the next character in buffer to know if there is 
a "[" after the "\e". If there isn't then you _assume_ that the user 
pressed Esc only. This is because it is assumed that a user can not 
press another key fast enough. Had it been a special key then you would 
have found a "[" character waiting there after the "\e" because all the 
related keys would have been copied to the buffer before the first 
getch() even returns.

To relate this to what you wrote; Erlang does have timeouts but this is 
not relevant because what is really needed is the ability to peek into 
the second character without blocking for input. An even better solution 
would be if this was done at a lower level so that perhaps (like 
ncurses) in erlang you would get e.g. 40x as the character for UpArrow 
(or whatever, it would probably be defined as macros anyway).

I'm curious; how would you handle the mentioned scenario in your editor?

Anyway it was a surprise to me that these sort of things weren't handled 
in a better way overall and even if Erlang wasn't really made to handle 
these kind of things I would hope that it would have better support in 
the future because it is absolutely gold to be able to write tools like 
e.g. table view and the debugger without the need for gs (or wx) without 
the nasty scrolling all the time (e.g. like top).

/Mazen



Let's assume that we tried doing this in Erlang, then there would be 
Well it is interesting when you say: If the sequence is "\027[A"

On 24/03/2010 00:29, Richard O'Keefe wrote:
>
> On Mar 23, 2010, at 10:13 PM, Mazen Harake wrote:
>
>> Yeah I've already started digging into that.
>>
>> The problem is more fundamental then I thought and in the end it 
>> turns out that all libraries (including ncurses) depend on the the 
>> fact that a human can not type in the escape sequence as fast as it 
>> is received by a computer. This makes it _extreamly_ hard (I would 
>> say impossible) to do this from pure Erlang; it has to be done from 
>> inside the driver.
>
> There seems to be no fundamental reason why the Erlang _language_
> would be unsuitable for the task, it does have time-outs, after all.
>
> My own emacs-like screen editor handles this by not _caring_
> whether the ESC was generated by some other key or by the user
> pressing the ESC key.  If the sequence "\027[A" comes in, I just
> don't care whether the user pressed one key (Up arrow) or three
> (ESC, [, A).  (In emacs terms, Meta-[ has its own keymap.)
>
> For me, processing fancy-key sequences got a _lot_ easier when I
> decided to support the ECMA sequences only.  These days, when
> practically all terminals are actually terminal emulators, and
> they emulate the ECMA/ANSI interface more or less well, it's not
> too hard.  In the old days, we _desperately_ needed termcap/
> termlib, because you might have a computer with twenty terminals,
> no two of them using the same codes.
>
> Perhaps the place to start, then, is just how many kinds of terminal
> you want to support.  On my system,
>     toe | wc
> lists 1562 different terminal descriptions.  (There aren't that
> many ways to encode the fancy keys, but there _are_ lots.)  If you
> want to support any fraction of those terminals, you have no
> realistic option but to use termcap/termlib.  You could process
> that using Erlang, but why bother?  You might as well use the method
> ncurses uses, by using ncurses in an outboard program.
>
> If you only want to support ECMA/ANSI escape sequences, the best way
> is to redesign your protocol so that you don't care any more than I
> do whether a sequence was typed by hand or the result of a single
> keypress.  ECMA/ANSI escapes generally have the form
>     ESC [ {parameter;...;parameter} letter
> so simply ensuring that nobody ever has any other reason to send
> ESC [ should get you a long way.
>

---------------------------------------------------

---------------------------------------------------

WE'VE CHANGED NAMES!

Since January 1st 2010 Erlang Training and Consulting Ltd. has become ERLANG SOLUTIONS LTD.

www.erlang-solutions.com



More information about the erlang-questions mailing list