컬러 bash 프롬프트 줄 바꿈을 어떻게 수정합니까?


9

다음과 같이 bash 프롬프트를 정의했습니다 (PROMPT_FUNCTION 사용).

function get_hg_prompt_prefix() {
    local APPLIED_COLOR=$1; shift
    local UNAPPLIED_COLOR=$1; shift
    local ALERT_COLOUR=$1; shift
    local TEXTCOLOR=$1; shift
    local mercurial_prompt_line="{{patches|join(:)|pre_applied(${APPLIED_COLOR})|post_applied(${TEXTCOLOR})|pre_unapplied(${UNAPPLIED_COLOR})|post_unapplied(${TEXTCOLOR})}\n\r}"
    local mercurial_status_prompt="{ ${ALERT_COLOUR}{status}${TEXTCOLOR}}"

    echo "$(hg prompt "${mercurial_prompt_line}" 2>/dev/null)$(hg prompt "${mercurial_status_prompt}" 2>/dev/null)"
}

function set_prompt() {
    bright='\[[01m\]'
    colors_reset='\[[00m\]'
    HOSTCOLOR=${colors_reset}='\[[34m\]'
    USERCOLOR=${colors_reset}='\[[01m\]'
    TEXTCOLOR=${colors_reset}='\[[32m\]'
    APPLIED_COLOR=${colors_reset}='\[[32m\]'
    UNAPPLIED_COLOR=${colors_reset}='\[[37m\]'
    ALERT_COLOUR=${colors_reset}='\[[31m\]'

    hg_status="$(get_hg_prompt_prefix $APPLIED_COLOR $UNAPPLIED_COLOR $ALERT_COLOUR $TEXTCOLOR)"
    ps1_prefix="${hg_status}$colors_reset($bright$(basename $VIRTUAL_ENV)$colors_reset) "
    PROMPTEND='$'
    PS1="${ps1_prefix}${USERCOLOR}\u${colors_reset}${TEXTCOLOR}@${colors_reset}${HOSTCOLOR}\h${colors_reset}${TEXTCOLOR} (\W) ${PROMPTEND}${colors_reset} "
}

PROMPT_COMMAND=set_prompt

일반적으로 이것은 다음과 같이 (색상없이) 현재 가상 환경뿐만 아니라 일부 hg 상태 정보를 표시하는 여러 줄 프롬프트를 제공합니다.

buggy-wins.patch
 ! (saas) user@computer (~) $ 

문제는 프롬프트 길이를 계산하는 데 어려움을 겪고 있으며 (터미널!) 이상한 터미널 배치 문제와 커서 배치를 유발한다는 것입니다. 예를 들어, 80 문자 터미널에서 여기에 내가 표시되는 프롬프트가 표시됩니다 (** 주위 문자는 커서 위치입니다).

~) $ **a**nis) crose@chris-rose (~

프롬프트를 표시 할만큼 넓은 터미널에서는 줄 바꿈이 예상보다 훨씬 일찍 발생합니다. 여기 에 108 문자 너비의 터미널 창에서 프롬프트 의 첫 번째 줄에 맞출 수있는 가장 많은 텍스트가 있습니다 (**는 커서 위치를 표시합니다).

 **(**advanis) crose@chris-rose (~) $ sdkfjlskdjflksdjff

줄이 바뀌면 프롬프트를 덮어 씁니다. 그러나 두 번째 입력 라인은 터미널 가장자리로 바로 이어지고 올바르게 줄 바꿈됩니다.

따라서 프롬프트 너비에 문제가있는 것이 분명합니다. bash가 ANSI 이스케이프 코드가 아니라 프롬프트의 실제 표시된 길이에 따라 PS1 문자열의 길이를 어떻게 결정하도록 할 수 있습니까?

답변:


21

bash\[ \]"표시된 길이"를 결정하는 데 사용 합니다.이 두 이스케이프 사이의 텍스트는 인쇄 할 수없는 것으로 간주되며 총 길이로 계산되지 않습니다. 다른 모든 것입니다.

변수에 문제가있는 것 같습니다. bright='\[[01m\]'실제로 ESC 문자를 포함하지 않으므로 [01m일반 텍스트로 인쇄되지만 길이는 계산되지 않습니다. 이어야합니다 '\[\e[01m\]'. 다른 모든 변수에 동일합니다.


관련 :

  • Bash에서는 별도의 필요없이 직접 넣을 \$(hg_status)$PS1있습니다 PROMPT_COMMAND.

1
그것은 부분적인 수정을 제공합니다; 줄 길이는 이제 올바르게 감지되지만 프롬프트를 통해 첫 번째 줄 바꿈으로 문제를 해결하지는 않습니다.
Chris R

1
크리스 R : 나는 당신의 신속하고 단지 모든 교체 시도 '\[['\[\e[우분투 12.04에 떠들썩한 파티에서 일했다. 탈출 색상 (및 다른 관련이없는 크기의 부품) \[...\]도 나에게 도움이되었지만, 당신보다 훨씬 더 복잡한 PS1이 있습니다 (오른쪽 정렬 된 텍스트는 프롬프트와 같은 줄에 오른쪽 정렬 된 텍스트는 오른쪽 하단에 있습니다) 모서리). 초기 줄 바꿈과 겹치는 줄 바꿈 문제를 해결했습니다.
TWiStErRob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.