보고 있다용어 정보그리고매개변수화된 문자열.
몇 가지 예는 다음과 같습니다 infocmp -1 xterm
.
cud=\E[%p1%dB
, 주어진 매개변수13
:\E
=><ESC>
[
=>[
%p1
푸시 매개변수 1(13)스택에%d
POP 및 스택에서 부호 있는 십진수로 인쇄 =>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).
마지막댓글 확인해보세요못연습 u8
및 u9
하지만 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;XR
Y=행, X=열로 응답합니다 .
그렇다면 그래야 한다 u6
.%i
감소응답의 값입니다.
예:
u6=\E[%i%d;%dR
u7=\E[6n
보내다 u7
.
- 응답 예:
\E[48;13R
. - 결과:
Y = 48 - 1 = 47
X = 13 - 1 = 12
.