terminfo u6 문자열 구문 분석

terminfo u6 문자열 구문 분석

보고 있다용어 정보그리고매개변수화된 문자열.

몇 가지 예는 다음과 같습니다 infocmp -1 xterm.

  • cud=\E[%p1%dB, 주어진 매개변수 13:

    • \E=><ESC>
    • [=>[
    • %p1푸시 매개변수 1(13)스택에
    • %dPOP 및 스택에서 부호 있는 십진수로 인쇄 =>13
      • 결과:<ESC>[13B
  • csr=\E[%i%p1%d;%p2%dr, 주어진 매개변수 13, 16:

    • \E=><ESC>
    • [=>[
    • %i증분 매개변수 1과 2: ++13, ++16은 14, 17을 제공합니다.
    • %p1푸시 매개변수 1(14)스택에.
    • %d스택에서 POP하고 부호 있는 십진수 형식으로 인쇄합니다. =>14
    • ;=>;
    • %p2푸시 매개변수 2(17)스택에.
    • %d스택에서 POP하고 부호 있는 십진수 형식으로 인쇄합니다. =>17
    • r=>r
      • 결과:<ESC>14;17r

그런데...이걸 어떻게 읽어요?

  • u6=\E[%i%d;%dR

처리 후에 매개변수 1과 2(있는 경우)를 추가합니다 \E[%i. <ESC>[그러나 스택은 비어 있습니다. 이 두 개를 %d스택에서 꺼내서 두 숫자를 모두 인쇄하면 안 되나요 ?

답변1

하나가 없어%p표시는 ncurses의 특이한 점입니다: terminfo 컴파일러() 모든 용어 정보를 식별하기 위해(사용%p1도착하다표시매개변수) 또는 termcap(에 따라 다름)관습매개변수로). 이건 합법이겠지용어 모자표현하다. ~부터termcap 표현식을 처리하는 방법을 알면 표시된 문자열은 추가 번역 없이도 "충분히 가깝습니다".

다음 명령을 사용하여 ncurses가 수행하는 작업을 확인할 수 있습니다.tput,예를 들어,

tput u6 40 50

주어진다(인수의 반전에 주의)

^[[51;41R

표현식이 다음과 같이 주어지면

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

동일한 결과가 생성됩니다.

u6-u9 기능은 초기 단계입니다.확장하다ncurses에 기록됨터미널 데이터베이스:

# 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).

마지막댓글 확인해보세요연습 u8u9하지만 u6및 에서는 아무 작업도 수행하지 않습니다 u7.

확장 프로그램이 추가됨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.

여러 항목에 포함되어 있지만진실성(많지 않음: 18,699줄에 16회 발생 terminfo.src) 이 기능을 사용하는 알려진 사용자는 없습니다. 사실, ncurses에는 다음과 같은 작업을 수행할 수 있는 곳이 있습니다.할 수 있다이를 사용하여 ifdef'd 디버깅 코드를 작성했습니다(tty_update.c파일)이지만 하드코딩된 이스케이프 시퀀스("ANSI 호환"으로 표시됨)를 사용합니다.

사용자 부재 이유는 다음과 같습니다.

  • 임의의 terminfo 표현식을 뒤집는 것은 보기보다 어렵습니다.
  • xterm 및 유사한 터미널은 이러한 이스케이프 시퀀스를 해석합니다.

존재하다ECMA-48, 이것들은 (u7)디지털 SR(장치 상태 보고서) 및 (u6)심폐소생술(활성 위치 보고).

답변2

아하.

이것은특별한 아이템데이터베이스에서. 그것은 준다답장 형식도착하다 u7.

<ESC>[Y;XRY=행, X=열로 응답합니다 .

그렇다면 그래야 한다 u6.%i감소응답의 값입니다.

예:

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

보내다 u7.

  • 응답 예: \E[48;13R.
  • 결과:
    • Y = 48 - 1 = 47
    • X = 13 - 1 = 12.

관련 정보