ฉันจะใส่ newline ใน zsh prompt ของฉันได้อย่างไร


12

ฉันพยายามแก้ไขปัญหาเล็กน้อย (แต่น่ารำคาญ) ด้วยพรอมต์ zsh ของฉัน ปัญหาที่ฉันเห็นคือเมื่อฉันใช้เทอร์มินัลในสภาพแวดล้อม GUI OS (เช่น Terminal.app หรือ iTerm 2 บน OS X 10.7.2) และปรับขนาดหน้าต่างเทอร์มินัลเทอร์มินัลจะถูกวาดใหม่ด้วยพรอมต์พิเศษ .

ฉันได้ทำซ้ำปัญหาใน. zshrc ที่สะอาดที่มีสิ่งต่อไปนี้:

export PROMPT=">
"

เพื่อความชัดเจนนั่นคือไฟล์สองบรรทัด มีการขึ้นบรรทัดใหม่ตามตัวอักษรในสตริงซึ่งฉันได้อ่านในหลายสถานที่( เก่าแก่ ) เป็นวิธีที่จะไป สิ่งนี้ทำงานได้จนกว่าฉันจะปรับขนาดหน้าต่างเทอร์มินัลเมื่อถึงจุดที่ฉันสิ้นสุดด้วยสตริงพรอมต์ซ้ำ ตัวอย่างเช่นถ้าฉันเปิดหน้าต่างใหม่ฉันเห็น ( *กำลังใช้ตัวยึดตำแหน่งแทนเคอร์เซอร์ของฉัน):

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

จากนั้นเมื่อฉันปรับขนาดหน้าต่างทำให้สั้นลงฉันก็จบลงด้วย:

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

จำนวนงานพิมพ์ที่มีการแจ้งเตือนพิเศษดูเหมือนจะเป็นสัดส่วนกับจำนวนที่ฉันเปลี่ยนขนาดหน้าต่าง - มักจะเป็นแนวตั้ง หากฉันลบบรรทัดใหม่ออกจากสตริงแจ้งปัญหาจะหายไป

ฉันได้พยายามสิ่งต่างๆเช่นหรือพยายามที่จะตัดขึ้นบรรทัดใหม่ใน$(print ">\n") %{%}ฉันสมมติว่าสิ่งนี้เกี่ยวข้องกับความจริงที่ว่าบรรทัดใหม่สร้างความสับสนให้กับสิ่งที่กำลังวาด WRT นานแค่ไหนที่สตริงพรอมต์นั้นเป็นจริงหรืออะไรบางอย่าง ปัญหานี้แก้ไขได้หรือไม่ฉันต้องอยู่กับมันหรือไม่

คำตอบ:


13

ปัญหานี้เกิดจากการที่ ZSH พิมพ์สัญญาในการปรับขนาดเหตุการณ์และทำให้ฉันรำคาญใจมาก่อน วิธีแก้ไขคือสร้าง$PROMPTบรรทัดเดียวและพิมพ์บรรทัดแรกของพรอมต์โดยใช้ precmd

ดังนั้นในตัวอย่างของคุณที่จะ:

precmd() { print ">" }
export PROMPT=""

หรือสำหรับตัวอย่างที่ซับซ้อนยิ่งขึ้นด้วยการขยายพรอมต์ในคำสั่งพิมพ์ให้ใช้-rPพารามิเตอร์:

precmd() { print -rP "%~" }
export PROMPT="%# "

หากคุณมีการลงทะเบียน precmd มากกว่าหนึ่งรายการคุณต้องใช้add-zsh-hook precmd(ดูman zshcontrib)


1
สำหรับมือใหม่อย่างผมคุณสามารถมองเห็นสิ่ง -rP หมายถึงที่นี่: cs.elte.hu/zsh-manual/zsh_17.html ปรากฏว่าprintเป็นคำสั่งเฉพาะของ ZSH และ Googling "linux print" ไม่ให้ผลลัพธ์ที่ดีมาก
MikeWyatt

printเป็นส่วนหนึ่งของ zsh man zshbuiltinsคุณสามารถดูความช่วยเหลือสำหรับมันใน Bash มีความสามารถเทียบเท่ากัน แต่ฉันไม่แน่ใจว่าสามารถใช้งานร่วมกันได้
Jim Stewart

10

เกี่ยวกับบางสิ่งเช่นนี้:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"

ฉันชอบวิธีนี้ดีกว่าคำตอบที่ยอมรับ มันเป็นแบบพกพามากขึ้นและช่วยให้ฉันรักษาสคริปต์เดียวกันระหว่างสภาพแวดล้อม zsh และทุบตีของฉัน
verboze
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.