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

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

ctrlEmacs 모드에서 + 키보드 조합을 사용하여 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줄 끝 문자로 인식하도록 지시하는 것뿐입니다. 해당 문자를 입력하면 줄 규칙은 지금까지 입력된 문자를 읽기 응용 프로그램으로 보냅니다.

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

stty eol ' '; cat

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

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

예를 들어, zsh셸을 사용하면 다음과 같이 수행됩니다.

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

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

End일부 애플리케이션은 자동으로 _end-of_line_ 작업에 바인딩됩니다 . 이를 위해 로컬 termcap 또는 terminfo 터미널 데이터베이스를 쿼리하여 해당 키를 누를 때 터미널이 전송하는 문자 시퀀스를 알아냅니다.

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

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

tput kend | sed -n l

tput이 terminfo를 사용하는 경우 키가 보내는 데이터베이스 정보를 확인 End하거나 termcap을 사용하는 경우 /etc/termcap에서 $TERM 항목을 확인하세요. 미니콤(또는 이를 호스팅하는 터미널 에뮬레이터) 동작과 더 밀접하게 일치하는 항목을 찾을 수 있습니다.

새로운 정보를 바탕으로 수정

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

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

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

좋다:

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

관련 정보