วิธีเริ่มต้น XTerm ด้วยพรอมต์ที่ด้านล่าง?


12

เมื่อเริ่มต้น XTerm พรอมต์จะเริ่มที่บรรทัดแรกของเทอร์มินัล เมื่อรันคำสั่งพรอมต์จะเลื่อนลงมาจนกระทั่งถึงด้านล่างและจากนั้นจะอยู่ที่นั่น (ไม่ใช่แม้กระทั่งShift- Page Downหรือเมาส์สามารถเปลี่ยนได้) แทนที่จะเริ่มต้นอายุการใช้งานเทอร์มินัลให้เป็น "พิเศษ" การแจ้งเตือนควรอยู่ที่ด้านล่างของเครื่อง โปรดทราบว่าฉันมีหลายคู่สายพร้อมท์

แน่นอนว่ามันควรจะทำงานได้เหมือนเดิม (ปรับขนาดเลื่อนได้ไม่มีบรรทัดใหม่ที่ไม่จำเป็นในเอาต์พุตและไม่มีเอาต์พุตหายไปอย่างลึกลับ) ดังนั้นPROMPT_COMMAND='echo;echo;...'หรือคล้ายกันไม่ใช่ตัวเลือก การแก้ปัญหาไม่ควรเป็นแบบเฉพาะเชลล์

แก้ไข: วิธีการแก้ปัญหาในปัจจุบันในขณะที่ทำงานในกรณีที่เรียบง่ายมีไม่กี่ประเด็น:

  • มันทุบตีที่เฉพาะเจาะจง ทางออกที่ดีควรพกพาไปหากระสุนอื่นได้
  • มันล้มเหลวถ้ากระบวนการอื่น ๆ PS1ปรับเปลี่ยน ตัวอย่างหนึ่งคือ virtualenv ซึ่งจะเพิ่ม(virtualenv)ที่จุดเริ่มต้นของPS1ซึ่งก็มักจะหายไปเพียงแค่ครึ่งหน้าบน
  • Ctrl- lตอนนี้ลบหน้าสุดท้ายของประวัติศาสตร์

มีวิธีที่จะหลีกเลี่ยงปัญหาเหล


อย่างไรก็ตามเราจำเป็นต้องแนะนำตัวอักษรว่างในบัฟเฟอร์ของแถบเลื่อนของ Xterm
SHW

3
ที่จริงแล้วพรอมต์สามารถย้ายกลับไปด้านบนได้อย่างง่ายดายในเวลาใดก็ได้โดยดำเนินการclearคำสั่ง
Werediver

@SHW ฉันหวังว่าจะมีการตั้งค่านี้มากกว่าแฮ็ค การแฮ็ก Terminal มีแนวโน้มที่จะแนะนำข้อบกพร่องที่ลึกซึ้งมากในประสบการณ์ของฉัน
l0b0

@ ผู้ส่งมอบ แต่ฉันไม่เคยต้องการให้อยู่ด้านบน
l0b0

1
เนื่องจากเชลล์เท่านั้นที่รู้ว่าเมื่อใดที่เอาต์พุตพร้อมต์โซลูชันใด ๆ จึงต้องอยู่ในบริบทของเชลล์ แม้แต่การปลอมแปลง XTerm ก็ยังไม่ช่วยเพราะ XTerm ไม่ทราบว่าสิ่งที่ขอให้ส่งออกนั้นเป็นพรอมต์หรือไม่ สำหรับเทอร์มินัลเชลล์พรอมต์เป็นเพียงลำดับอักขระอื่นไม่แตกต่างจากลำดับอักขระอื่นใดที่อาจได้รับ
celtschk

คำตอบ:


11

หากใช้bashสิ่งต่อไปนี้ควรใช้เคล็ดลับ:

TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"

หรือ (มีประสิทธิภาพน้อยลงเนื่องจากจะรันหนึ่งtputคำสั่งก่อนแต่ละพรอมต์ แต่ทำงานหลังจากปรับขนาดหน้าต่างเทอร์มินัล):

PS1='\[$(tput cup "$LINES")\]'$PS1

เพื่อป้องกันtputการเปลี่ยนรหัสออกคุณสามารถบันทึกและรีเซ็ตได้อย่างชัดเจน:

PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1

โปรดทราบว่าตัวแปรretvalนั้นเป็นแบบโลคัล ไม่ส่งผลกระทบต่อretvalตัวแปรใด ๆ ที่คุณอาจนิยามไว้เป็นอย่างอื่นในเชลล์

