이전 AT&T 유닉스의 stty: "줄 끝"에 종료 키를 추가하는 방법은 무엇입니까?

이전 AT&T 유닉스의 stty: "줄 끝"에 종료 키를 추가하는 방법은 무엇입니까?

Emacs 모드에서 ctrl+ 키보드 조합을 사용하여 줄 끝으로 이동하는 e동시에 End키를 사용하여 동일한 작업을 수행할 수 있는 방법은 무엇입니까? stty로 어떻게 설정하나요? Linux 터미널에서 복사한 조합을 시도했습니다.

stty eol M-^?

하지만 누르면 키보드 End로 들어갑니다 .F

시스템은 minicom 터미널의 기존 ATT System V입니다. 내 용어는 386AT입니다. 이것이 terminfo 정의입니다.

#       Reconstructed via infocmp from file: /usr/share/lib/terminfo/3/386AT
AT386|at386|386AT|386at|at/386 console @(#)386.ti 1.4,
        am, bw, eo, xon,
        colors#8, cols#80, lines#25, ncv#3, pairs#64,
        acsc=``aaffggjYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H,
        cr=\r, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB,
        cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%02d;%p2%02dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[1M,
        ed=\E[J, el=\E[K, flash=^G, home=\E[H, ht=\t,                                                                   
        ich=\E[%p1%d@, ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L,                                                             
        ind=\E[S, indn=\E[%p1%dS, invis=\E[9m, is2=\E[0;10m,                                                            
        kbs=\b, kcbt=^], kclr=\E[2J, kcub1=\E[D, kcud1=\E[B,                                                            
        kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kend=\E[Y,                                                                  
        kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf2=\EOQ,                                                            
        kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV,                                                               
        kf8=\EOW, kf9=\EOX, khome=\E[H, kich1=\E[@, knp=\E[U,                                                           
        kpp=\E[V, krmir=\E0, op=\E[0m,                                                                                  
        pfx=\EQ%p1%{1}%-%d'%p2%s', rev=\E[7m, rin=\E[S,                                                                 
        rmacs=\E[10m, rmso=\E[m, rmul=\E[m, setab=\E[4%p1%dm,                                                           
        setaf=\E[3%p1%dm,                                                                                               
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,                                    
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,                                    
        sgr=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%?%p9%t;12%;%?%p7%t;9%;m,                        
        sgr0=\E[0;10m, smacs=\E[12m, smso=\E[7m, smul=\E[4m,   

답변1

eol설정은 일부 라인 편집 버퍼의 끝으로 이동하는 키가 아니라 tty 라인 규칙에 대한 설정입니다.

자체 라인 편집기(예: cat. sed이 편집기에는 커서 위치 지정 기능이 없습니다.편집하다stty erase백스페이스( ), Ctrl+W( stty werase), Ctrl+U( ) 를 사용하여 수행할 수 stty kill있으며 일부 시스템에서는 더 많은 키를 사용할 수도 있습니다.

이는 커널의 tty 장치 드라이버 자체에서 수행되며 이러한 문자는 응용 프로그램( cat, ...) sed에 표시되지 않습니다 .

eol설정은 단순히 드라이버가 ^J개행 문자(또는 개행 문자라고도 함) 내의 다른(추가) 문자를 줄 끝 문자로 인식하도록 지시합니다. 문자가 입력되면 Line Rules는 지금까지 입력된 문자를 읽기 응용 프로그램으로 보냅니다.

예를 들어, 한 번에 한 줄씩 입력하는 대신 한 번에 한 단어씩 텍스트를 입력하려면 다음을 수행할 수 있습니다.

stty eol ' '; cat

스페이스바를 누를 때마다 cat입력한 텍스트(스페이스 문자 포함)가 출력되는 것을 볼 수 있습니다.

자체 줄 편집기를 구현하는 명령 프롬프트에 있는 경우 End커서를 현재 버퍼의 끝으로 이동하는 것은 stty해당 명령의 특정 구성(있는 경우)에 의해서가 아니라 수행됩니다.

예를 들어, zsh셸의 경우 다음을 사용하여 수행할 수 있습니다.

bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line

"F"가 제안하는 대로 키를 누르면 터미널이 <ESC>[F문자 시퀀스를 전송한다고 가정합니다.<ESC>OFEnd

End일부 애플리케이션은 라인 끝 작업에 자동으로 바인딩됩니다 . 이를 위해 로컬 termcap 또는 terminfo 터미널 데이터베이스를 쿼리하여 키를 눌렀을 때 터미널에서 전송된 문자 시퀀스를 찾습니다.

이를 위해 그들은 $TERM변수를 사용합니다. 해당 데이터베이스의 해당 키 항목이 터미널에서 보낸 내용과 일치하지 않으면 이 작업이 작동하지 않습니다.

당신은 시도 할 수 있습니다:

tput kend | sed -n l

키가 전송된 데이터베이스의 내용을 보려면 End(tput이 terminfo를 사용하는 경우) 또는 /etc/termcap에서 $TERM 항목을 확인하십시오(termcap을 사용하는 경우). 미니콤(또는 이를 호스팅하는 터미널 에뮬레이터)의 동작과 더 잘 일치하는 항목을 찾을 수 있습니다.

새로운 정보를 바탕으로 편집

따라서 아마도 minicom최신 터미널과 같은 장치에서 실행 되고 xterm직렬을 통해 통신하고 있을 것입니다. 직렬 회선의 다른 쪽 끝에서 gettyat386 콘솔(실제로는 구형 PC 기반 AT&T 시스템용 내부 콘솔 드라이버라고 생각함)을 실행하고 있다고 가정해 보겠습니다. 이것은 현대의 xterm과는 거리가 멀다.

여러 면에서 기존 AT&T 시스템만큼 현대적인 Solaris 시스템을 살펴보면 xtermterminfo에 항목이 있지만 해당 kend기능이 부족합니다.

당신이 할 수 있는 일은 터미널의 terminfo 정의를 minicom( infocmp > file)을 실행하는 머신에 업로드하고, 이를 SysV 머신으로 전송한 후 거기에서 컴파일하는 것입니다 (그리고 거기와 동일한 값으로 tic설정하고 , 미리 환경 변수를 다음과 같이 설정 합니다. 당신은 그곳의 관리자가 아닙니다). Curss 버전이 너무 오래되어 작동하지 않으면 AT&T 시스템용 vt100 항목을 대신 사용할 수 있습니다. 터미널에서 편집하고 이름을 변경한 후 다시 사용하면 됩니다.$TERMTERMINFO~/.terminfokend=\EOFtic

좋다:

cat > my-term.info << \EOF
my-term|My VT100 compatible terminal with an end-key,
    am, mir, msgr, xenl, xon,
    cols#80, it#8, lines#24, vt#3,
    acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
    clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
    cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n,
    cuf=\E[%p1%dC, cuf1=\E[C$<2>,
    cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
    cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>,
    el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=\t,
    hts=\EH, ind=\n, ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=\b,
    kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB,
    kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP,
    kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
    kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, rc=\E8,
    rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmkx=\E[?1l\E>,
    rmso=\E[m$<2>, rmul=\E[m$<2>,
    rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
    sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;,
    sgr0=\E[m^O$<2>, smacs=^N, smkx=\E[?1h\E=,
    smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, kend=\EOF
EOF
TERMINFO="$HOME/.terminfo" export TERMINFO
mkdir -p "$TERMINFO"
tic my-term.info

그리고 다음을 추가하세요:

if [ "`tty`" = "the-serial-device" ] && [ "$TERM" = at386 ]; then
  TERMINFO=$HOME/.terminfo
  TERM=my-term
  export TERM TERMINFO
fi

~/.profile( 직렬을 통해 로그인할 때 the-serial-device출력은 어디에 있습니까 ? )tty

관련 정보