긴 입력 문자열에서 bash (tty 및 X)에서 이상하게 작동하는 홈 키 처음으로 돌아가고 싶을 때 명령이 제대로

Home현재 입력이 충분히 짧으면 (예 : <36 자) 적중 하면 제대로 작동합니다. 그러나 더 긴 명령을 입력 한 다음 처음으로 돌아가고 싶을 때 명령이 제대로 작동하지만 더 이상 명령이 표시 되지 않습니다. 마치 처음에는 없지만 10 자 정도 떨어져있는 것처럼 보입니다. “맹목적으로”입력하면 제대로 작동하지만 전체 입력이 오른쪽으로 이동하지만 다시 그려지지 않는 것처럼 전체 혼란처럼 보입니다. 그래서 제가 “지우고있는”장소가 오른쪽에 “실제로”10 문자가 있기 때문에 나는 그것을 입력하지만 “사실”은 아닙니다. 따라서 명령을 지우려고하면 처음 10자가 계속 표시되지만 히트 Enter하면 이전 입력이 비어있는 것처럼 다른 프롬프트가 표시됩니다.

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

나는 이것을 tty와 X 세션의 터미널에서 모두 재현합니다. 내가 공격 할 때 Ctrl+를 V하고 Home나는 (다른 시퀀스를 참조 ^[OH, X에서 ^[[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 $TERMlinux청각 장애와 xtermX 세션한다.

이것의

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

아무도 이것에 대한 단서가 있습니까?



답변

당신은과 (색상 변경에 대한 이스케이프 시퀀스에 제한을 포함하지만) 프롬프트의 비 인쇄 부분을 둘러싸 필요 \[하고 \].

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

\[\]말해 bash실제로 화면에 인쇄되지 않는 사이에 그 모든 것을, 즉 길이가 제로. 입력 한 문자를 에코 할 위치를 알기 위해서는 계산 된 프롬프트 길이가 필요합니다. 제외 \[ \]하면 bash잘못된 프롬프트 길이가 계산 bash되어 커서가 실제 위치와 일치하지 않는 위치 로 인해 이상한 터미널 구조에 따라 동작하는 경우가 종종 있습니다.