ทับซ้อนกันเป็นแนวยาวใน Bash PS1 ที่กำหนดเอง


13

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

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

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

แหล่งที่มาแบบเต็ม Github ที่นี่

ปัญหาคือเส้นยาวมักจะพันรอบตัวเองซึ่งหมายความว่าบรรทัดใหม่ทับซ้อนกับบรรทัดก่อนหน้า

ปัญหาไม่สอดคล้องกัน: บางบรรทัดถูกห่ออย่างถูกต้องบางบรรทัดไม่ถูกต้อง

ความคิดวิธีการแก้ไขปัญหานี้?

คำตอบ:


16

นี่คือ PS1 สองบรรทัดแฟนซีของฉันสำหรับ bash prompt

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

ดังนั้นนี่คือสิ่งที่ฉันทำ ถ้านี่คือสีของฉัน:

\e[1;32m

ฉันเปลี่ยนเป็น:

\[\e[1;32m\]

เป็นหลักคุณจะต้องใส่มันใน:

\[$mycolor\]

ชำระเงินคำตอบนี้


+1 ขอบคุณ ผิดปกติพอดูเหมือนว่าจะใช้งานไม่ได้บน mac
Adam Matan

คุณเป็นผู้ช่วยชีวิต! สำหรับ mac อดัม .. มันน่าจะเป็นเพราะคอลัมน์นับ ลองตั้งค่าพรอมต์ให้เป็นชุดอักขระเช่น 'นี่คือพรอมต์ของฉัน:' และดูว่าปัญหายังคงมีอยู่หรือไม่ ถ้าเป็นเช่นนั้นการตั้งค่าคอลัมน์ในเทอร์มินัลของคุณจะกว้างหรือแคบเกินไป
Alex Summers

7

พบวิธีแก้ปัญหานี้ทางออนไลน์ซึ่งแนะนำให้ใช้วงเล็บปิดกับตัวแปรสี:

เปลี่ยนสิ่งนี้:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

ถึง:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

ฉันยอมรับการเปลี่ยนแปลง - หวังว่าจะได้ผลตามที่คาดหวัง


1
ไม่แน่ใจว่าสิ่งนี้ควรจะบรรลุ คุณจำเป็นต้องตัดอะไรที่ไม่ใช้พื้นที่ (ANSI-หนี) ใน\[ \]เพื่อให้คุณไม่สามารถเพียงแค่จบทุกสี ANSI หนีด้วยเพราะสิ่งที่ถ้ามีไม่ได้เป็น\] \[เมื่อคุณใส่ตัวอักษรที่ไม่สามารถพิมพ์ได้คุณควรใส่ไว้ใน\[ \](เช่นPS1='\[\e[32;1m\] green prompt \[\e[0m\] $')
dylnmc

แน่นอน! หากไม่มีการเปิด \ [สิ่งนี้จะทำให้ผู้ใช้ Linux ใช้งานได้ทันที อาจแตกต่างกันสำหรับ OSX? ช่างแปลกเหลือเกิน \ [และ \ e [ถูกตีความว่าเป็นสองสิ่งที่แตกต่างกันสำหรับ linux ครั้งแรกบ่งชี้ว่าทุบตีว่าลำดับต่อไปนี้ไม่สามารถพิมพ์ได้และไม่นับเป็นส่วนหนึ่งของตัวละครที่ปรากฏของพรอมต์ \ e [เป็นตัวยึดการหลีกเลี่ยงเพื่อเริ่มโครงร่างสี ANSI
Alex Summers

0

ทางออกที่ต้องการของฉันในเรื่องของเส้นยาวทับซ้อนกันใน bash PS1 คือการมี\nจุดสิ้นสุดของบรรทัดพร้อมท์ PS1

เช่น

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

หากคุณต้องการสิ่งอื่น ๆ ของฉัน - เวลาผู้ใช้โฮสต์ไดเรกทอรีและสาขาสาขา (!) คุณสามารถใช้สิ่งนี้ (mac หรือ linux):

/unix//a/124012/10043


if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fiสาขาคอมไพล์ที่คุณควรใช้ นี่เป็นมาตรฐานเมื่อใส่คอมไพล์ลงในสคริปต์และประเมินชื่อสาขาจากสิ่งที่ฉันได้อ่านมาก่อนหน้านี้
dylnmc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.