![색상 bash 프롬프트 래핑을 어떻게 수정합니까?](https://rvso.com/image/1259391/%EC%83%89%EC%83%81%20bash%20%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8%20%EB%9E%98%ED%95%91%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%88%98%EC%A0%95%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
다음과 같이 PROMPT_FUNCTION을 사용하여 bash 프롬프트를 정의했습니다.
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
일반적으로 이는 현재 virtualenv뿐만 아니라 일부 hg 상태 정보를 표시하는 여러 줄 프롬프트를 제공합니다(색상 없음).
buggy-wins.patch
! (saas) user@computer (~) $
문제는 이것이 프롬프트 길이 계산을 방해하고(제 생각에는!) 이상한 터미널 래핑 문제와 커서 배치를 유발한다는 것입니다. 예를 들어, 80자 터미널에서 표시되는 프롬프트는 다음과 같습니다(**로 둘러싸인 문자는 커서 위치입니다).
~) $ **a**nis) crose@chris-rose (~
프롬프트를 표시할 수 있을 만큼 넓은 터미널에서는 줄 바꿈이 예상보다 훨씬 일찍 발생합니다. 여기에 내가 넣을 수 있는 최대 텍스트가 있습니다.첫 번째108자 너비의 터미널 창에 있는 프롬프트 줄(다시 말하지만 **는 내 커서 위치를 표시함):
**(**advanis) crose@chris-rose (~) $ sdkfjlskdjflksdjff
줄이 넘어가면 프롬프트를 덮어씁니다. 그러나 입력의 두 번째 줄은 터미널 가장자리까지 바로 실행된 다음 올바르게 래핑됩니다.
따라서 프롬프트의 너비에 문제가 있는 것이 분명합니다. bash가 ANSI 이스케이프 코드가 아닌 프롬프트의 실제 표시 길이에 따라 PS1 문자열의 길이를 결정하도록 하려면 어떻게 해야 합니까?
답변1
bash
"표시된 길이"를 결정하는 데 사용됩니다 \[
\]
. 두 이스케이프 사이의 텍스트는 인쇄할 수 없는 것으로 간주되며 전체 길이에 포함되지 않습니다. 다른 모든 것입니다.
변수에 문제가 있는 것 같습니다. bright='\[[01m\]'
실제로 ESC 문자가 포함되어 있지 않으므로 [01m
일반 텍스트로 인쇄되지만 길이에는 포함되지 않습니다. 그것은해야한다 '\[\e[01m\]'
. 다른 모든 변수에도 동일합니다.
관련된:
- Bash에서는 별도
\$(hg_status)
의 .$PS1
PROMPT_COMMAND