Последовательности управления Cygwin BASH и ANSI

Здесь несколько вещей:

  1. Может ли кто-нибудь указать мне код C для декодирования управляющих последовательностей консоли ANSI?
  2. Есть ли способ заставить Cygwin BASH эмулировать тупой старый TTY?

Может быть, это должно быть 2 вопроса.

Спасибо.


person J Evans    schedule 29.05.2009    source источник
comment
Вы имеете в виду act для управляющих последовательностей ANSI? Нравится перемещать курсор?   -  person 0x6adb015    schedule 29.05.2009
comment
Что вы подразумеваете под Get Cygwin BASH для эмуляции старого глупого TTY? Bash — это оболочка; это не эмулятор терминала.   -  person Jonathan Leffler    schedule 29.05.2009


Ответы (2)


Это несколько косвенный ответ, но библиотека GNU ncurses обрабатывает терминалы всех видов. Один из способов выяснить, какие управляющие последовательности применимы к терминалам ANSI, — это декомпилировать описание терминала ANSI:

infocmp ansi

Это даст вам набор атрибутов terminfo, которые используются программами curses для достижения эффектов на терминале ANSI. Конечно, тогда вы должны знать, что означают эти иероглифы.

На Cygwin я получил:

$ infocmp ansi
#       Reconstructed via infocmp from file: /usr/share/terminfo/61/ansi
ansi|ansi/pc-term compatible with color,
    am, mc5i, mir, msgr,
    colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64,
    acsc=+\020\,\021\030.^Y0\333`\004a\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
    bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
    cr=^M, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
    cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
    cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
    dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
    el1=\E[1K, home=\E[H, hpa=\E[%i%p1%dG, ht=\E[I, hts=\EH,
    ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=^J,
    indn=\E[%p1%dS, invis=\E[8m, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
    kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, kich1=\E[L,
    mc4=\E[4i, mc5=\E[5i, nel=\r\E[S, op=\E[39;49m,
    rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, rin=\E[%p1%dT,
    rmacs=\E[10m, rmpch=\E[10m, rmso=\E[m, rmul=\E[m,
    s0ds=\E(B, s1ds=\E)B, s2ds=\E*B, s3ds=\E+B,
    setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
    sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
    sgr0=\E[0;10m, smacs=\E[11m, smpch=\E[11m, smso=\E[7m,
    smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
    u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,

$

Обозначение «\E» относится к символу ESC.

В противном случае вы можете посмотреть сам стандарт.

person Jonathan Leffler    schedule 29.05.2009
comment
Спасибо. Да, я получил код эмулятора ANSI. Дело в том, что когда Cygwin BASH работает, он отправляет странные управляющие последовательности, особенно \E]0 ... что определенно не соответствует стандарту! Остальное - вся информация по управлению цветом. - person J Evans; 30.05.2009

Настройка переменной среды TERM может привести к тому, что приложения, основанные на terminfo/termcap, избегают использования расширенных escape-последовательностей. (export TERM=тупой) Однако я не уверен, что вы этого хотите.

person EFraim    schedule 29.05.2009