xterm에서는 키보드의 HOME 키를 누르면 정상적으로 전송되지만 ^[[H
열면 다음 과 emacs -nw
같이 변경됩니다 . 나는 내 자신의 터미널을 만들려고 할 때 그것이 emacs에서 작동하지 않는다는 것을 발견했습니다. 그러나 xterm(또는 emacs)이 동작을 변경하는 원인이 무엇인지 알 수 없습니다.^[OH
home
khome
^[[H
또한
home
"해야 하는" 키는 andkhome
(보통 사용하는 홈 키, 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
키가 보내는 내용을 확인하려면 다음을 사용하세요 .
[
한편 다른 터미널(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 -v
emacs 설정이 일부 키를 변경하기 때문에 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
TERM
tmux가 언제 로 설정 되었는지 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
항상 전송하는 반면 다른 터미널은 나머지 시간 동안khome
Emacs 내부로 전송 합니다.home
khome
둘 다home
bash readline에서 작동하지만khome
emacs에서만 작동합니다. 또는 emacs에서 사용할 수 있는 고정된 홈 키 목록이 있습니다(기본 구성에 대해 이야기하고 있습니다). emacs를 얻을 수 없기 때문에 고정 목록 쪽으로 기울고 있습니다. 행동을 바꾸다TERM
큰 문제
xterm(및 MATE 터미널)은 emacs가 열릴 때 전송된 코드를 어떻게 변경합니까?
제가 생각할 수 있는 몇 가지 추측은 다음과 같습니다.
a) xterm에는 emacs에 대한 특별한 규칙이 있습니다 b) emacs에는 emacs에 대한 특별한 규칙이 있습니다 xterm
c) emacs는 이 문제를 일으키기 위해 터미널 설정을 변경하지만 해당 설정이 무엇이든 상관없이 cat
cat이 해당 설정을 사용하도록 하면 계속 다시 바뀌어
언급할만한 작은 문제
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,
(비화면 응용 프로그램은 일반적으로 터미널을 초기화하지 않지만 전체 화면 응용 프로그램은 일반적으로 초기화합니다. 각 경우에 하드코딩된 항목은 무시합니다.)