ช่วยบอกว่าพรอมต์ของฉันเป็นแบบนี้ (_ แทนเคอร์เซอร์ของฉัน)
~ % _
มีวิธีใดที่ฉันจะทำให้มันเป็นแบบนี้
~ % _
[some status]
คำถามเดิมเกี่ยวกับ zsh แต่ตอนนี้มีคำตอบอื่น ๆ
ช่วยบอกว่าพรอมต์ของฉันเป็นแบบนี้ (_ แทนเคอร์เซอร์ของฉัน)
~ % _
มีวิธีใดที่ฉันจะทำให้มันเป็นแบบนี้
~ % _
[some status]
คำถามเดิมเกี่ยวกับ zsh แต่ตอนนี้มีคำตอบอื่น ๆ
คำตอบ:
ดูเหมือนว่าการตั้งค่าต่อไปนี้จะใช้งานได้ ข้อความในบรรทัดที่สองจะหายไปหากบรรทัดคำสั่งล้นบรรทัดแรก preexec
ฟังก์ชั่นลบบรรทัดที่สองก่อนที่จะใช้คำสั่ง; preexec () { echo; }
ถ้าคุณต้องการที่จะให้มันเปลี่ยนไป
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }
%
Escape มีการจัดทำเป็นเอกสารไว้ในคู่มือ zsh ( man zshmisc
)
Terminfo เป็นเทอร์มินัลการเข้าถึง API Zsh มีterminfo
โมดูลที่ให้การเข้าถึงฐานข้อมูลคำอธิบายเทอร์มินัล: $terminfo[$cap]
เป็นลำดับของตัวอักษรที่จะส่งไปออกกำลังกายความสามารถของเทอร์มินัล$cap
เช่นเพื่อรัน$cap
คำสั่ง ดูman 5 terminfo
(บน Linux หมายเลขส่วนอาจแตกต่างกันไปตามแต่ละ unices) สำหรับข้อมูลเพิ่มเติม
ลำดับของการกระทำคือเลื่อนเคอร์เซอร์ลงหนึ่งบรรทัด ( cud1
) จากนั้นสำรอง ( cuu1
); บันทึกตำแหน่งเคอร์เซอร์ ( sc
); เลื่อนเคอร์เซอร์ลงหนึ่งบรรทัด พิมพ์[some status]
; คืนค่าตำแหน่งเคอร์เซอร์ บิตขึ้นและลงที่จุดเริ่มต้นจำเป็นเฉพาะในกรณีที่พรอมต์อยู่ที่บรรทัดล่างสุดของหน้าจอ บรรทัด preexec จะลบบรรทัดที่สอง ( el
) เพื่อไม่ให้สับสนกับเอาต์พุตจากคำสั่ง
หากข้อความในบรรทัดที่สองกว้างกว่าเทอร์มินัลจอแสดงผลอาจจะอ่านไม่ออก ใช้Ctrl+ Lในเหน็บแนมเพื่อซ่อมแซม
นี่คือวิธีbash
เทียบเท่ากับโซลูชั่น zsh ของ Gilles Bash ไม่มี native terminfo module แต่tput
คำสั่ง (รวมกับterminfo
) ทำสิ่งเดียวกัน
PS1_line1='\w \$ '
PS1_line2='[some status]'
if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
PS2="\[$(tput el)\]> "
trap 'tput el' DEBUG
else
PS1="$PS1_line2 :: $PS1_line1"
fi
หากเทอร์มินัลไม่รองรับหนึ่งในความสามารถมันจะถอยกลับไปที่พรอมต์บรรทัดเดียว
trap
บรรทัดเป็นวิธี hacky ที่จะเลียนแบบ zsh ของpreexec
ฟังก์ชั่น ดู/superuser/175799/สำหรับข้อมูลเพิ่มเติม
แก้ไข : สคริปต์ที่ดีขึ้นตามความคิดเห็นของ Gilles