สามารถแทนที่ช่องว่าง / พื้นหลังในเทอร์มินัลด้วยรูปแบบแบบสุ่ม (แต่สวย) ของอักขระ ASCII ได้หรือไม่?


23

บริบทและคำถาม

มีหลายวิธีในการปรับสีเทอร์มินัลและสภาพแวดล้อมเชลล์ เอาต์พุตของคำสั่งแต่ละคำสั่งเช่นlsและgrepยังสามารถทำให้เป็นสี ไม่เกี่ยวข้องโดยตรง แต่ที่น่าสนใจอย่างไรก็ตามความคิดของการเล่นสื่อที่คอนโซลแต่ดูเหมือนจะอาศัยกรอบ (ห้องสมุด) บางส่วนที่ด้านบนของระบบหน้าต่าง คำถามต่อไปนี้มุ่งที่bashเชลล์เท่านั้นและการนำไปใช้ในกรอบงานเทอร์มินัล Linux และการสนับสนุน

โปรดพิจารณาการตัดต่อ ASCII ของ "การเรนเดอร์" ของฉากหนึ่งในเกม 2D :

ฉากธรรมชาติ (ต้นไม้พุ่มไม้ดอกไม้หญ้า) จากเกมป้อมปราการ Dwarf - 2 หน้าจอแรกแสดงเกมที่ไม่มีชุดไพ่ (ASCII เท่านั้น) หน้าจอที่สามสร้างด้วยชุดไพ่ Vherid หน้าจอถัดไป 2 ที่สร้างขึ้นด้วย ชุดไพ่ CLA และหน้าจอสุดท้ายสร้างขึ้นด้วยชุดไพ่ Jolly Bastion

นี่ไม่ใช่ฉากที่สร้างแบบสุ่ม กลุ่มที่ฉันเลือกทั้งหมดแสดงให้เห็นถึงรูปแบบของภูมิประเทศ "ทุ่งหญ้า" (ต้นไม้พุ่มไม้และพุ่มไม้ดอกไม้หญ้า ฯลฯ ) จากเกมที่ใช้อักขระ ASCII เพื่อเป็นตัวแทนวัตถุดังกล่าว 4 ฉากสุดท้ายที่ผู้ใช้แสดงสร้างชุดไพ่เรียงซึ่งโดยทั่วไปแล้วเป็นตัวละคร ASCII ที่มีสเปคสี (รายละเอียดดังกล่าวไม่สำคัญ - ก็เพียงพอแล้วที่จะบอกว่านี่เป็นแรงบันดาลใจทางสายตาสำหรับสิ่งที่ฉันพยายามทำให้สำเร็จในแง่ภาพและ " รูปแบบ ")

คุณสมบัติทั่วไปฉากเหล่านั้นในการตัดต่อแบ่งปันคือ:

  • มากที่สุด 5-6 ตัวอักษร ASCII ที่แตกต่างกัน (เครื่องหมายจุลภาค, เครื่องหมายคำพูดและอื่น ๆ )
  • ใช้ 2-4 สี
    • สำหรับตัวละคร
    • สำหรับพื้นหลังของตัวละครในบางกรณี - ตัวอย่างสุดท้ายคือการแสดงการใช้เฉดสีที่มีอักขระน้อยหรือไม่มีเลยเพื่อสร้างรูปแบบเช่นโมเสกสี

สิ่งที่ฉันมีใน VM ในขณะนี้คือArch Linuxและแม้ว่าคำถามจะไม่เจาะจงเฉพาะฉันได้ดูเอกสารประกอบของพวกเขาสำหรับการปรับแต่ง/etc/bash.bashrcไฟล์ ฉันสามารถเห็นได้ว่าการอธิบายจำนวนมากไปสู่การกำหนดค่าลักษณะที่ปรากฏของพรอมต์และโดยทั่วไปองค์ประกอบส่วนหน้าทั้งหมด มีข้อมูลเล็กน้อยเกี่ยวกับการกำหนดค่าใด ๆ สำหรับพื้นหลังยกเว้นปกติสำหรับสีทึบเช่นการตั้งค่าและเคล็ดลับเหล่านี้:

