xterm + tmux에서 Ctrl-h를 누르면 "^?"가 전송되는 이유는 무엇입니까?

xterm + tmux에서 Ctrl-h를 누르면 "^?"가 전송되는 이유는 무엇입니까?

xterm:

$ echo $TERM
xterm-256color
$ stty -a
speed 38400 baud; rows 52; columns 91; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; 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

gnome-terminal:

$ echo $TERM
xterm-256color
$ stty -a
speed 38400 baud; rows 57; columns 100; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; 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

실외 에서는 --output .tmux​ 내부에서는 에서 실행되는지 이해하기 시작했습니다 . 내부에서 실행하면 여전히 출력됩니다 . 그 이유는 무엇입니까? 출력 되어야 합니까 ? 이 문제를 해결하는 방법은 무엇입니까?Ctrlv Ctrlh^Htmux^?xtermscreenxterm^H^H^?

답변1

그 이유는 xterm에서 ^H이것이 erase문자이고 tmux해당 erase문자가 분명히 에뮬레이트하는 터미널의 해당 제어 문자( )로 변환되어 ^?삭제가 예상대로 작동하기 때문입니다.요리 모드(예를 들어 를 입력하면 어떻게 됩니까 cat?) ^?삭제 문자(키로 생성됨)가 있는 터미널을 사용한 다음 Backspace삭제 문자(키로 생성됨) 역할을 하는 터미널을 사용하여 세션을 복원하는 경우 변환해야 합니다. 불행하게도 + 를 입력하는 경우와 같이 어떤 경우에는 심각한 부작용이 발생할 수 있습니다.^HBackspaceCtrlH

유일한 좋은 해결책은 모든 터미널(실제 또는 tmux)이 동일한 erase문자를 사용하는지 확인하는 것입니다. ^?이는 오늘날 표준입니다. xterm 구성이 잘못된 것 같습니다. AFAIK, 이것은 기본 구성이 아닙니다.

TERM그럼에도 불구하고 이를 표현하기 위해 값을 사용해야 합니다 kbs=\177. 그러나 이것은아니요xterm-256color공식 ncurses의 예. 따라서 다른 값을 선택하거나 항목을 TERM수정 해야 합니다 (최종 사용자는 , 수정 및 을 사용하여 수행할 수 있음 ). 일부 Linux 배포판에는 이 문제가 없습니다. 예를 들어 Debian은 소스 패키지의 파일을 통해 이 문제를 해결합니다 .kbsxterm-256colorinfocmp > filefiletic filedebian/xterm.tincurses

$ infocmp xterm-256color | grep kbs
        kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,

다음 사항도 있어야 합니다.

$ appres XTerm | grep backarrowKeyIsErase:
*backarrowKeyIsErase:   true

다른 작업을 수행하기 전에 xterm에서 이 작업을 수행 할 수 있지만 stty erase '^?'이는 해결 방법일 뿐이며 키 동작이 중단될 수 있습니다 Backspace. 기본적으로 실제로는 erase = ^?(그림과 같이 ) 있어야 합니다 stty -a!

문제가 지속 Backspace되거나 Delete지속되면 다음을 권장합니다.일관된 BackSpace 및 구성 삭제앤 바레타의 파일.

답변2

여기나 다른 곳에서는 어떤 솔루션도 나에게 도움이 되지 않았습니다. 효과가 있었던 것은 내 $HOME/.tmux.conf파일 에 다음을 추가하는 것이었습니다 .

bind-key -n Bspace send-keys C-h

누르면 tmux가 전송됩니다 Ctrl.HBackspace


아래에 몇 가지 논평, 배경 및 호언장담을 제공했으므로 여기에서 읽기를 중단하셔도 됩니다. -:)


나는 "유일한 좋은 해결책"이 백스페이스/지우기 문자만 만드는 것이라는 vinc17의 의견에 동의하지 않습니다 ^? . 사용자는 자신이 적합하다고 생각하는 대로 구성할 수 있어야 합니다.

실제 터미널이 등장한 이후 Unix를 사용하는 많은 사람들을 위한 일반적인 솔루션은 백스페이스에 ^H를 사용하고 DEL에 ^?를 사용하는 것입니다(즉, 커서 앞이 아닌 삭제). Ctrl-H와 백스페이스의 차이점은 특히 CLI/터미널 프로그램의 경우 항상 필요한 것은 아니며 항상 필요한 것은 아닙니다.

나는 80년대 후반부터 많은 컴퓨터에서 ^H / ^? 매핑을 사용해 왔으며 실제 터미널이 "죽은" 이후부터 터미널 프로그램과 가상 콘솔에 대해 Backspace / DEL 키를 사용해 왔습니다(각각) ), 그리고 내 모든 컴퓨터와 그 컴퓨터에서 지우기 문자를 재구성하고 싶지 않습니다. 내 고객(아주 많은 컴퓨터)이 백스페이스를 사용하여 보내기를 원합니다^? 일하다.

나는 tmux가 백스페이스를 위해 Ctrl-H를 보내도록 하기 위해 다양한 게시물을 기반으로 다양한 방법을 시도했습니다. 특히, Terminator에서 tmux를 사용하고 있기 때문에 "bind-key -n Ch send-keys Ch"가 작동하지 않는다는 점이 답답합니다. 그리고 내 Terminator가 백스페이스 키를 누를 때 Ctrl-H를 보내도록 설정되어 있다는 것을 알고 있습니다. 키를 눌렀습니다. 사용 가능한 tmux 키 이름을 나열하는 게시물을 우연히 발견하는 데 오랜 시간이 걸렸습니다. 여기에서 Bspace 키 이름을 찾았습니다. 다행히도 ^H 문자가 tmux를 올바르게 통과할 수 있었습니다(Ubuntu 16.04 버전 2.1-3build1의 tmux). . 02).

답변3

xfce4-terminal의 느린 스크롤로 인해 xterm으로 전환한 후에도 동일한 문제가 발생했습니다. ~/.Xresources에서 나는 을 설정했습니다 XTerm*ptyInitialErase: true . xterm 매뉴얼 페이지를 참조하십시오. 이 설정은 vs. 의사 터미널 ^H에 남습니다 . ^?이것을 테스트하기 위해 Ctrl-V Ctrl-H를 실행했고 출력은 ^H.

관련 정보