VIM 명령을 실행할 때 터미널에 나타나는 이상한 정크(ansi 이스케이프 문자?)

VIM 명령을 실행할 때 터미널에 나타나는 이상한 정크(ansi 이스케이프 문자?)

나는스크립트, 실행할 때때때로/often 다음 줄이 나타나면 "이스케이프 처리되지 않은" ANSI 이스케이프 시퀀스를 출력합니다.

vim -X -u NONE -c "helptags ~/.vim/plugged/vim-fugitive/doc" -c q

결과는 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

명령을 실행하는 것만으로는 이 "쓰레기"가 생성되지 않는 것 같기 때문에 왜 이런 일이 발생하는지 모르겠습니다. 이는 해당 행이 실행 중일 때만 발생합니다. 주석 처리하면 문제가 해결됩니다. 더욱 이상한 점은 바로 그것이다.때때로일어나지 않을 것입니다. 아마도 좋은 일이고 뭔가를 하면 결과가 나타날 것입니다. 스크립트 실행 결과는 괜찮습니다. 그러나 일단 나타나면 지속적으로 나타나는 것 같습니다(*사실이 아님, 아래 참조). 일반적으로 다른 터미널 탭을 열면 문제가 드러납니다.

여기서 무슨 일이 일어나고 있는지 아시나요? vim이 일부 터미널 설정( ? )을 선택 $TERM하고 출력을 방해하지 않습니까? 아니면 다른 일이 일어나고 있나요?

컬러 출력에 대한 나의 유틸리티 기능은 다음과 같습니다.여기, 그게 중요할까요?

편집하다:

  • PS1프롬프트를 그런 식으로 변경 하면 $문제가 나타날 때 사라지지만 프롬프트를 다시 컬러 프롬프트로 설정해도 문제가 다시 발생하지 않으므로 여기서 확실성을 찾는 데 어려움을 겪고 있습니다. .

PS1 프롬프트 설정 이미 마쳤어여기:

set_prompt(){
    local user=$(green "\u")
    local host=$(dark_yellow "\h")
    local workdir=$(pink "\w")
    local gitbranch=$(dark_red \$\(__git_ps1  "\(%s\)" \))
    local at=$(dark_grey at)
    local in=$(dark_grey in)
    export PS1="\n${user} ${at} ${host} ${in} ${workdir} ${gitbranch}"$'\n\$ '
}

# Now set it. If any of these colors are later overridden, then just rerun `set_prompt`
set_prompt

그리고 사용이러한 유틸리티 함수 및 변수:

# Color escape codes @see http://misc.flogisoft.com/bash/tip_colors_and_formatting
# Use \033 instead of \e. Workes better across platforms
# \e works in PS1 prompts, but not other places
c_X_reset_all='\033[0m' #stop code for color escape
c_X_bold='\033[21m'
c_X_reset_bold='\033[21m'
c_green='\033[01;32m'
c_blue='\033[01;34m'
c_pink='\033[01;35m'
c_dark_grey='\033[90m'

c_dark_yellow='\033[38;5;178m'
c_dark_red='\033[38;5;196m'

green(){
    echo -n  -e  ${c_green}$@${c_X_reset_all}
}

blue(){
    echo -n  -e  ${c_blue}$@${c_X_reset_all}
}

pink(){
    echo -n  -e  ${c_pink}$@${c_X_reset_all}
}

dark_grey(){
    echo -n  -e  ${c_dark_grey}$@${c_X_reset_all}
}

dark_yellow(){
    echo -n  -e  ${c_dark_yellow}$@${c_X_reset_all}
}

dark_red(){
    echo -n  -e  ${c_dark_red}$@${c_X_reset_all}
}

팁(변경 전)

다음은 주석 변경 사항을 구현하기 전의 팁입니다.

$ perl -e 'print quotemeta($ENV{PS1})'
\\n\[01\;32m\\u\[0m\ \[90mat\[0m\ \[38\;5\;178m\\h\[0m\ \[90min\[0m\ \[01\;35m\\w\[0m\ \[38\;5\;196m\$\(__git_ps1\ \\\(\%s\\\)\ \)\[0m\
\\\$\

\033모든 비트가 사라지고 로 대체되는 것을 볼 수 있습니다 \. 이는 이제 \출력에 표시되는 ESC 문자(10진수 27, 16진수 1B)의 8진수 표현이기 때문입니다 ( \033[) \].

팁(이스케이프 시퀀스 도입 후)

이것으로 문제가 해결된 것 같습니다.

이러한 의견은 인쇄할 수 없는 문자 주위에 이스케이프 시퀀스를 도입할 것을 제안합니다. ESC 문자가 더 이상 대체되지 않으므로 상황이 바뀌는 것 같습니다.

$ perl -e 'print quotemeta($ENV{PS1})'
\\n\\\[\\033\[01\;32m\\\]\\u\ \\\[\\033\[90m\\\]at\ \\\[\\033\[38\;5\;178m\\\]\\h\ \\\[\\033\[90m\\\]in\ \\\[\\033\[01\;35m\\\]\\w\ \\\[\\033\[38\;5\;196m\\\]\(master\)\\\[\\033\[00m\\\]\
\\\$\

관련 정보