# Background
On_Black='\e[40m'       # Black
On_Red='\e[41m'         # Red
On_Green='\e[42m'       # Green
On_Yellow='\e[43m'      # Yellow
On_Blue='\e[44m'        # Blue
On_Purple='\e[45m'      # Purple
On_Cyan='\e[46m'        # Cyan
On_White='\e[47m'       # White

ฉันยังไม่เข้าใจว่าอะไรคือพื้นที่ว่าง / ว่าง / พื้นหลังที่ฉันไม่ได้พิมพ์เมื่อฉันใช้คอนโซลนั่นคือ "สิ่งที่พวกเขาทำมาจากอะไร" เพื่อที่จะพูด โดยเฉพาะอย่างยิ่งผู้ที่ไม่พร้อมรับคำและที่ล้อมรอบคำสั่งที่สะท้อน ในส่วนที่เกี่ยวกับสิ่งที่เกิดขึ้นบน line ที่ใช้งานอยู่มันเป็นไปได้ที่จะแสดงให้เห็นว่าbashทำหน้าที่ในลักษณะ "line-oriented" และการดำเนินการบางอย่างทำให้เกิดการเคลียร์ line ที่ใช้งานอยู่ ( for i in $(seq 1 $(expr $(tput lines) \* $(tput cols))); do echo -n M; done; tput cup 15 1จากนั้นให้พิมพ์ char และ backspace ผู้สนับสนุน) - ขอบเขตที่อาจแตกต่างจาก CLI ไปยังอีกอย่างหนึ่งคือ zsh นอกจากนี้ดูเหมือนว่าเมื่อฉันเพิ่มบางสิ่งบางอย่างเช่น\[\033[44m\]สาย PS1 ของฉันในbash.bashrcฉันได้รับพื้นหลังสีฟ้าหลังจากโหลดทุบตี - ดังนั้นฉันรู้ว่ามีบางอย่างใช้ประโยชน์จากที่นี่มากกว่าลักษณะที่ปรากฏของเอาท์พุทตราบเท่าที่พื้นหลังเป็นห่วง

แต่ฉันก็รู้ด้วยว่า bash เป็นซอฟต์แวร์ที่อาศัยสิ่งอำนวยความสะดวกอื่น ๆ ในรูปแบบของระบบย่อย TTYเพื่อนำสิ่งต่าง ๆ มาสู่หน้าจอและสิ่งนี้ลดลงจากที่นั่นไปยังส่วนประกอบ VTในเคอร์เนลที่ฉันคิด pstree -Apใน Arch แสดงให้เห็นsystemdการเชื่อมโยงไปแล้วloginbash

การกระจายArch Linuxอาศัยagettyการบริการ TTY วิecho $TERMจะให้ชนิดของเทอร์มินัลที่ใช้งานอยู่ ("linux" ที่นี่ด้านนอกของ DE) และinfocmp[-d spec1 spec2]คำสั่งที่ไม่มีพารามิเตอร์แสดงความสามารถของเทอร์มินัลที่ใช้งานและข้อมูลโปรไฟล์จากฐานข้อมูลเทอร์มินัล terminfo (5) :

# Reconstructed via infocmp from file: /usr/share/terminfo/l/linux
linux|linux console,
am, bce, ccc, eo, mir, msgr, xenl, xon,
colors#8, it#8, ncv#18, pairs#64,
acsc=+\020\,\021-\030.^Y0\333'\004a\261f\370g\361h\260i\316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l\E[?1c,
clear=\E[H\E[J, cnorm=\E[?25h\E[?0c, cr=^M,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
cvvis=\E[?25h\E[?8c, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
el1=\E[1K, flash=\E[?5h\E[?5l$, home=\E[H,
hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
il=\E[%p1%dL, il1=\E[L, ind=^J,
initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,
kb2=\E[G, kbs=\177, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B,
kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, kend=\E[4~, kf1=\E[[A,
kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~,
kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~,
kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~,
kmous=\E[M, knp=\E[6~, kpp=\E[5~, kspd=^Z, nel=^M^J, oc=\E]R,
op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E[10m,
rmam=\E[?7l, rmir=\E[4l, rmpch=\E[10m, rmso=\E[27m,
rmul=\E[24m, rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm,
setaf=\E[3%p1%dm,
sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
sgr0=\E[0;10m, smacs=\E[11m, smam=\E[?7h, smir=\E[4h,
smpch=\E[11m, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?6c, u9=\E[c,
vpa=\E[%i%p1%dd,

ความสามารถหลายอย่างสามารถยกระดับจากเทอร์มินัลเฟรมเวิร์กและเป็นคุณสมบัติที่เปิดเผยในไฟล์กำหนดค่า bash.bashrc ตราบเท่าที่พร้อมท์ถูกปรับแต่งโดยการตั้งค่าตัวแปร PS1 ลำดับการควบคุมและหลบหนีถูกใช้เพื่อขัดจังหวะการไหลของอักขระที่แสดงในเทอร์มินัลโดยทั่วไปเพื่อจัดหาฟังก์ชันรวมถึงการย้ายเคอร์เซอร์และความสามารถอื่น ๆ ที่อธิบายไว้ในฐานข้อมูลข้อมูลเทอร์มินัล ฟังก์ชันเหล่านั้นจำนวนมากถูกส่งผ่านโดยใช้ตัวควบคุมลำดับที่รู้จักกันดีESC[(หรือ \ 33) (ลำดับเพิ่มเติมที่นี่และที่นี่และตัวอย่างบางส่วน) นอกจากนี้ยังเป็นไปได้ที่จะใช้tputยูทิลิตี้โดยตรงบน CLI เพื่อเปลี่ยนคุณสมบัติของเทอร์มินัล; เช่นtput setab 4จะมีคำสั่ง bash echo บนพื้นหลังสีน้ำเงิน

หากเราstrace bashเราสามารถเห็นทั้งลำดับการหลบหนีและพฤติกรรมในการดำเนินการ:

write(2, "[il@Arch64vm1 ~]$ ", 19[il@Arch64vm1 ~]$ ) = 19  //bash starts
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, " ", 1) = 1                                 //pressed <space>
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, " ", 1 ) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "\177", 1) = 1                              //pressed <backspace>...
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "\10\33[K", ) = 4                          //triggers erasing the line
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "\33", 1) = 1                               //pressed <esc> per se

สิ่งนี้ให้บริบทสำหรับคำถามสามารถแทนที่ช่องว่าง / สีพื้นหลังในเทอร์มินัลด้วยชุดอักขระ ASCII แบบสุ่ม (แต่สวย) ได้หรือไม่ แต่ไม่ทราบว่าจะใช้งานคุณลักษณะต่าง ๆ หรือสิ่งที่ฉันกำลังค้นหาในเครื่องเทอร์มินัลได้อย่างไร

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

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

โดยทั่วไป "ช่องว่าง" ในเทอร์มินัลจะเต็มไปด้วยรูปแบบ (ที่นี่ฉัน "ไทล์" หนึ่งในภาพจากด้านบน แต่ฉันต้องการในการใช้งานจริงสำหรับแต่ละ "ว่าง" ที่จะสร้างแบบสุ่มจากชุดของ อักขระและคุณลักษณะ 5-6 ตัวบันทึกจากการตัดต่อซึ่งจะระบุ) มีรูปแบบที่แตกต่างกันสำหรับบรรทัดคำสั่งที่ใช้งานอยู่นั่นคือ "น้ำ" เป็นคลื่น แต่ฉันจะชำระให้บรรทัดนั้นเป็นสีน้ำเงิน ตามที่จินตนาการไว้คำสั่งจะ "ลบ" "น้ำ" ตามที่พวกเขาพิมพ์ลงบนสายที่ใช้งานอยู่และแน่นอนว่าข้อ จำกัด คือรูปแบบของตัวละครที่ไม่เคยตีความโดย CLI มิฉะนั้นมันจะไร้ประโยชน์

ดังนั้นจึงมีการกำหนดค่าใด ๆ ที่เปิดเผยในbashหรือในกรอบเทอร์มินัลที่เหมาะสมหรือสคริปต์ที่จะอนุญาตให้ใช้ชุดของตัวละครและการควบคุมบางสีเพื่อปรับเปลี่ยนเอาต์พุตของ bash ในเทอร์มินัลเพื่อสร้างรูปแบบที่ค่อนข้างสุ่มสำหรับพื้นหลัง (ซึ่งจะคล้ายกับสิ่งที่ฉันได้แสดงไว้ข้างต้น)? หรือฉันควรจะทำอะไรบางอย่างเช่นพยายามที่จะให้ภาพเต็มรูปแบบเป็นพื้นหลังสำหรับ tty ?

การใช้งาน

0.1 - รุ่น PatternOTD (หนึ่งนัดตกลงเมื่อคุณเข้าสู่ระบบ)

นิพจน์ต่อไปนี้ที่ฉันเพิ่มลงในไฟล์. bashrc ของฉันรวบรวมแนวคิดบางอย่างที่เราสำรวจและถือเป็นการพิสูจน์แนวคิดขั้นพื้นฐาน (มาก) สำหรับภาพในเทอร์มินัล linux มาตรฐาน:

for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[32;32m'$(tr -dc '",.;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 15; tput setab 4; echo -en "\E[2K"; tput setab 0

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

ข้อสังเกต

  • เห็นได้ชัดว่ามันเป็นเพียงคำสั่งจึงไม่ขัดขืนนั่นคือมันจะเลื่อนออกไปตามคำสั่งที่พิมพ์
  • เลือกที่จะไม่สุ่มเลือกตัวละครเช่น head -c 1การtput colsคูณบรรทัดที่จะเริ่มต้นด้วยซึ่งจะพิมพ์อักขระสุ่มแต่ละตัวจากการเลือกที่ยกมา - เพราะมันช้าเกินไป ฉันไม่คิดว่าrandomจะสร้างจำนวนเต็ม (tput cols) แต่ก็ยังเร็วกว่า แน่นอนนี่มันสิ้นเปลืองอย่างมาก แต่ก็ใช้งานได้
  • ยังไม่ได้สุ่มสีหรือเอฟเฟกต์ใด ๆ ต่อตัวละครหรืออย่างอื่นยกเว้นสีเขียวนั้นเพราะฉันอธิบายการเรนเดอร์ / ประมวลผลถ่านแต่ละตัวช้าเกินไป Re: framebuffer หรือไม่
  • ฉันยินดีที่จะเห็นว่ารูปแบบดังกล่าวไม่ได้รบกวนการใช้งาน CLI ในแง่ที่ไม่ได้ตีความโดย CLI! (ทำไมถึงอธิบายไม่ได้)
  • น้ำหายเร็วเกินไป! ;-)

0.2 - งานแฮ็ก PROMPT_COMMAND

ค่าของตัวแปรPROMPT_COMMANDจะถูกตรวจสอบก่อนที่ Bash จะพิมพ์พรอมต์หลักแต่ละรายการ ฉันรู้ว่าปกติคุณจะใช้ตัวแปรเพื่อเรียกสคริปต์ที่คุณสามารถประมวลผลองค์ประกอบจากการแสดงผล ฯลฯ แต่ฉันค่อนข้างพยายามทำโดยตรงในไฟล์. bashrc ของฉัน ตอนแรกผมคิดว่าผมสามารถใช้บางส่วนเช่นการรับรู้ตำแหน่งที่เป็นเคอร์เซอร์ก่อนที่จะดำเนินการ (ดังนั้นฉันจะไปทำให้สิ่งที่อยู่บนหน้าจอที่มีทุกที่tputแล้วกลับมาที่ตำแหน่งที่ผมเป็นมาก่อนโดยใช้บางสิ่งบางอย่างเช่นนี้ไปยังตำแหน่งที่สารสกัดจาก:

stty -echo; echo -n $'\e[6n'; read -d R x; stty echo; echo ${x#??}  //value is in x;x format so...

cut -f1 -d";"ฉันจะท่อค่า ฉันสามารถทำสิ่งนี้ได้บน CLI แต่การทำให้งานนี้เป็นไปตามลำดับขององค์ประกอบในตัวแปร PS1 / P_C ไม่สามารถเข้าถึงได้ในขณะนี้และเป็นไปได้ว่าคำสั่งใดก็ตามที่ใส่ใน PROMPT_COMMAND อาจไม่ได้รับการประเมิน เพียงครั้งเดียว (?) แม้จะถูกประหารชีวิตทุกครั้ง (ดูข้อสังเกตด้านล่าง)

ดังนั้นสิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือดำเนินการตามลำดับเริ่มต้นของฉันและเพิ่มคำสั่งบางอย่างให้กับทั้ง PROMPT_COMMAND และคำจำกัดความของตัวแปร PS1 ใน. bashrc ชอบมาก

PROMPT_COMMAND="echo -en '\E[32;32m'$(tr -dc ',.:~' < /dev/urandom | head -c $(echo "$[$(tput cols) * 2]"))"

PS1="$(echo -en '\n') $(tput setab 4)$(echo -en "\E[2K")$(tput setab 0)\[\033[7;32m\]df:\[\033[1;34m\] \W @d \[\033[0m\]\e[32m"

for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[32;32m'$(tr -dc '",.;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 1; tput setab 4; echo -en "\E[2K"; tput setab 0

โดยสรุปฉันใช้ P_C เพื่อพยายามใช้รูปแบบภาพที่คงอยู่นั่นคือเพิ่ม 2 บรรทัด น่าเสียดายที่ฉันไม่สามารถสร้างทั้งสองรูปแบบนี้ได้ในขณะที่ย้ำเคล็ดลับ "น้ำ" ของฉันซ้ำนั่นคือการมีสีน้ำเงินเส้นที่ใช้งานอยู่ (ซึ่งเพิ่งเปลี่ยนสีพื้นหลังทำเส้นชัดเจนแล้วเปลี่ยนพื้นหลังกลับเป็นสีดำ) ฉันได้รวบรวมรูปภาพเพื่อแสดงว่าสิ่งนี้เล่นด้วยกันได้อย่างไร:

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

ข้อสังเกต

  • การใช้ Backspace บนบรรทัดยังคงทำให้เกิดการทำงานของเส้นที่ชัดเจนและสีฟ้าหายไป
  • ทุกครั้งที่กดปุ่ม Enter เรามีรูปแบบ 2 บรรทัดก่อนบรรทัดที่ใช้งานใหม่
  • แน่นอนว่าเมื่อเราเห็นเพิ่มเติมแม้จะมีบรรทัดเพิ่มเติมเราไม่ได้ห่อรูปแบบที่ด้านข้างของคำสั่งเช่น ls
  • / dev / urandom ของสุ่มดูเหมือนจะไม่สุ่มเมื่อเรียกที่นี่ใน P_C ภาพนี้สร้างขึ้นจาก 2 ภาพ แต่มันง่ายที่จะรับว่ารูปแบบ 2 บรรทัดเพิ่มเติมนั้นจะเหมือนกันเสมอนั่นคือการสุ่มไม่ได้เกิดขึ้นทุกครั้งที่กดปุ่ม Enter แต่เพียงครั้งเดียวสำหรับแต่ละสองบรรทัด - อาจเป็นเพียงภาพแรกเท่านั้น .bashrc bashเวลาจะถูกอ่านโดย
  • เนื้อหาของตัวแปร PS1 เริ่มต้นด้วย$(echo -en '\n') $(tput setab 4)- นั่นคือพื้นที่ตรงกลางตรงนั้นก่อน $ (tput ... ), มันต้องอยู่ที่นั่นเพื่อให้มันใช้งานได้ ไม่เช่นนั้นเส้นสีฟ้าจะปรากฏขึ้นที่ด้านบนของพรอมต์และไม่ใช่ด้านหน้าและฉันไม่สามารถแก้ไขได้ และแฮ็คนี้เป็นชื่อที่ให้ 0.2 :)

0.3 - tput cuu&tput cud

for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[0;32m'$(tr -dc '",.o;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 1

PROMPT_COMMAND="echo -en '\033[0;32m$(tr -dc ',;o.:~' < /dev/urandom | head -c $(tput cols))\n\033[36;44m$(tr -dc '~' < /dev/urandom | head -c $(tput cols))\033[0;32m$(tr -dc ',.o+;:~' < /dev/urandom | head -c $(tput cols))'$(tput cuu 2)"

PS1="\[\033[0m\] \[\033[1;32m\][1]\[\033[7;32m\]=2=:\W)\[\033[0;32m\]=3=\[\033[1;32m\]=4=@>\[\033[0;32m\]"

สิ่งที่ทำกับ PROMPT_COMMAND คือรูปแบบ 3 บรรทัดถูกพิมพ์ทุกครั้งก่อนที่จะสร้างพรอมต์และชุดรูปแบบทั้งสามชุดนั้นถูกสร้างขึ้นแยกกันภายใต้ข้อ จำกัด ที่อธิบายไว้ในข้อ 0.2 - ไม่มีความหมายสำหรับน้ำ จากนั้นเราขึ้นไปสองบรรทัด (โดยใช้tput cuu 2) และสร้างพรอมต์บนเส้นกลางตาม PS1 เรายังคงมีชุดคำสั่งเริ่มต้นสำหรับรูปแบบเต็มหน้าจอในโหลด bashrc ซึ่งจะดำเนินการเพียงครั้งเดียวเมื่อเราเข้าสู่ระบบเทอร์มินัล ตอนนี้เรามีช่องว่างรอบ ๆ สายที่ใช้งานซึ่งมีรูปแบบสีน้ำเงินของตัวเองซึ่งจะได้รับการทำซ้ำเสมอเมื่อมีรถกลับ เนื้อหาของตัวแปร PS1 และ P_C ถูกทำให้สะอาด ไวยากรณ์ของลำดับ escape และการเข้ารหัสสีที่ฝังอยู่ภายในความยาวechoลำดับอาจเป็นเรื่องยุ่งยาก ข้อผิดพลาดนำไปสู่พฤติกรรมของเทอร์มินัลแปลกรวมถึงบรรทัดที่เขียนทับกันข้อความแจ้งที่ปรากฏจากระยะขอบด้านซ้ายหรือผลลัพธ์ที่ผิดปกติไปยังเนื้อหาที่ได้รับการประมวลผลโดยไม่ได้ตั้งใจ มีเงื่อนไขกับสิ่งที่ฉันทำซึ่งต้องใช้พื้นที่พิเศษภายในตัวแปร PS1 เพื่อตอบโต้ความแตกต่างทางภาพระหว่าง linux terminal และ lxterm ด้วยการตั้งค่าของฉัน (Arch Bang) หากไม่มีช่องว่างเพิ่มเติม linux terminal จะพิมพ์ตัวอักษรแรกของพรอมต์ที่ท้ายบรรทัดสุดท้ายด้วยเหตุผลบางอย่างที่ฉันไม่สามารถเข้าใจได้ (แน่นอนว่ามันเป็นสิ่งที่ฉันทำและไม่ใช่พฤติกรรมเริ่มต้น) ยังไม่สามารถหาวิธีสร้างเอฟเฟกต์แบบสุ่ม (ตัวหนาอินเวอร์สและอื่น ๆ ) ให้กับชุดของตัวอักษรในเครื่องหมายอัญประกาศเนื่องจากมีการตัดสินใจก่อนเพื่อสร้างสตริงที่ยาวขึ้นเพื่อเพิ่มประสิทธิภาพ

รูปแบบเริ่มต้นเมื่อเทอร์มินัลเปิด ป้อนคำอธิบายรูปภาพที่นี่

พฤติกรรมหลังจากclearและกดปุ่มป้อนอย่างต่อเนื่องที่พรอมต์ ป้อนคำอธิบายรูปภาพที่นี่

ข้อสังเกต

  • ควรได้รับการออกแบบใหม่หรือปรับเปลี่ยนเพื่อใช้ colorizing ลวดลายที่เกินกว่าที่จะทำได้เป็นจำนวนมาก
  • การเริ่มรู้สึกว่าการก้าวไปไกลกว่านั้นจะต้องมีการวางสิ่งเหล่านั้นลงในสคริปต์หรือใช้ประโยชน์จากรูปแบบที่สูงขึ้น แต่ความสามารถของเทอร์มินัลค่อนข้างเปิดใช้งานสำหรับผู้ใช้ (เตือนฉันถึง "โลโก้")!

20
ฉันกลัวเล็กน้อยที่คุณต้องการทำสิ่งนี้ :-)
Chris Down

2
@ Chris Down เป็นฉันจริง ๆ หลังจากเสร็จสิ้นการ Q มากดังนั้นฉันเกือบไม่ได้โพสต์;) มันเป็นนิสัย แต่ฉันเชื่อว่าคำตอบสามารถนำข้อมูลเชิงลึกบางอย่างในสิ่งที่แสดงใน terminal และไม่ว่าจะเกินกำหนดค่าและ ในการกำหนดซอฟต์แวร์ใหม่หรือไม่ และเทศกาลวันหยุดฉันเดา!

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

คุณกำลังพยายามทำสิ่งนี้ให้สำเร็จในคอนโซลข้อความหรือบนตัวเฟรมเฟรมหรือไม่? หรือบางทีคุณอาจต้องการสนับสนุน xterm ด้วย?
Ruslan

@ Ruslan บางทีทั้งสองเพื่อความสมบูรณ์หรือไม่ ฉันเห็นว่า SDL ใช้ framebuffer จากสิ่งที่ฉันเข้าใจและเกมที่ฉันอ้างถึงใช้เฟรมเวิร์กนี้ ในอีกทางหนึ่งคำถามของฉันมีไว้เพื่อแสดง internals คลาสสิกของกรอบ terminal ฉันเดา เมื่อ bash ได้รับการปรับแต่งและองค์ประกอบส่วนหน้าเปลี่ยนแปลงด้วย bash.bashrc ไม่มีการใช้ framebuffer ดังนั้นฉันจึงสนใจใน "สิ่งที่ทำงานกับข้อความ" หรือวิธีอื่น ๆ ที่นำมาใช้เช่นไม่มีประสิทธิภาพหรือไร้เดียงสา เป็น สำหรับ xterm ตอนแรกฉันหมายถึงโซลูชันที่ไม่ต้องพึ่งพา X

คำตอบ:


6

0.5a - Cyan Tumbleweed Plains

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

Z1=$(echo -en '\xe2\x97\x98') #◘ 1
Z2=$(echo -en '\xe2\x95\x9a') #╚ 2
Z3=$(echo -en '\xe2\x95\x9c') #╜ 3
Z4=$(echo -en '\xe2\x95\x9d') #╝ 4
Z5=$(echo -en '\xe2\x95\x9e') #╞ 5
Z6=$(echo -en '\xe2\x95\x9f') #╟ 6
Z7=$(echo -en '\xe2\x96\x91') #░ 7
Z8=$(echo -en '\xe2\x96\x92') #▒ 8
Z9=$(echo -en '\xe2\x96\x93') #▓ 9
N1=$(echo -en '\xe2\x94\x80') #─ a
N2=$(echo -en '\xe2\x95\x92') #╒ b
N3=$(echo -en '\xe2\x95\x97') #╗ c
N4=$(echo -en '\xe2\x96\xb6') #▶d
N5=$(echo -en '\xe2\x94\xbc') #┼ e
N6=$(echo -en '\xe2\x94\xa4') #┤ f
N7=$(echo -en '\xe2\x95\xa1') #╡ g
Z11="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" //Z11 to Z13 not
Z12="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" // used here (see
Z13="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" //link)

echo -en $(tr -dcs ' ;",15bdef' ' ' < /dev/urandom | head -c $(echo -en "$[$(tput cols) * $(tput lines)]") | sed -e "s/1/$(echo -en "\033[0;36m$Z1\033[0m")/g" -e "s/5/$(echo -en "\033[0;32m$Z5\033[0m")/g" -e "s/b/$(echo -en "\033[1;36m$N2\033[0m")/g" -e "s/d/$(echo -en "\033[1;36m$N4\033[0m")/g" -e "s/e/$(echo -en "\033[0;32m$N5\033[1;32m")/g" -e "s/f/$(echo -en "\033[0;36m$N7\033[1;32m")/g"); tput cup 1
                 ^set^+^chars^ to implement from pool - here 1,5,b,d,e,f... so_________________________^add the appropriate sed subprocessing units for implemented chars i.e. first one we replace "1" with the value of $Z1 and apply color at the same time, then all the chars move down the pipe to all required blocks - we selected to implement 6 chars here so we have 6 sed blocks. 

[N.B. To remove the blank space from the pattern, remove it from both sets: tr -dcs ';",15bdef' '']

PS1="\[\033[1;36m\] $(echo -en '\xe2\x96\x91')$(echo -en '\xe2\x96\x92')$(echo -en '\xe2\x96\x93')[\t]$(echo -en '\xe2\x96\x93')$(echo -en '\xe2\x96\x92')$(echo -en '\xe2\x96\x91') \[\033[7;36m\]$(echo -en '\xe2\x97\x98')$(echo -en '\xe2\x94\xbc')$(echo -en '\xe2\x94\x80')\W$(echo -en '\xe2\x94\x80')\[\033[0;36m\]$(echo -en '\xe2\x94\x80')$(echo -en '\xe2\x94\x80')$(echo -en '\xe2\x94\x80')@$(echo -en '\xe2\x96\xb6')\[\033[0;36m\]"

PROMPT_COMMAND="echo -en '\033[0;36m$(tr -dc '=' < /dev/urandom | head -c $(tput cols))\n\033[01;46m$(tr -dc '~' < /dev/urandom | head -c $(tput cols))\033[0;36m$(tr -dc '=' < /dev/urandom | head -c $(tput cols))'$(tput cuu 2)"

การนำไปใช้นี้จะไม่แสดงผลต่อบรรทัดอีกต่อไป แต่จะพิมพ์ลำดับทั้งหมดในภาพเดียวเมื่อสิ้นสุดการsedประมวลผล สิ่งนี้จะปรากฏที่การเข้าสู่ระบบเพียงครั้งเดียวหรือโดยทั่วไปเมื่อbashเปิดตัว นี่คือรูปแบบการสุ่มที่เปิดตัว (เราสามารถเห็นสองเฉดสีเขียวและสีฟ้าสองสี):

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

หน้าจอแสดงผลใน terminal linux มาตรฐานและทำงานใน xterm ด้วย ฉันใช้ตัวอักษรรูปแบบใหม่เหล่านั้นบางส่วนในพรอมต์ PS1 ในขณะที่ PROMPT_COMMAND เพิ่งจะดูแลสายที่ใช้งานอยู่และช่องว่างภายใน 2 บรรทัดซึ่งใช้ตัวอักษรขนาด 1 ไบต์

รูปแบบยังตรงกับการกระจายปัจจุบันของฉันซึ่งเรียกว่าarchbey. bashrc:

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

มันอยู่ในช่วงคริสต์มาส! ไชโยคน :)


1
มันไม่ได้เป็นคำตอบที่ชัดเจนหรือการใช้งาน แต่มันเป็นเหตุการณ์สำคัญ! ;-)

มันอาจเป็นไปได้ที่จะใช้ประโยชน์จากพลังของห้องสมุดเช่นaalib - ดูaafireตัวอย่างaafire -driver curses -extended -gamma 1 -floyd_steinberg -random 5สำหรับอินโทรที่อบอุ่น

อย่าพลาดคำตอบนี้ซึ่งจัดการกับข้อ จำกัด ยูนิโคดที่เข้ารหัส utf8 ที่กล่าวถึงที่นี่ !!

4

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

เทอร์มินัลบางตัวสามารถมีรูปภาพเป็นพื้นหลังเหมือนกับ gterm แต่มันไม่ได้ทำโดยเปลือก


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