Analisar terminolo u6 string

5

Analisando terminfo e Sequências parametrizadas .

Alguns exemplos de infocmp -1 xterm :

  • cud=\E[%p1%dB , dado o argumento 13 :

    • \E = > <ESC>
    • [ = > %código%
    • [ PUSH parâmetro 1 (13) na pilha
    • %p1 POP e imprimir da pilha como decimal assinado = > %código%
      • Resultado: %d
  • 13 , dados argumentos <ESC>[13B :

    • csr=\E[%i%p1%d;%p2%dr = > 13, 16
    • \E = > %código%
    • <ESC> Incrementar parâmetro 1 e 2: ++ 13, ++ 16 fornece 14, 17
    • [ PUSH parâmetro 1 (14) na pilha.
    • [ POP e imprime a partir da pilha como decimal com sinal. = > %código%
    • %i = > %código%
    • %p1 PUSH parâmetro 2 (17) na pilha.
    • %d POP e imprime a partir da pilha como decimal com sinal. = > %código%
    • 14 = > %código%
      • Resultado: ;

Mas, ... como ler este aqui?

  • ;

Depois de processar %p2 , temos %d e incrementamos o parâmetro 1 e 2 (se houver). Mas a pilha está vazia. Não devem os dois 17 estourar e imprimir dois números da pilha?

    
por user3342816 28.10.2015 / 18:22

2 respostas

4

A ausência de um marcador %p é uma peculiaridade do ncurses: o compilador terminfo ( tic ) reconhece terminfo (que usa %p1 para marca parâmetros) ou termcap (que depende de convenção para os parâmetros). Isso seria uma expressão legal termcap . Como o tic sabe como processar uma expressão termcap, a string mostrada é "próxima o suficiente" e não houve necessidade de traduzi-la ainda mais.

Você pode ver o que o ncurses faz usando tput por exemplo,

tput u6 40 50

dá (note a reversão dos parâmetros)

^[[51;41R

Se a expressão foi dada como

u6=\E[%i%p2%d;%p1%dR

teria o mesmo resultado.

As capacidades do u6-u9 são uma extensão anterior documentada em ncurses banco de dados de terminal :

# INTERPRETATION OF USER CAPABILITIES
#
# The System V Release 4 and XPG4 terminfo format defines ten string
# capabilities for use by applications, <u0>...<u9>.   In this file, we use
# certain of these capabilities to describe functions which are not covered
# by terminfo.  The mapping is as follows:
#
#       u9      terminal enquire string (equiv. to ANSI/ECMA-48 DA)
#       u8      terminal answerback description
#       u7      cursor position request (equiv. to VT100/ANSI/ECMA-48 DSR 6)
#       u6      cursor position report (equiv. to ANSI/ECMA-48 CPR)
#
# The terminal enquire string <u9> should elicit an answerback response
# from the terminal.  Common values for <u9> will be ^E (on older ASCII
# terminals) or \E[c (on newer VT100/ANSI/ECMA-48-compatible terminals).
#
# The cursor position request (<u7>) string should elicit a cursor position
# report.  A typical value (for VT100 terminals) is \E[6n.
#
# The terminal answerback description (u8) must consist of an expected
# answerback string.  The string may contain the following scanf(3)-like
# escapes:
#
#       %c      Accept any character
#       %[...]  Accept any number of characters in the given set
#
# The cursor position report (<u6>) string must contain two scanf(3)-style
# %d format elements.  The first of these must correspond to the Y coordinate
# and the second to the %d.  If the string contains the sequence %i, it is
# taken as an instruction to decrement each value after reading it (this is
# the inverse sense from the cup string).  The typical CPR value is
# \E[%i%d;%dR (on VT100/ANSI/ECMA-48-compatible terminals).
#
# These capabilities are used by tack(1m), the terminfo action checker
# (distributed with ncurses 5.0).

Verificando o último comentário, tutoria exerce u8 e u9 , mas não faz nada com u6 e u7 .

A extensão foi adicionada no início de 1995 :

# 9.3.4 (Wed Feb 22 19:27:34 EST 1995):
#       * Added correct acsc/smacs/rmacs strings for vt100 and xterm.
#       * Added u6/u7/u8/u9 capabilities.
#       * Added PCVT entry.

e enquanto está incluído em várias entradas para completude (não muitos: há 16 ocorrências em 18.699 linhas de terminfo.src ), não há usuários conhecidos do recurso. De fato, há um lugar em ncurses onde poderia ter sido escrito para usá-lo (alguns códigos de depuração ifdef'd no tty_update.c arquivo), mas que usa sequências de escape codificadas (marcadas como" compatível com ANSI ").

O motivo da ausência de usuários seria:

  • inverter uma expressão arbitrária do terminfo é mais difícil do que parece
  • xterm e terminais similares interpretam essas seqüências de escape

Em ECMA-48 , estes são (u7) DSR (relatório de status do dispositivo) e (u6) CPR (relatório de posição ativa).

    
por 29.10.2015 / 00:23
1

Ahha.

É uma entrada especial no banco de dados. Ele fornece o formato de resposta para u7 .

A resposta é <ESC>[Y;XR como em Y = linha e X = coluna.

Se u6 tiver %i , deve-se decrementar os valores respondidos.

Exemplo:

  • u6=\E[%i%d;%dR
  • u7=\E[6n

Envie u7 .

  • Resposta por exemplo: \E[48;13R .
  • Resultado:
    • Y = 48 - 1 = 47
    • X = 13 - 1 = 12 .
por 28.10.2015 / 18:56