다음과 같이 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 문자열의 길이를 어떻게 결정하도록 할 수 있습니까?