ทำไม ZSH ถึงลงท้ายด้วยเครื่องหมายเปอร์เซนต์ไฮไลต์?


46

ฉันพบสิ่งนี้ในบางโอกาสด้วยแอพพลิเคชั่นที่หลากหลาย ฉันมักจะคิดว่าเป็นเพราะผลผลิตถูกยกเลิกก่อน (ctrl + c เป็นต้น) หรือสิ่งที่คล้ายกันและ zsh เติมอักขระบรรทัดใหม่ แต่ตอนนี้ความอยากรู้อยากเห็นได้รับสิ่งที่ดีที่สุดของฉันเพราะมันดูเหมือนจะไม่ทำอย่างนี้

zsh

zsh

ทุบตี

ป้อนคำอธิบายรูปภาพที่นี่

Sequenceโปรแกรมเป็นสิ่งที่ฉันดึงออกมาจากหนังสือในขณะอ่านบน Java การรับรองและเพียงแค่ต้องการที่จะดูว่ามันจะรวบรวมและวิ่ง ฉันสังเกตเห็นว่ามันไม่ได้ใช้println()วิธีการจากSystem.outแพ็คเกจ / คลาส print()แต่มันใช้เก่าธรรมดา

การขาดอักขระขึ้นบรรทัดใหม่เป็นเหตุผลที่ทำให้ฉันได้รับสัญลักษณ์นี้หรือไม่?

คำตอบ:


57

ใช่เกิดขึ้นเพราะเป็น "บางส่วนของบรรทัด" และโดยการเริ่มต้นzsh ไปยังบรรทัดถัดไปเพื่อหลีกเลี่ยงการครอบคลุมมันมีพรอมต์

เมื่อบรรทัดบางส่วนถูกสงวนไว้โดยค่าเริ่มต้นคุณจะเห็นอักขระผกผัน + ตัวหนาที่ส่วนท้ายของบรรทัดบางส่วน: "%" สำหรับผู้ใช้ปกติหรือ "#" สำหรับรูท หากตั้งค่าพารามิเตอร์เชลล์ PROMPT_EOL_MARK สามารถใช้เพื่อกำหนดวิธีการแสดงจุดสิ้นสุดของบรรทัดบางส่วน


3
เพื่อทดสอบทำสิ่งนี้: print -n "this is a test"จากนั้นprint "this is a test"
SergioAraujo

5
ตอนนี้ฉันได้ใส่PROMPT_EOL_MARK=''. zshrc ของฉันเพื่อซ่อนความแตกต่างระหว่างการขึ้นบรรทัดใหม่หรือไม่บนเอาต์พุตคำสั่ง
geekQ

14

นั่นเป็นคุณสมบัติเฉพาะของzsh(และตอนนี้fishเช่นกัน) เพื่อให้คุณเห็นบรรทัดที่ไม่ถูกทำลายในเอาต์พุตของคำสั่งอย่างชัดเจน

ในเชลล์แบบดั้งเดิมหากคำสั่งแสดงผลข้อมูลบางส่วนหลังจากอักขระขึ้นบรรทัดใหม่ล่าสุดหรือกล่าวอีกนัยหนึ่งถ้ามันปล่อยเคอร์เซอร์เทอร์มินัลไม่อยู่ที่จุดเริ่มต้นของบรรทัดพรอมต์ถัดไปโดยเชลล์จะต่อท้ายกับบรรทัดที่ไม่สิ้นสุด ในขณะที่:

bash-4.4$ printf XXX
XXXbash-4.4$

mangles นั้นเป็นพรอมต์และมันง่ายที่จะพลาดที่XXXนั่นโดยเฉพาะถ้าคุณได้รับพรอมต์ที่ดีกว่าแบบนั้น นอกจากนี้ยังมีผลต่อการวางตำแหน่งเคอร์เซอร์ซึ่งทำให้เกิดความบกพร่องในการแสดงผลเมื่อคุณเลื่อนเคอร์เซอร์ไปมา

zshหลีกเลี่ยงปัญหาดังกล่าวด้วยการแสดงว่าเอาต์พุตมีบรรทัดที่ไม่ได้ระบุด้วย%อักขระในวิดีโอตัวหนาและย้อนกลับและออกพรอมต์ถัดไปที่จุดเริ่มต้นของบรรทัดถัดไป:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

มันทำเช่นนั้นโดยการแสดงผลวิดีโอย้อนกลับ%ที่ส่วนท้ายของทุกคำสั่ง (ก่อนแต่ละพรอมต์) แต่ตามด้วยช่องว่าง 79 ช่อง (สมมติว่าเทอร์มินัลกว้าง 80 อักขระ), ตัวอักษร CR (ตัวที่ทำให้เคอร์เซอร์ย้อนกลับไปที่ คอลัมน์) และลำดับที่จะลบไปยังจุดสิ้นสุดของบรรทัด (แล้วพรอมต์)

ด้วยวิธีนี้หากมีเส้นที่ไม่ถูกทำลายเนื่องจากเคอร์เซอร์ไม่อยู่ในตำแหน่งแรกอักขระ 80 ตัวเหล่านั้นจะทำให้เคอร์เซอร์เลื่อนไปที่บรรทัดถัดไป (และ%จะอยู่) ถ้าไม่เช่นนั้น%จะมีช่องว่าง 79 ช่องในหนึ่งบรรทัดซึ่งจะถูกลบหลังจากนั้น

ทีนี้ใช้งานได้ก็ต่อเมื่อเทอร์มินัลทำการตัดบรรทัด (ตัวอย่างเช่นซึ่งจะไม่ทำงานอย่างถูกต้องหลังจากนั้นtput rmam) หากคุณมีเทอร์มินัลช้า (เช่น 9600 baud serial line) คุณอาจเห็นว่า%มีการแสดงผลและถูกลบออกหลังจากแต่ละคำสั่งดังนั้นzshให้คุณปิดการใช้งานคุณสมบัติดังกล่าว:

unsetopt prompt_cr prompt_sp

ด้วยวิธีนี้zshจะทำตัวเหมือนเปลือกหอยแบบดั้งเดิมมากขึ้น

คุณยังสามารถเปลี่ยนเครื่องหมายนั้นด้วย$PROMPT_EOL_MARKตัวแปรได้

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