ncurs 없이 C/C+++에서 vim, htop, ...와 같은 "실제" 대화형 터미널 프로그램 작성
아니, 나는 ncurs를 사용하고 싶지 않아. 왜냐하면 나는 터미널이 어떻게 작동하는지 배우고 혼자서 프로그래밍을 재미있게 하고 싶거든.:)리눅스xterm 기반작동해야 한다 에뮬레이터에서만 단말필요가 없고, 휴대할.
내가 하고 싶은 것은 htop과 vim과 같은 대화형 터미널 애플리케이션을 프로그래밍하는 것이다.내가 의미하는 것은 상자처럼 보이거나 색을 설정하는 문자의 출력이 아니라, 이것은 사소한 것이다; 또한 콘텐츠를 창 크기에 맞게 만드는 것이다.내가 필요한 것은
문자를 클릭하거나 마우스 휠을 스크롤(마우스가 특정 문자에 있을 때)하는 등의 마우스 상호 작용을 통해 스크롤 [EDIT: in the terminal emulator in a terminal emulator] 및
상위 프로세스의 출력을 완전히 저장 및 복원하고 출력에서 내 인쇄를 분리하는 방법. 따라서 내 응용 프로그램을 떠난 후에는 htop을 실행하고 다시 종료할 때처럼 셸에 입력한 명령 외에는 아무것도 표시되지 않아야 한다. 이 응용 프로그램에서 더 이상 아무것도 보이지 않는다.
나는 정말 ncurs를 사용하고 싶지 않다.하지만 물론, 만약 당신이 ncurs의 어느 부분이 이러한 업무를 담당하는지 안다면, 소스 코드에서 내가 그것을 찾을 수 있는 곳을 말해도 좋으니, 나는 그것을 연구할 것이다.
단자를 조작하려면 제어 시퀀스를 사용해야 한다.불행하게도, 그 코드들은 당신이 사용하고 있는 특정 단말기에 따라 달라진다.그래서인지terminfo
)(기호)termcap
은 은 애당초 존재한다.
당신은 터미네이터를 사용하고 싶은지 아닌지 말하지 않는다.자:
- terminalfo를 사용할 경우 터미널에서 지원하는 각 동작에 대해 올바른 제어 시퀀스를 제공한다.
- terminfo를 사용하지 않는다면...지원하려는 모든 터미널 유형의 모든 작업을 수동으로 코드화해야 한다.
당신이 이것을 학습 목적으로 원하듯이, 나는 두 번째에 자세히 설명하겠다.
사용 중인 터미널 유형은 환경변수에서 찾을 수$TERM
Linux에서 가장 일반적인 것은xterm
및 and미널널 에에이(XTerm, gnome-terminal, console)용 및linux
가상 터미널(X가 실행 중이 아닌 경우)
명령어를 사용하여 제어 시퀀스를 쉽게 검색할 수 있음tput
. 그러나 으로서.tput
콘솔에 인쇄하면 즉시 적용되므로 실제로 보려면 다음을 사용하십시오.
$ TERM=xterm tput clear | hd
00000000 1b 5b 48 1b 5b 32 4a |.[H.[2J|
$ TERM=linux tput clear | hd
00000000 1b 5b 48 1b 5b 4a |.[H.[J|
즉, 화면을 지우는 것은xterm
당신은 출력해야 한다.ESC [ H ESC [ 2J
단기간에ESC [ H ESC [ J
리눅스 터미널에서
질문하는 특정 명령에 대해서는 주의 깊게 읽어보십시오.man 5 terminfo
그곳에는 많은 정보가 있다.
이 질문이 좀 오래된 질문이지만, ncurs를 사용하지 않고 이것을 어떻게 하는지에 대한 짧은 예를 공유해야 한다고 생각했지만, 어렵지 않지만 휴대성이 그렇게 좋지는 않을 것이다.
이 코드는 stdin을 원시 모드로 설정하고 대체 버퍼 화면으로 전환(단말기 실행 전 상태를 저장)하여 마우스 추적을 가능하게 하고 사용자가 어딘가를 클릭할 때 버튼과 좌표를 인쇄한다.+C로 종료한 후 프로그램은 터미널 구성을 되돌린다.
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
int main (void)
{
unsigned char buff [6];
unsigned int x, y, btn;
struct termios original, raw;
// Save original serial communication configuration for stdin
tcgetattr (STDIN_FILENO, &original);
// Put stdin in raw mode so keys get through directly without
// requiring pressing enter.
cfmakeraw (&raw);
tcsetattr (STDIN_FILENO, TCSANOW, &raw);
// Switch to the alternate buffer screen
write (STDOUT_FILENO, "\e[?47h", 6);
// Enable mouse tracking
write (STDOUT_FILENO, "\e[?9h", 5);
while (1) {
read (STDIN_FILENO, &buff, 1);
if (buff[0] == 3) {
// User pressd Ctr+C
break;
} else if (buff[0] == '\x1B') {
// We assume all escape sequences received
// are mouse coordinates
read (STDIN_FILENO, &buff, 5);
btn = buff[2] - 32;
x = buff[3] - 32;
y = buff[4] - 32;
printf ("button:%u\n\rx:%u\n\ry:%u\n\n\r", btn, x, y);
}
}
// Revert the terminal back to its original state
write (STDOUT_FILENO, "\e[?9l", 5);
write (STDOUT_FILENO, "\e[?47l", 6);
tcsetattr (STDIN_FILENO, TCSANOW, &original);
return 0;
}
참고: 255개 이상의 열이 있는 터미널에서는 이 기능이 제대로 작동하지 않음.
내가 찾은 탈출 순서에 대한 가장 좋은 언급은 이것과 이것이다.
좀 헷갈려.당신은 vim과 같은 "단말 애플리케이션"에 대해 말하지만, 단자 애플리케이션은 마우스 이벤트를 얻지 못하고, 마우스에는 응답하지 않는다.
실제 터미널 애플리케이션을 말하는 경우,xterm
중요한 것은 이식성 문제들 중 많은 것들이 OS가 아닌 단말기와 관련이 있다는 것이다.단말기는 다른 탈출 시퀀스를 전송하여 제어된다.어떤 것이 터미널에 의존하는지; 그러나 ANSI 탈출 코드는 현재 상당히 널리 퍼져있다. http://en.wikipedia.org/wiki/ANSI_escape_code을 참조하라.이것들은 일반적으로 에 의해 이해된다.xterm
예를 들면.
"전체 화면" 모드로 들어가고 나가려면 시작과 끝에서 추가 시퀀스를 출력해야 할 수 있다. 이는 다음 경우에 필요하다.xterm
.
마지막으로 출력 드라이버가 문자를 추가하지 않고(예: 단순 LF를 CRLF로 변환) 입력이 반향되지 않고 투명하며 즉시 반환되도록 입출력 수준에서 특별한 작업을 수행해야 한다.에서는 Linux를 하여 이 ioctl
. (아그나인, 마칠 때 잊지 말고 복구하십시오.)
'Programing' 카테고리의 다른 글
구성 요소를 동적으로 생성하고 vuej에서 프로그래밍 방식으로 값을 반환하는 방법 (0) | 2022.04.27 |
---|---|
Vue-Test-Utils 알 수 없는 사용자 지정 요소: (0) | 2022.04.27 |
더 나은 접근 방식 처리: 'vuex 저장소 상태를 돌연변이 처리기 외부에서 변경하지 않음' 오류 (0) | 2022.04.27 |
BigInteger 사용법? (0) | 2022.04.26 |
Vue.set - TypeScript로 추론된 잘못된 유형 (0) | 2022.04.26 |