완료시 디스플레이에서 명령의 첫 문자가 반복됨


21

내가 Tab완료 하는 데 사용 하는 동안 처음 두 문자가 반복되었습니다 . 아래 스크린 샷에서 cd반복됩니다.

여기에 이미지 설명을 입력하십시오

rxvt-unicdoe, xterm, terminator를 시도했습니다. 이 모든 터미널 에뮬레이터에는이 문제가 있습니다.

Zsh 버전 5.0.2, 구성 파일 on-my-zsh


zsh가 실행하는 명령에서 문자가 반복되거나 단순히 표시됩니까? 명령이 두 문자보다 길면 문자 수가 변경됩니까? 현재 디렉토리가 변경 될 때 번호가 변경됩니까?
Gilles 'SO- 악마 그만해'

@Gilles 반복되는 문자가 명령에 없습니다. 명령을 실행할 수 있습니다.
jilen

답변:


32

명령 행의 문자가 오프셋에 표시되는 경우가 종종 있는데, 이는 zsh가 프롬프트에 대해 잘못된 너비를 계산했기 때문입니다. 커서를 이동하는 다른 명령 ( Home, 완료 등 )을 사용할 때 문자를 추가하거나 문자를 기준으로 문자를 이동하지만 문자가 움직이지 않는 한 표시가 제대로 표시되는 경우가 있습니다 . ) 또는 명령이 두 번째 줄과 겹치는 경우.

Zsh 는 명령의 문자 위치를 알기 위해 프롬프트 의 너비를 알아야합니다 . 달리 언급하지 않는 한 각 캐릭터는 한 위치를 차지한다고 가정합니다.

한 가지 가능성은 프롬프트에 올바르게 구분되지 않은 이스케이프 시퀀스 가 포함되어있을 수 있습니다 . 텍스트의 색상이나 기타 서식 측면을 변경하거나 창 제목 또는 기타 효과를 변경하는 이스케이프 시퀀스의 너비는 0입니다. 그것들 은 퍼센트 괄호 구문 안에 포함되어야합니다%{…%} . 보다 일반적으로, 이스케이프 시퀀스 %42{…%}는 zsh에게 중괄호 안에있는 것이 너비가 42 자라고 가정하도록 지시합니다.

따라서 프롬프트 설정 ( PS1, PROMPT또는 참조하는 변수)을 확인하고 모든 이스케이프 시퀀스 (예 : \e[…m텍스트 속성 변경 등 $fg[red])가 내부에 있는지 확인하십시오 %{…%}. oh-my-zsh를 사용하고 있으므로 자신의 설정과 oh-my-zsh에서 사용하는 정의를 모두 확인하십시오.

bash에서도 동일한 문제가 발생합니다. 프롬프트 에서 너비가 0 인 시퀀스는 로 묶어야 \[…\]합니다.

또 다른 가능성은 프롬프트에 비 ASCII 문자가 포함되어 있고 zsh (또는 다른 응용 프로그램)와 터미널의 너비에 대한 아이디어가 다를 수 있습니다. 터미널 인코딩과 셸에서 선언 된 인코딩 간에 불일치 가 발생하면 두 바이트의 인코딩으로 인해 특정 바이트 시퀀스의 너비가 달라집니다. 일반적으로 비 유니 코드 터미널을 사용하지만 유니 코드 로캘을 선언하거나 그 반대의 경우이 문제가 발생할 수 있습니다.

응용 프로그램은 로케일을 알기 위해 환경 변수에 의존합니다. 관련 설정은 LC_CTYPE환경 변수로부터 결정되고, LANGUAGE, LC_ALL, LC_CTYPELANG(SET는 이들의 최초 적용). 이 명령 locale | grep LC_CTYPE은 현재 설정을 알려줍니다. 로케일 문제를 피하는 가장 좋은 방법은 터미널 에뮬레이터 LC_CTYPE가 예상하는 인코딩을 알고 있기 때문에 설정 하는 것입니다. 그러나 그것이 효과가 없다면을 설정하십시오 LC_CTYPE.

이전 명령이 줄 바꿈으로 끝나지 않은 일부 출력을 표시하여 프롬프트가 행 중간에 표시되지만 쉘이이를 인식하지 못하는 경우에도 동일한 증상이 발생할 수 있습니다. 이 경우에는 그러한 명령을 실행 한 후에 만 ​​지속될 수 있습니다.

줄이 제대로 표시되지 않으면 명령 redisplay또는 clear-screen( 기본적 으로 Ctrl+ L에 바인딩 됨 )이 수정합니다.


아마도 관련 글꼴이 누락 된 것 같습니다. 첫 번째 문자가 이상하다는 것을 알았습니다. ->내가 생각할 것으로 예상된다
jilen

@jilen Ah, 이것은 내가 언급하지 않은 또 다른 문제 일 수 있습니다. 아마도 프롬프트에는 터미널과 다른 인코딩으로 비 ASCII 문자가 포함되어 있으며 인코딩 중 하나 또는 둘 다가 멀티 바이트입니다. 도움이 필요하면 localeand의 출력을 게시하십시오 echo $PS1 | od -t x1(및 다른 변수가 사용하는 것과 동일한 내용 $PS1).
Gilles 'SO- 악마 그만'

2
로케일을 설정하는 것을 잊었습니다 (archlinux를 사용하고 있으며 로케일은 기본적으로 설정되어 있지 않습니다). locale을 설정하면이 문제가 해결됩니다. 고마워요!
jilen

글쎄요, 꽤 굉장하기 때문입니다. 그러나 커서 수를 직접 처리하는 경우 이스케이프를 대괄호에 절대 포함 할 필요는 없습니다. 서브 쉘 함수를 호출하면 과거에 나에게 효과적이었다. 작동 한 다른 방법- \e{7,8}커서 상태 저장 / 복원에 사용
mikeserv

그것은 LC_CTYPE나를 위해 고쳐진 것입니다. 설정을 C해제하면 모든 것이 작동했습니다. 감사.
jmaloney

14

나는 같은 문제가 있었고 내 해결책을 찾았습니다 : https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 . 에 다음을 입력하십시오 ~/.zshrc.

export LC_CTYPE=en_US.UTF-8


1
힌트 주셔서 감사합니다! 그러나, locale내가 사용 하고있는 전체를 재설정해야 했지만 그것은 나를 위해 일했습니다. 이 답변 은 우분투에 필요한 단계를 제공합니다.
최대

정말 고맙습니다! 많은 저를 구해주었습니다
Moshe

1

macOS의 iTerm 2 에서이 문제가 발생했습니다. 기본 설정-> 프로필-> 텍스트로 이동하여 "유니 코드 버전 9 너비 사용"을 선택하여 문제를 해결했습니다.


와우, 실제로 작동했습니다. 감사!
Paul Calabro

1

우분투 도커 이미지 ( ubuntu:latest)를 사용 하여이 문제가 있습니다. 해당 페이지에 제공된 지침으로 수정했습니다 : https://hub.docker.com/_/ubuntu

apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.