เนื่องจากcupความสามารถของเทอร์มินัลส่วนใหญ่เหมือนกัน\e[y;xHคุณสามารถฮาร์ดโค้ดได้:

PS1='\[\e[$LINES;1H\]'$PS1

หากคุณต้องการให้ปลอดภัยกับการรีเซ็ต PS1 ในภายหลังคุณสามารถใช้PROMPT_COMMANDตัวแปรได้ หากตั้งค่ามันจะทำงานเป็นคำสั่งก่อนที่พรอมต์จะส่งออก ดังนั้นเอฟเฟกต์สามารถทำได้โดย

PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'

แน่นอนในขณะที่ตั้งค่าPS1จะไม่ส่งผลกระทบต่อนี้บางซอฟต์แวร์อื่น ๆ PROMPT_COMMANDยังอาจมีการเปลี่ยนแปลง


วิธีtputแตกต่างจากหลายechoคำสั่ง? (สอบถามจากความอยากรู้)
SHW

@ l0b0 อาจไม่สมควรได้รับคำตอบแยกต่างหาก ฉันหวังว่า celtschk จะไม่คิดว่าฉันจะแก้ไขคำตอบของเขา / เธอ
Stéphane Chazelas

'\[$(tput cup "$LINES")\]' ผลงานที่สวยงาม ขอบคุณ!
l0b0

มีปัญหากับเป็นtput: $exit_codeมันน่าจะรีเซ็ต คงที่\[\e[$LINES;1H\]โดยใช้
l0b0

1
@ l0b0: ตอนนี้ฉันได้เพิ่มรุ่นโดยใช้tputที่รักษารหัสการออก
celtschk

4

เพื่อลดความซับซ้อนของคำตอบก่อนหน้าเล็กน้อยฉันพบว่าง่ายกว่าที่จะเรียกใช้:

tput cup $LINES

ในการเริ่มต้นของหรือ.bashrc .zshrcมันแค่ทำงาน

ข้อดี:

  • มันจะพิมพ์เพียงครั้งเดียวเมื่อคุณเริ่มเปลือกของคุณ

จุดด้อย:

  • เมื่อล้างหน้าจอด้วย ^ L จะไม่พิมพ์และใช้นามแฝงclearว่าclear; tput ...ไม่ช่วย
  • ให้ย้ายไปที่อื่นเมื่อปรับขนาดเทอร์มินัล

2

คำตอบที่ใช้$LINESนั้นไม่สามารถพกพาได้โดยไม่จำเป็น ในฐานะที่ทำในresizeคุณก็สามารถขอxtermการตั้งตำแหน่งไปยังหมายเลขบรรทัดขนาดใหญ่โดยพลการเช่น

tput cup 9999 0

(สมมติว่าคุณมีหน้าต่างเล็กกว่า 10,000 บรรทัดโดยไม่คำนึงถึงscrollback )

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

TPUT_END=$(tput cup 9999 0)

และหลังจากนั้น

PS1="${TPUT_END} myprompt: "

ตามความต้องการของคุณ

สำหรับการปรับเปลี่ยนกระบวนการอื่น ๆPS1: คุณจะต้องคำนวณใหม่PS1หลังจากการเปลี่ยนแปลงเหล่านั้นเพื่อให้แน่ใจว่าจะมีลักษณะตามที่คุณต้องการ แต่มีรายละเอียดไม่เพียงพอในคำถามที่จะชี้ให้เห็นว่าจะทำการเปลี่ยนแปลงอย่างไร

และในที่สุด: พฤติกรรมการเติมแท็บไม่ได้สอดคล้องกับการเปลี่ยนแปลงแบบนี้เนื่องจากสมมติฐานของ bash


คุณหมายถึงอะไรโดย "พฤติกรรมการเติมแท็บไม่ได้สอดคล้องกับการเปลี่ยนแปลงประเภทนี้"?
l0b0

ฉันคิดว่าคุณหมายถึงPS1="${TPUT_END} myprompt: "หรือแม้กระทั่งPS1="${TPUT_END}${PS1}"
l0b0

สำหรับหลัง - ขวา (พิมพ์ผิดจากการคิด makefiles) สำหรับก่อนหน้านี้ฉันจำได้ว่าการแก้ไขคำสั่งของ bash นั้นขึ้นอยู่กับความสามารถในการพิมพ์บรรทัดใหม่อีกครั้ง (พร้อมท์) และคุณสามารถได้รับพฤติกรรมแปลก ๆ เมื่อรวมกับการเลื่อนเนื่องจากคำสั่งเสร็จ
Thomas Dickey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.