@ulidtko Не байтики экономят, а приложение в терминале не может отличить, нажал ли ты `ESC`-`[`-`A` или `↑`. // неправда, вим как-то отличает. Требуется мнение экспертов
@fix Только что понял, что у двойного Esc (а ещё в make menuconfig, например) и случайных OA в командной строке у mc ноги из этого же места.
Юниксопроблемы.
Итак, ответ на вопрос ОПа:
Приложение в терминале не может отличить, нажал ли ты `ESC`-`O`-`A` или `↑`. Поэтому после нажатия `ESC`-`O` вим секунду ждёт ввода `A` (или `B` или `C` или `D`).
@fix Он через совсем другую (большую (на самом деле можно оспорить, конечно), в духе WinAPI) жопу работает http://msdn.microsoft.com/en-us/library/ms682079%28v=vs.85%29.aspx
Из другого источника (nuff said):
>What causes your problems is that Windows consoles do not work that way – instead of being a stream, the console is a screen buffer. The console subsystem has line editing (and basic history) built in, and cmd.exe simply uses this functionality with ReadConsole() – arrow key events do not reach the program unless it specifically disables "line input" mode. (Windows API has separate functions for output styling as well.)
@fix Другой там нет. Альтернативные "эмуляторы терминала" либо рисуют дефолтное окно скрытым и читают, что там написано, либо просто через пайп читают stdout и распидорашивают выхлоп стандартных программ, либо работают только с удалёнными системами.
@anonymous У этого же есть глубокие исторические корни. (ща спалю)
Юниксы развивались в условиях мейнфрейма + десятков хардварных терминалов, которые слали буковки к мейнфрейму по проводам. И получали буковки тоже потоком из провода. Поэтому протоколы юниксовых терминалов (уже виртуальных, чисто софтварных) исключительно стрим-ориентированы; отсюда же все эти эскейп-последовательности для управления терминалом (штук типа подвигать курсор, поменять цвет текста, очистить экран, этц).
Мсдос же развивался в условиях персональных ПК, которые частенько вообще никакого нетворкинга (кроме sneakernet) не имели. Там у программы не то что никаких [обусловленных реальной надобностью] стримов ввода-вывода нет — у неё вообще ОС нет, только какой-то там биос по `int 21h`, — берёшь и пишешь в буфер VGA что душе угодно. Вот так оно до сих пор и тянется из-за покпок совместимости; WinAPI для консольных приложений эмулирует тот самый VGA-шный буфер.
@ulidtko Хуита, в MS-DOS была I/O-система, целиком слизанная с Unix (хотя и только с версии 2 с чем-то, и работала, естественно, через int 21h, больше-то не через что), вот, например, обычный write http://www.codenet.ru/progr/dos/dos_0067.php , сунешь в BX 1, будешь писать на экран, всё как у людей. А с какой-то версии ANSI.SYS даже из коробки появился.
А консольное API из Windows NT не имеет никакой обратной совместимости с DOS и сделано с нуля в духу WinAPI. "WinAPI для консольных приложений эмулирует тот самый VGA-шный буфер" разве что про 9x можно сказать.
Хотя с другой стороны там есть жопы, вроде кодовых страниц, у которых ноги из доса.
В общем, на самом деле я не хочу знать это, потому что не хочу быть знатоком вкуса протухшего говна.