จากข้อมูลที่ฉันพบที่นี่ฉันสามารถค้นพบวิธีแก้ปัญหาที่ง่ายกว่าในการจัดแนวขวาในขณะที่รองรับเนื้อหาความยาวผันแปรทางด้านขวาหรือซ้ายรวมถึงการรองรับสี เพิ่มที่นี่เพื่อความสะดวกของคุณ ...
หมายเหตุเกี่ยวกับสี: การใช้การ\033
หลบหลีกเพื่อเป็นทางเลือกโดยไม่มี\[\]
การจัดกลุ่มเป็นการพิสูจน์ความเข้ากันได้มากที่สุดและแนะนำให้ใช้
เคล็ดลับคือการเขียนทางด้านขวามือก่อนจากนั้นใช้ carriage return ( \r
) เพื่อกลับไปที่จุดเริ่มต้นของบรรทัดและเขียนทับเนื้อหาด้านซ้ายมือที่ด้านบนของสิ่งต่อไปนี้:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
ฉันใช้tput cols
บน Mac OS X เพื่อดึงความกว้างขั้ว / คอนโซลจากterminfo
ตั้งแต่ฉัน$COLUMNS
var ไม่ได้บรรจุอยู่ในenv
แต่คุณอาจทดแทนทดแทน " *
" ค่าใน%*s
โดยการให้ " ${COLUMNS}
" หรือค่าอื่น ๆ ที่คุณต้องการแทน
ตัวอย่างถัดไปใช้$RANDOM
ในการสร้างเนื้อหาความยาวที่แตกต่างกันรวมถึงสีและแสดงวิธีที่คุณอาจแยกฟังก์ชั่นเพื่อ refactor หรือการนำไปใช้กับฟังก์ชั่นที่นำมาใช้ซ้ำ
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
เนื่องจากprintf
สมมติว่าความยาวของสตริงเป็น # ของอักขระที่เราต้องชดเชยจำนวนอักขระที่จำเป็นในการเรนเดอร์สีคุณจะพบว่ามันสั้นเสมอที่ส่วนท้ายของหน้าจอเนื่องจากไม่มีอักขระ ANSI ที่พิมพ์โดยไม่มีการชดเชย อักขระที่ต้องการสำหรับสียังคงที่และคุณจะพบว่า printf คำนึงถึงการเปลี่ยนแปลงความยาวตามที่ส่งคืนโดย$RANDOM
ตัวอย่างเช่น 'ซึ่งทำให้การจัดตำแหน่งที่เหมาะสมของเราอยู่ในชั้นเชิง
นี้ไม่ได้เป็นกรณีที่มีการทุบตีพิเศษลำดับที่พรอมต์หลบหนี (เช่น. \u
, \w
, \h
, \t
) แต่เป็นเหล่านี้เท่านั้นที่จะบันทึกความยาวของ 2 เพราะทุบตีจะแปลให้เมื่อพรอมต์จะปรากฏหลังจาก printf มีการแสดงผลสตริง สิ่งนี้จะไม่ส่งผลกระทบทางด้านซ้าย แต่ควรหลีกเลี่ยงทางด้านขวา
ไม่มีผลหากเนื้อหาที่สร้างขึ้นจะยังคงอยู่ที่ความยาวคงที่ เช่นเดียวกับ\t
ตัวเลือกเวลาซึ่งจะแสดงจำนวนอักขระ (8) เท่ากันตลอด 24 ครั้ง เราจำเป็นต้องคำนึงถึงปัจจัยในการชดเชยที่จำเป็นสำหรับความแตกต่างระหว่าง 2 ตัวอักษรซึ่งนับเป็น 8 อักขระเมื่อพิมพ์ในกรณีเหล่านี้
โปรดทราบว่าคุณอาจจำเป็นต้องหลีกเลี่ยงสาม\\\
ลำดับการหลีกเลี่ยงบางอย่างซึ่งมีความหมายกับสตริง เช่นเดียวกับตัวอย่างต่อไปนี้การหลีกเลี่ยงไดเรกทอรีการทำงานปัจจุบัน\w
ไม่มีความหมายเป็นอย่างอื่นดังนั้นจึงทำงานได้ตามที่คาดไว้ แต่เวลา\t
ซึ่งหมายถึงอักขระแท็บไม่ทำงานตามที่คาดไว้
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Njoy!