Tôi đã xác định một dấu nhắc bash (sử dụng PROMPT_FUNCTION) như vậy:
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
Nói chung, điều này mang lại cho tôi một dấu nhắc nhiều dòng hiển thị một số thông tin trạng thái hg cũng như virtualenv hiện tại của tôi, trông (không có màu) như thế này:
buggy-wins.patch
! (saas) user@computer (~) $
Vấn đề là, đây là vấn đề khó khăn trong việc tính toán độ dài của dấu nhắc (tôi nghĩ vậy!) Và gây ra các vấn đề gói thiết bị đầu cuối kỳ lạ và vị trí con trỏ. Ví dụ: trong một thiết bị đầu cuối 80 char, đây là lời nhắc tôi thấy (ký tự ** - bao quanh là vị trí con trỏ):
~) $ **a**nis) crose@chris-rose (~
Trong các thiết bị đầu cuối đủ rộng để hiển thị dấu nhắc, việc ngắt dòng xảy ra sớm hơn nhiều so với mức cần thiết; Đây là văn bản nhiều nhất tôi có thể vừa trên dòng đầu tiên của dấu nhắc trong cửa sổ đầu cuối rộng 108 char (một lần nữa, ** đánh dấu vị trí con trỏ của tôi):
**(**advanis) crose@chris-rose (~) $ sdkfjlskdjflksdjff
Khi dòng kết thúc, nó sẽ ghi đè lên dấu nhắc. Tuy nhiên, dòng đầu vào thứ hai chạy thẳng đến cạnh của thiết bị đầu cuối, và sau đó kết thúc chính xác.
Vì vậy, rõ ràng một cái gì đó đang gây rối với chiều rộng của dấu nhắc. Làm cách nào tôi có thể khiến bash xác định độ dài của chuỗi PS1 không theo mã thoát ANSI, nhưng theo độ dài hiển thị thực tế của dấu nhắc?