긴 입력 문자열의 bash(tty 및 X)에서 홈 키가 이상하게 작동합니다.

긴 입력 문자열의 bash(tty 및 X)에서 홈 키가 이상하게 작동합니다.

Home현재 입력이 충분히 짧으면(예: 36자 미만) 제대로 작동합니다 . 그러나 더 긴 명령을 입력한 후 처음으로 돌아가고 싶을 때 제 역할을 하는 것처럼 보이지만 명령이 그렇지 않습니다.표시됨더 이상은 그렇지 않아. 처음에는 아닌데 10자 정도 빠진 것 같네요. "맹목적으로" 입력하면 잘 작동하지만 전체 입력이 오른쪽으로 이동했지만 다시 그려지지 않은 것처럼 완전히 엉망인 것처럼 보입니다. 그래서 나는 그것을 위에 입력하지만 "사실"은 그렇지 않습니다. 왜냐하면 제가 "지우고 있는" 곳은 "실제로는" 오른쪽 10글자이기 때문입니다. 따라서 명령을 지우려고 하면 처음 10자가 계속 표시되지만, 누르면 Enter이전 입력이 비어 있는 것처럼 또 다른 프롬프트가 표시됩니다.

나는 그것이 최고의 설명이 아니라는 것을 알고 있지만 요점은 bash가 그것을 인식하고 올바른 일을 하려고 시도하지만 종종 실패한다는 것입니다.

나는 이것을 tty와 X 세션의 터미널 모두에서 재현합니다. Ctrl+를 눌렀을 때 V다른 시퀀스( X, tty)가 Home표시되지만 둘 다 my에 있는 것 같습니다 .^[OH^[[1~/etc/inputrc

# do not bell on tab-completion
#set bell-style none

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

$if mode=emacs

# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word

# for rxvt
"\e[8~": end-of-line

# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif

echo $TERMlinuxtty와 xtermX 세션에 표시됩니다 .

그것은

GNU bash, 버전 4.2.24(2)-릴리스(i686-pc-linux-gnu)

이에 대한 단서가 있는 사람이 있나요?

답변1

프롬프트의 인쇄되지 않는 부분(색상 변경을 위한 이스케이프 시퀀스를 포함하되 이에 국한되지 않음)을 \[및 로 묶어야 합니다 \].

원래 프롬프트: \e[0;36m[\u@\h \W]\$ \e[m
수정된 프롬프트:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

\[그리고 그 사이의 모든 내용은 실제로 화면에 인쇄되지 않습니다. 즉, 길이가 0임을 \]알려 줍니다. bash입력한 문자를 어디에서 에코할지 알기 위해서는 계산된 프롬프트 길이가 필요합니다. 생략하면 잘못된 프롬프트 길이가 계산되어 커서가 현실과 일치하지 않는 위치에 대한 의 생각 으로 인해 종종 이상한 터미널 형상 종속 동작이 발생합니다 \[ \].bashbash

관련 정보