xterm은 emacs의 "home" 키 동작을 변경하는 것 같습니다.

xterm은 emacs의 "home" 키 동작을 변경하는 것 같습니다.

xterm에서는 키보드의 HOME 키를 누르면 정상적으로 전송되지만 ^[[H열면 다음 과 emacs -nw같이 변경됩니다 . 나는 내 자신의 터미널을 만들려고 할 때 그것이 emacs에서 작동하지 않는다는 것을 발견했습니다. 그러나 xterm(또는 emacs)이 동작을 변경하는 원인이 무엇인지 알 수 없습니다.^[OHhomekhome^[[H

또한

  • home"해야 하는" 키는 and khome(보통 사용하는 홈 키, Num Lock이 꺼진 키보드의 1)에 해당합니다. xev에서 서로 다르다고 표시하더라도 시도한 모든 터미널에서 항상 동일한 작업을 수행합니다. 따라서 이 질문의 나머지 부분에서는 이들을 동일한 것으로 취급하겠습니다.
  • pty 설정과 관련이없는 것 같습니다. Emacs를 연 상태에서 설정을 복사 stty -g한 다음 cat -v실행하여 적용했지만 여전히 Emacs가 아닌 동작이 발생합니다. (아래 데모)
  • bash의 readline은 emacs 및/또는 TERM 변수를 읽는 것보다 더 수용 가능한 것 같습니다. 왜냐하면 어떤 터미널을 시도하든 HOME은 항상 bash에서 작동하기 때문입니다.

내 실험은 다음과 같습니다.

xterm

터미널 정보 얻기:

$ tty
/dev/pts/1
$ echo $TERM
xterm
$ infocmp $TERM | grep home
    el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
    kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,

HOME 키를 누른 다음 Return 키를 누른 cat -v다음 종료해 보세요.

$ cat -v
^[[H
^[[H
^C

이맥스 열기

$ emacs -nw

홈 키 동작을 시도해 보세요(작동합니다. 동영상은 게시하지 않겠습니다)

C-q키가 보내는 내용을 확인하려면 다음을 사용하세요 .

[^OH xterm의 emacs에서

한편 다른 터미널(xterm일 필요는 없음)에서 emacs pty 설정을 복사합니다.

$ emacs_settings=$(stty -F /dev/pts/1 -g)
$ echo $emacs_settings
4001:1:bf:a31:7:7:7f:15:4:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:

그런 다음 emacs를 종료하고 cat -v다시 시작하십시오.

$ cat -v

그런 다음 두 번째 터미널로 돌아갑니다. xterm pty를 emacs에서 사용하는 설정으로 다시 설정합니다.

$ stty -F /dev/pts/1 $emacs_settings

그런 다음 xterm에서 다시 home을 누르십시오. (그런 다음 return을 누르고 종료하십시오)

$ cat -v
^[[H^M

이는 emacs 외부의 코드와 동일합니다. 누군가가 emacs에 삽입한 코드 home가 아니라 코드 입니다.khome

이제 집에서 이것을 시도하고 종료하려면 cat -vemacs 설정이 일부 키를 변경하기 때문에 ctrl+C 대신 ctrl+G를 사용해야 합니다. 이는 설정이 작동함을 증명합니다. 종료 줄 끝에 ^G가 없지만 캐리지 리턴이 있는 것을 볼 수도 있습니다. 에코 설정이 변경되었고 원시 모드에 있기 때문인 것 같습니다.

궁금하다면 사람이 읽을 수 있는 emacs pty 설정을 참조하세요.

$ stty -F /dev/pts/1 -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^G; quit = ^G; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = <undef>;
rprnt = <undef>; werase = <undef>; lnext = <undef>; discard = <undef>; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

기타 터미널

linux
$ infocmp linux | grep home
    home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
    kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~,

이건 스크린샷 찍기가 쉽지 않네요(사진을 찍을 수는 있지만 찍지 못함)

요약하면 HOME 키는 emacs에 있든 없든 터미널 설정에서 전송되며 khome항상 emacs에서 작동합니다.

MATE 터미널( xterm-256color)
$ echo $TERM
xterm-256color
$ infocmp $TERM | grep home
    el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
    kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,
$ cat -v
^[[H
^[[H
^C

하지만 다시 emacs 내부로 전송됩니다 ^[OH! 그래서 그들은 다시 다릅니다. 예전에는 이걸 어떻게 놓쳤는지 모르겠어요. MATE 터미널은 xcode의 기능을 완전히 구현하거나 동일한 구성 요소 중 일부를 사용하는 것 같습니다.

반면에:

추월( xterm-256color​​)

이 경우에는 khome계속 전송만 하고 HOME 키는 여전히 예상한 대로 작동하는 것 같습니다.

$ echo $TERM
xterm-256color
$ cat -v
^[OH
^[OH
^C
$ emacs -nw
$ # ... ^[OH again 
tmux(MATE 터미널에서)screen

TERMtmux가 언제 로 설정 되었는지 screen, 언제 로 설정되었는지는 모르겠지만 tmux오늘 이 컴퓨터, 이 호스트 터미널에서는 screen.

$ echo $TERM
screen
$ infocmp $TERM | grep home
        enacs=\E(B\E)0, flash=\Eg, home=\E[H, hpa=\E[%i%p1%dG,
        khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
$ cat -v
^[[1~
^[[1~
^C
$ emacs -nw
$ # also ^[[1~ with C-q inside emacs

모으다
  • 일부 터미널은 khome항상 전송하는 반면 다른 터미널은 나머지 시간 동안 khomeEmacs 내부로 전송 합니다.home
  • khome둘 다 homebash readline에서 작동하지만 khomeemacs에서만 작동합니다. 또는 emacs에서 사용할 수 있는 고정된 홈 키 목록이 있습니다(기본 구성에 대해 이야기하고 있습니다). emacs를 얻을 수 없기 때문에 고정 목록 쪽으로 기울고 있습니다. 행동을 바꾸다TERM
큰 문제

xterm(및 MATE 터미널)은 emacs가 열릴 때 전송된 코드를 어떻게 변경합니까?

제가 생각할 수 있는 몇 가지 추측은 다음과 같습니다.

a) xterm에는 emacs에 대한 특별한 규칙이 있습니다 b) emacs에는 emacs에 대한 특별한 규칙이 있습니다 xterm c) emacs는 이 문제를 일으키기 위해 터미널 설정을 변경하지만 해당 설정이 무엇이든 상관없이 catcat이 해당 설정을 사용하도록 하면 계속 다시 바뀌어

언급할만한 작은 문제
  • home키가 일치 하고 khome해당 값이 전송되는 것처럼 보이지 않는 이유는 무엇입니까 ?
  • emacs(기본적으로)는 이에 따라 동작을 변경합니까 TERM?

답변1

당신은 의미합니까?키보드 적용 모드, 기록됨XTerm 제어 순서:

The home- and end-keys (unlike PageUp and other keys also on the 6-key
editing keypad) are considered "cursor keys" by xterm.  Their mode is
also controlled by the DECCKM escape sequence:

                    Key        Normal     Application
                    ---------+----------+-------------
                    Home     | CSI H    | SS3 H
                    End      | CSI F    | SS3 F
                    ---------+----------+-------------

활성화/비활성화DECCKM:

CSI ? Pm h
          DEC Private Mode Set (DECSET).
            Ps = 1  ⇒  Application Cursor Keys (DECCKM), VT100.

통과하다smkx/rmkx능력은터미널 설명(infocmp를 사용하여 이를 볼 수 있습니다):

        rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
        rmul=\E[24m, rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>,
        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=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;
            %?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
        sgr0=\E(B\E[m, smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=,
        vpa=\E[%i%p1%dd, E3=\E[3J, use=ansi+csr, use=ansi+enq,
        use=ansi+idl, use=ansi+inittabs, use=ansi+local,
        use=ansi+pp, use=ansi+sgrbold, use=xterm+kbs,
        use=xterm+alt+title, use=att610+cvis, use=xterm+acs,
        use=xterm+meta,

(비화면 응용 프로그램은 일반적으로 터미널을 초기화하지 않지만 전체 화면 응용 프로그램은 일반적으로 초기화합니다. 각 경우에 하드코딩된 항목은 무시합니다.)

관련 정보