Gilles ระบุปัญหาหลักของคุณ แต่ฉันต้องการลองอธิบายให้ต่างออกไป
Bash ตีความพรอมต์พิเศษเฉพาะก่อนที่จะขยายตัวแปรใด ๆ ในพรอมต์ ซึ่งหมายความว่าการใช้\e
ในตัวแปรที่ขยายจากพรอมต์ไม่ทำงานแม้ว่าจะทำงานได้โดยตรงPS1
ก็ตาม
ตัวอย่างเช่นทำงานได้ตามที่คาดหวังและให้ข้อความสีแดง:
PS1='\e[1;31m this is in red '
แต่นี่ไม่ใช่แค่ใส่ตัวอักษรลง\e
ในพรอมต์:
RED='\e[1;31m'
PS1="$RED not in red "
หากคุณต้องการเก็บค่า$'...'
Escape สีในตัวแปรคุณสามารถใช้ ANSI-C quoting ( ) เพื่อใส่อักขระตัวอักษรที่แท้จริงในตัวแปร
การทำเช่นนี้คุณสามารถเปลี่ยนนิยามของGREEN
, RED
และNONE
ดังนั้นค่าของพวกเขาเป็นลำดับหนีที่เกิดขึ้นจริง
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
หากคุณทำเช่นนั้นPS1
การเสนอราคาครั้งแรกของคุณควรจะทำได้:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
อย่างไรก็ตามคุณจะมีปัญหาที่สอง
ลองเรียกใช้แล้วกดUp Arrowจากนั้นHomeเคอร์เซอร์ของคุณจะไม่กลับไปที่จุดเริ่มต้นของบรรทัด
หากต้องการแก้ไขให้เปลี่ยนPS1
รวม\[
และ\]
รอบ ๆ ลำดับหลีกสีเช่น
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
คุณไม่สามารถใช้งานget_exit_status
ได้อย่างถูกต้องที่นี่เนื่องจากเอาต์พุตมีทั้งการพิมพ์ (รหัสออก) และตัวอักษรที่ไม่ได้พิมพ์ (รหัสสี) และไม่มีวิธีการทำเครื่องหมายอย่างถูกต้องในพรอมต์ การวาง\[...\]
จะทำเครื่องหมายว่าไม่ใช่การพิมพ์แบบเต็มซึ่งไม่ถูกต้อง คุณจะต้องเปลี่ยนฟังก์ชั่นเพื่อให้มันพิมพ์เฉพาะรหัสสีที่ถูกต้องจากนั้นล้อมรอบด้วย\[...\]
พรอมต์
\[
เป็น\1
และเป็น\[
\2
ผู้ที่สอดคล้องกับRL_PROMPT_{START,END}_IGNORE
สิ่งที่readline บางอย่างซึ่งขอให้ละเว้นไบต์เมื่อนับความยาวพร้อมท์บนหน้าจอ ดูlists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html