vim과 유사한 명령줄 GUI

vim과 유사한 명령줄 GUI

최근에 나는 vim의 사용자 인터페이스가 어떻게 작동하는지 궁금했습니다. vim을 시작하면 단지 텍스트를 인쇄하고 무언가를 입력하도록 요구하는 대신 전체 터미널 창을 차지하며, 완료되면 아래에 다른 명령줄을 인쇄한다는 것입니다.

단지 호기심 때문에 이것이 어떻게 작동합니까?

답변1

터미널 창은 단순히 "멍청한 터미널-Wikipedia"는 문자 줄(일반적으로 80개의 ASCII 문자로 구성된 24줄)을 표시하는 것 외에는 아무것도 할 수 없으며 새 문자는 마지막 줄 끝에만 추가됩니다. (타자기를 생각해 보세요.)

터미널은 점차적으로 "더 스마트해졌습니다". 커서를 특정 위치로 이동하고, 줄을 삽입하고, 다음 문자를 컬러로 표시하는 등의 기능이 추가되었습니다.

그러나 모든 제조업체는 이를 자체 방식으로 수행했으며 단일 표준이 없었으므로 모든 프로그램에는 사용되는 특정 하드웨어에 대한 지식이 내장되어 있었습니다. (1980년대 초 무역 박람회에서 데이터베이스 인터페이스 프로그램을 본 기억이 납니다. 발표자는 작동 방법을 알고 있는 12가지 정도의 일반적인 터미널 유형 목록을 제시하고 단돈 X달러만 내면 가르칠 수 있다고 말했습니다. 우리 회사에 있던 다른 유형을 처리하기 위해.)

그동안 BSD는Termcap-위키피디아UNIX 시스템용 라이브러리입니다. 각 터미널 유형에 대한 표준 기능 세트를 정의하는 텍스트 기반 데이터베이스를 지정하고 이 데이터베이스를 사용하여 TERM환경 변수를 기반으로 터미널에 보낼 적절한 문자열 형식을 결정하는 C 라이브러리를 제공했습니다 . 물론 모든 터미널이 모든 기능을 지원하는 것은 아니지만 괜찮았습니다. 프로그램은 사용 가능한 기능만 사용하도록 알 수 있었습니다(예: 터미널에 직접 주소 지정이 없으면 한 줄 위/아래로 이동하고 왼쪽/왼쪽으로 이동할 수 있음). 오른쪽 위치).

termcap.small · freebsd/freebsd · GitHubvt100 터미널에 대한 샘플 termcap 항목을 보여줍니다.

vt100|dec-vt100|vt100-am|vt100am|dec vt100:\
        :do=2\E[B:co#80:li#24:cl=50\E[H\E[J:sf=2*\ED:\
        :le=^H:bs:am:cm=5\E[%i%d;%dH:nd=2\E[C:up=2\E[A:\
        :ce=3\E[K:cd=50\E[J:so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\
        :md=2\E[1m:mr=2\E[7m:mb=2\E[5m:me=2\E[m:\
        :is=\E>\E[?1;3;4;5l\E[?7;8h\E[1;24r\E[24;1H:\
        :if=/usr/share/tabset/vt100:nw=2\EE:ho=\E[H:\
        :as=2\E(0:ae=2\E(B:\
        :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||:\
        :rs=\E>\E[?1;3;4;5l\E[?7;8h:ks=\E[?1h\E=:ke=\E[?1l\E>:\
        :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=\177:\
        :k0=\EOy:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:\
        :k6=\EOu:k7=\EOv:k8=\EOl:k9=\EOw:k;=\EOx:@8=\EOM:\
        :K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:K5=\EOn:pt:sr=2*\EM:xn:\
        :sc=2\E7:rc=2\E8:cs=5\E[%i%d;%dr:UP=2\E[%dA:DO=2\E[%dB:RI=2\E[%dC:\
        :LE=2\E[%dD:ct=2\E[3g:st=2\EH:ta=^I:ms:bl=^G:cr=^M:eo:it#8:\
        :RA=\E[?7l:SA=\E[?7h:po=\E[5i:pf=\E[4i:

나중에,저주-Wikipedia라이브러리는 프로세스를 단순화하기 위해 개발되었으며 지정된 값으로 적절한 코드를 생성하는 기능을 제공합니다. 모든 프로그램은 간단히 다음과 같이 말할 수 있으며 tgoto(capabilities, column, row), 라이브러리는 TERM환경 변수에서 터미널 유형을 찾고, termcap 데이터베이스에서 해당 특정 유형에 대한 기능을 찾고, 커서를 지정된 위치로 이동하기 위한 적절한 터미널 명령이 포함된 문자열을 생성합니다. 위치.

termcap(3) - OpenBSD 매뉴얼 페이지몇 가지 libcurses 함수의 선언을 보여줍니다:

#include <curses.h>
#include <term.h>

extern char PC;
extern char * UP;
extern char * BC;
extern short ospeed;

int tgetent(char *bp, const char *name);
int tgetflag(char *id);
int tgetnum(char *id);
char *tgetstr(char *id, char **area);
char *tgoto(const char *cap, int col, int row);
int tputs(const char *str, int affcnt, int (*putc)(int));

다음과 같은 프로그램vi-위키피디아, 주소 지정이 가능한 화면이 있는 모든 터미널에서 작동하는 편집기를 제공하기 위해 이러한 라이브러리를 사용했습니다. 새로운 유형의 터미널은 termcap 항목만 정의하면 되며 vi해당 라이브러리를 기반으로 하는 다른 프로그램과 자동으로 즉시 작동합니다.

결국 termcap이라는 개선된 버전으로 대체되었으며 terminfocurses버전으로 대체되었지만 ncurses기본 원칙은 동일하게 유지되었습니다.

이 모든 것은 키보드에서 입력된 문자를 읽는 UNIX의 능력에 달려 있습니다.없이터미널에 자동으로 표시됩니다. 당시 많은 운영 체제에서는 이 작업을 수행할 수 없었습니다. 일부는 전체 라인(또는 화면)이 입력될 때까지 터미널로부터 입력을 받아들이지 않습니다.

답변2

Unix 계열 운영 체제에서 전체 화면 TUI(텍스트 사용자 인터페이스)가 있는 프로그램은 이라는 커서 위치 지정 라이브러리를 사용합니다 curses.

이 라이브러리는 처음에 이라는 터미널 기능 데이터베이스를 사용했는데 termcap나중에 이라는 시스템으로 대체되었습니다 terminfo.

GUI 데스크탑에 창으로 표시된 TUI 앱은 다음과 같은 창 크기 조정 신호를 사용합니다.sigwinch

관련 정보