Các không gian / nền trống trong thiết bị đầu cuối có thể được thay thế bằng một mẫu ký tự ASCII ngẫu nhiên (nhưng đẹp) không?


23

Bối cảnh và câu hỏi

Có nhiều cách để tô màu cho môi trường thiết bị đầu cuối và vỏ. Đầu ra của các lệnh riêng lẻ, chẳng hạn như lsgrep, cũng có thể được tô màu. Không liên quan trực tiếp nhưng dù sao cũng thú vị là khái niệm chơi phương tiện tại bàn điều khiển nhưng điều này dường như dựa vào một số khung (thư viện) trên đầu hệ thống cửa sổ. Câu hỏi sau đây chỉ hướng đến hệ bashvỏ và việc triển khai nó trong khung thiết bị đầu cuối Linux và nền tảng của nó.

Vui lòng xem xét cách dựng phim "kết xuất" sau đây của ASCII về một cảnh trong trò chơi 2D :

Khung cảnh thiên nhiên (cây, cây bụi, hoa, cỏ) từ trò chơi Pháo đài lùn - 2 màn hình đầu tiên hiển thị trò chơi không có ô (chỉ ASCII), màn hình thứ ba được tạo bằng ô Vherid, 2 màn hình tiếp theo được tạo bằng Bộ xếp CLA và màn hình cuối cùng được tạo bằng bộ xếp Jolly Bastion

Đây không phải là những cảnh được tạo ngẫu nhiên. Các phân đoạn tôi đã chọn thực sự mô tả một số dạng địa hình "đồng cỏ" (cây, bụi rậm & cây bụi, hoa, cỏ, v.v.) từ một trò chơi sử dụng các ký tự ASCII để thể hiện các đối tượng đó. 4 cảnh cuối cùng giới thiệu sử dụng làm tilesets mà cơ bản là một remap của các ký tự ASCII với thông số kỹ thuật màu sắc (chi tiết như là tầm thường - nó đủ để nói rằng đây là nguồn cảm hứng thị giác cho những gì tôi đang cố gắng để hoàn thành ở đây về mặt hình ảnh và " mẫu").

Các đặc điểm chung của những cảnh trong phần dựng phim là:

  • Tối đa 5-6 ký tự ASCII khác nhau (dấu phẩy, dấu ngoặc kép và một vài ký tự khác)
  • 2-4 màu sử dụng
    • cho các nhân vật
    • đối với nền của nhân vật trong một số trường hợp - ví dụ cuối cùng là để hiển thị việc sử dụng các sắc thái màu với ít hoặc không có ký tự để tạo ra một mẫu, ví dụ như khảm màu

Những gì tôi có trong một máy ảo hiện tại là Arch Linux và mặc dù câu hỏi không phải là phân phối cụ thể, tôi đã xem xét tài liệu của họ để tùy chỉnh /etc/bash.bashrctệp. Tôi có thể thấy rằng rất nhiều giải thích đi vào cấu hình sự xuất hiện của dấu nhắc và nói chung là tất cả các yếu tố tiền cảnh. Có rất ít thông tin về bất kỳ cấu hình nào cho nền, ngoại trừ thông thường cho một màu đơn sắc, chẳng hạn như các cài đặt và mẹo này :

# 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

Về mặt khái niệm, tôi vẫn không nắm bắt được những "khoảng trống" trống / trống / nền nào mà tôi không gõ khi tôi sử dụng bảng điều khiển tức là "chúng được làm từ gì?" để nói Đặc biệt là những lệnh không ở dấu nhắc và bao quanh các lệnh được lặp lại. Đối với những gì xảy ra trên dòng hoạt động, có thể chứng minh rằng bashhành động đó theo cách "định hướng theo dòng" và một số thao tác kích hoạt xóa dòng hoạt động ( for i in $(seq 1 $(expr $(tput lines) \* $(tput cols))); do echo -n M; done; tput cup 15 1sau đó, tại dấu nhắc gõ char và xóa lùi nó - đã thể hiện một người đóng góp) - mức độ có thể thay đổi từ CLI sang khác tức là zsh. Hơn nữa, dường như khi tôi thêm một cái gì đó giống như \[\033[44m\]dòng PS1 của tôi vào thì bash.bashrctôi có nền màu xanh sau khi tải lại bash - vì vậy rõ ràng tôi biết rằng có một sốđòn bẩy ở đây trên sự xuất hiện đầu ra trong chừng mực nền tảng có liên quan.

Nhưng tôi cũng biết rằng bash là một phần mềm dựa trên một số cơ sở khác dưới dạng hệ thống con TTY để đưa mọi thứ lên màn hình - và điều này đi xuống từ đó đến thành phần VT trong kernel tôi giả sử. pstree -Aptrên Arch hiển thị systemdliên kết đến loginvà sau đó đến bash.

Bản phân phối Arch Linux dựa trên agettycác dịch vụ TTY. Một đơn giản echo $TERMsẽ mang lại loại thiết bị đầu cuối đang sử dụng ("linux" ở đây bên ngoài bất kỳ DE nào) và infocmp[-d spec1 spec2]lệnh không có tham số hiển thị các khả năng của thiết bị đầu cuối hoạt động và thông tin hồ sơ từ cơ sở dữ liệu đầu cuối 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,

Vì thế, nhiều khả năng có thể được tận dụng từ khung thiết bị đầu cuối và về cơ bản, đó là những tính năng được thể hiện trong tệp cấu hình bash.bashrc khi lời nhắc được tùy chỉnh bằng cách đặt biến PS1. Các chuỗi điều khiển và thoát được sử dụng để làm gián đoạn luồng ký tự hiển thị trong thiết bị đầu cuối nhằm cung cấp các chức năng, bao gồm di chuyển con trỏ và các khả năng khác được mô tả trong cơ sở dữ liệu thông tin đầu cuối. Nhiều trong số các chức năng đó được truyền vào bằng cách sử dụng Trình giới thiệu trình tự điều khiển nổi tiếng ESC[(hoặc \ 33) (nhiều trình tự ở đâyở đây , và một số ví dụ ). Hơn nữa, nó cũng có thể sử dụngtputtiện ích trực tiếp trên CLI để thay đổi một số thuộc tính thiết bị đầu cuối; ví dụ tput setab 4sẽ có các lệnh bash echo trên nền màu xanh.

Nếu chúng strace bashta có thể thấy cả chuỗi thoát và hành vi đang hoạt động:

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

Điều này cung cấp ngữ cảnh cho câu hỏi Có thể thay thế các khoảng trống / màu nền trong thiết bị đầu cuối bằng một bộ ký tự ASCII ngẫu nhiên (nhưng đẹp) không? nhưng không biết làm thế nào để thực hiện các tính năng hoặc về những gì tôi đang tìm kiếm trong thiết bị đầu cuối.

Vì vậy, tôi đã tạo ra một mockup thô sơ như một ví dụ về kết quả cuối cùng có thể trông như thế nào nếu điều này là có thể (không nghiêm túc :):

Mockup của một thiết bị đầu cuối hiển thị một tập hợp các ký tự ASCII được tô màu làm nền thay vì chỉ là một màu đen đặc.  Các mẫu bao quanh đầu ra của các lệnh được thực hiện.  Dòng lệnh hoạt động có mẫu / màu khác nhau nhưng mẫu này không bao giờ được CLI diễn giải để bảo toàn chức năng của trình bao

Về cơ bản, tất cả "không gian trống" trong thiết bị đầu cuối sẽ được lấp đầy bằng mẫu (ở đây tôi "xếp" một trong các hình ảnh từ trên xuống nhưng tôi muốn thực hiện thực tế cho từng "trống" riêng lẻ được tạo ngẫu nhiên từ bộ 5-6 ký tự và tính năng được ghi lại từ đoạn phim sẽ được chỉ định). Có một mẫu khác cho dòng lệnh đang hoạt động tức là "nước" lượn sóng nhưng tôi giải quyết cho dòng có màu xanh. Như điều này đã được tưởng tượng, các lệnh sẽ "xóa" "nước" khi chúng được gõ trên dòng hoạt động và tất nhiên một hạn chế là mô hình các ký tự không bao giờ được CLI giải thích nếu không nó sẽ vô dụng.

Vì vậy, có bất kỳ cấu hình nào được hiển thị trong bashhoặc trong khung thiết bị đầu cuối, hoặc một tập lệnh cho phép sử dụng một bộ ký tự và một số điều khiển màu để sửa đổi đầu ra của bash trong terminal để tạo ra một mẫu ngẫu nhiên cho nền (sẽ tương tự như những gì tôi đã trình bày ở trên)? Hoặc tôi nên đơn giản giải quyết cho một cái gì đó như cố gắng cung cấp một hình ảnh đầy đủ mẫu làm nền cho tty ?

Triển khai

0.1 - Phiên bản PatternOTD (thỏa thuận một lần bắn khi bạn đăng nhập)

Biểu thức sau đây tôi đã thêm vào tệp .bashrc của mình kết hợp một số khái niệm chúng ta đã khám phá và tạo thành một bằng chứng cơ bản (rất) về khái niệm cho hình ảnh trong thiết bị đầu cuối linux tiêu chuẩn:

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

nhập mô tả hình ảnh ở đây

Quan sát

  • Nó rõ ràng chỉ là một lệnh nên không bền bỉ, tức là nó cuộn đi khi các lệnh được gõ
  • Chọn để không riêng ngẫu nhiên việc lựa chọn nhân vật tức là head -c 1với tput colsnhân đường để bắt đầu với, mà sẽ in chars ngẫu nhiên cá nhân từ sự lựa chọn trích dẫn - bởi vì nó quá chậm. Tôi không nghĩ randomtạo ra một số nguyên dài (tput cols) nhưng vẫn nhanh hơn. Chắc chắn điều này là rất lãng phí nhưng nó hoạt động.
  • Không ngẫu nhiên bất kỳ màu sắc hoặc hiệu ứng cho mỗi ký tự hoặc ngoại trừ màu xanh lá cây đó bởi vì như tôi đã giải thích kết xuất / xử lý mỗi char riêng lẻ là quá chậm. Re: bộ đệm khung?
  • Tôi rất vui khi thấy rằng mô hình không can thiệp vào việc sử dụng CLI theo nghĩa không được CLI giải thích! (tại sao tôi không thể giải thích)
  • Nước đi quá nhanh! ;-)

0.2 - Công việc hack PROMPT_COMMAND

Giá trị của biến PROMPT_COMMAND được kiểm tra ngay trước khi Bash in từng dấu nhắc chính. Tôi biết thông thường bạn sẽ sử dụng biến để gọi một tập lệnh trong đó bạn có thể xử lý các phần tử từ màn hình, v.v. nhưng tôi đang cố gắng thực hiện điều này trực tiếp trong tệp .bashrc của mình. Ban đầu tôi nghĩ rằng tôi có thể thực hiện một số nhận thức về vị trí, tức là con trỏ ở đâu trước khi thực hiện (vì vậy tôi có thể kết xuất mọi thứ trên màn hình ở bất cứ đâu tputsau đó quay lại vị trí tôi trước đây, sử dụng cái gì đó như thế này để trích xuất vị trí:

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

Tôi sẽ ống giá trị đến cut -f1 -d";". Tôi có thể thực hiện điều này trên CLI nhưng làm cho công việc này nằm trong chuỗi các yếu tố trong các biến PS1 / P_C nằm ngoài tầm với của tôi vào lúc này và có thể không có bất kỳ lệnh nào được đưa vào PROMPT_COMMAND trong mỗi lần trả về vận chuyển mà thay vào đó chỉ một lần (?) mặc dù được thực hiện mỗi lần (xem các quan sát bên dưới).

Vì vậy, điều tốt nhất tôi có thể làm là thực hiện trình tự ban đầu của mình và thêm một số lệnh vào cả PROMPT_COMMAND và định nghĩa của biến PS1 trong .bashrc. Thích như vậy:

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

Tóm lại, tôi đang sử dụng P_C ​​để cố gắng triển khai một mẫu trực quan bền vững, tức là 2 dòng được thêm vào. Thật không may, tôi không thể thành công trong việc tạo cả hai mẫu này trong khi lặp lại thủ thuật "nước" của mình, tức là có dòng màu xanh hoạt động (chỉ thay đổi màu nền, thực hiện một đường rõ ràng, sau đó thay đổi nền trở lại màu đen). Tôi đã ghép lại một hình ảnh để cho thấy cách nó chơi với nhau:

nhập mô tả hình ảnh ở đây

Quan sát

  • Sử dụng backspace trên một dòng vẫn kích hoạt hành vi dòng rõ ràng và màu xanh không còn nữa
  • Mỗi lần nhấn phím enter, chúng ta có 2 dòng mẫu trước dòng hoạt động mới
  • Tất nhiên, khi chúng ta nhìn xa hơn mặc dù các dòng bổ sung, chúng ta không gói mẫu bên cạnh các lệnh như ls
  • Tính ngẫu nhiên của / dev / urandom dường như không quá ngẫu nhiên khi được gọi ở đây trong P_C. Hình ảnh này được tạo thành từ 2 hình ảnh, nhưng thật dễ dàng để nhận ra rằng mẫu 2 dòng bổ sung luôn giống nhau, tức là tính ngẫu nhiên không được tạo ra với mỗi lần nhấn phím mà chỉ một lần cho mỗi trong hai dòng - có thể chỉ là lần đầu tiên thời gian .bashrc được đọc bởi bash.
  • Nội dung của biến PS1 bắt đầu bằng $(echo -en '\n') $(tput setab 4)- không gian ở giữa đó, ngay trước $ (tput ...), nó PHẢI ở đó để nó hoạt động. Nếu không, dòng màu xanh xuất hiện trên đầu dấu nhắc và không ở phía trước nó và tôi không thể giải quyết điều đó. Và hack này là những gì mang tên của nó đến 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\]"

Điều được thực hiện với PROMPT_COMMAND là 3 dòng mẫu được in mỗi lần trước khi lời nhắc được tạo - và 3 bộ mẫu đó được tạo riêng lẻ trong các ràng buộc được giải thích trong 0,2 - vô nghĩa đối với nước là 1 char nhưng vẫn. Sau đó, chúng tôi đi lên hai dòng (sử dụng tput cuu 2) và lời nhắc được tạo trên dòng giữa theo PS1. Chúng tôi vẫn có bộ lệnh ban đầu cho mẫu toàn màn hình khi tải .bashrc chỉ được thực thi một lần khi chúng tôi đăng nhập vào thiết bị đầu cuối. Bây giờ chúng ta có một số phần đệm xung quanh dòng hoạt động có hoa văn màu xanh của riêng nó luôn luôn được lặp lại khi có một cỗ xe trở về. Nội dung của biến PS1 và P_C đã được khử trùng. Cú pháp của các chuỗi thoát và mã hóa màu được nhúng trong dàiechotrình tự có thể là khó khăn. Lỗi dẫn đến hành vi kỳ lạbao gồm các dòng ghi đè lên nhau, một dấu nhắc xuất hiện ở lề trái hoặc đầu ra bất thường cho những thứ đã được xử lý ngoài ý muốn. Một điều kiện tồn tại với những gì tôi đang làm, trong đó cần thêm một khoảng trống bên trong biến PS1 để chống lại sự khác biệt trực quan giữa thiết bị đầu cuối linux và lxterm với thiết lập của tôi (Arch Bang). Không có thêm dung lượng, thiết bị đầu cuối linux in ký tự đầu tiên của dấu nhắc ở cuối dòng cuối cùng vì một số lý do tôi không thể tìm ra (tất nhiên đó là điều tôi làm và không phải là hành vi mặc định). Cũng không thể tìm ra cách tạo một số hiệu ứng ngẫu nhiên (đậm, nghịch đảo, v.v.) cho tập hợp các ký tự trong dấu ngoặc kép, vì nó đã được quyết định sớm để tạo ra các chuỗi dài hơn để tăng hiệu suất.

Mẫu ban đầu khi thiết bị đầu cuối mở nhập mô tả hình ảnh ở đây

Hành vi sau một clearvà nhấn enter liên tiếp tại dấu nhắc nhập mô tả hình ảnh ở đây

Quan sát

  • Nên được thiết kế lại hoặc sửa đổi để thực hiện tô màu cho các mẫu ngoài việc thực hiện hàng loạt
  • Bắt đầu cảm thấy rằng đi xa hơn sẽ yêu cầu hoặc đưa tất cả những điều đó vào một kịch bản hoặc tận dụng một hình thức trừu tượng cao hơn. Nhưng các khả năng của thiết bị đầu cuối khá cho phép người dùng cuối (nhắc nhở tôi về "logo")!

20
Tôi hơi lo sợ rằng bạn muốn làm điều này :-)
Chris Down

2
@ Chris Down Như tôi thực sự sau khi hoàn thành Q, rất nhiều vì vậy tôi gần như không đăng bài vào mục đích lại của phần mềm hay không. Và mùa lễ tôi đoán!

3
Tôi cũng hơi sợ hãi, nhưng tôi không nghĩ có gì sai khi hỏi. Tôi đã làm rất nhiều điều khủng khiếp trong quá khứ, nhưng trong khi cố gắng thực hiện những hành động tàn bạo đã nói, tôi đã học được khá nhiều. Cộng với những gì một người nghĩ là hạt dẻ, một người khác có thể không. Điều này nghe có vẻ là một thử thách tốt, hãy thực hiện nó :-)
Patrick

Bạn đang cố gắng thực hiện điều này trong bảng điều khiển chế độ văn bản hoặc trên bộ đệm khung? Hoặc có thể bạn cũng muốn hỗ trợ xterm?
Ruslan

@Ruslan Có lẽ cả hai vì lợi ích của sự hoàn chỉnh? Tôi thấy rằng SDL sử dụng bộ đệm khung từ những gì tôi nắm được và trò chơi tôi tham chiếu sử dụng khung này. Mặt khác, câu hỏi của tôi là để giới thiệu các phần bên trong cổ điển của khung thiết bị đầu cuối mà tôi đoán. Khi bash được tùy chỉnh và các yếu tố tiền cảnh được thay đổi bằng bash.bashrc, không có biện pháp nào cho bộ đệm khung, vì vậy tôi cũng khá quan tâm đến "một cái gì đó hoạt động trên văn bản" hoặc theo cách khác nó được triển khai, vì nó không hiệu quả hoặc ngây thơ như nó có thể được. Đối với xterm, ban đầu tôi có nghĩa là một giải pháp không dựa vào X.

Câu trả lời:


6

0,5a - Đồng bằng Cyan Tumbleweed

Việc triển khai trước đó được cung cấp cùng với câu hỏi dựa trên một chuỗi các lệnh sử dụng trvà một tập hợp các ký tự byte đơn. Như đã được giải thích trong Hỏi & Đáp này , tiện ích không thể xử lý các ký tự đa nhân như Unicode. Nhưng tận dụng những nhân vật đó là khá cần thiết để đạt được hiệu quả mong muốn. Một "giải pháp" đã được cung cấp cho phép trộn các ký tự byte đơn và nhiều byte trong một luồng để hiển thị. Các giải pháp được phát triển ở đó được trình bày và tùy chỉnh ở đây:

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)"

Việc thực hiện này không còn hiển thị trên mỗi dòng mà thay vào đó in toàn bộ chuỗi trong một lần chụp vào cuối quá trình sedxử lý. Điều này chỉ xuất hiện khi đăng nhập một lần hoặc thường khi bashđược khởi chạy. Đây là một mẫu ngẫu nhiên như vậy khi ra mắt (chúng ta có thể thấy hai màu lục và hai màu lục lam):

nhập mô tả hình ảnh ở đây

Các màn hình hiển thị kết quả trong thiết bị đầu cuối linux tiêu chuẩn và nó cũng hoạt động trong xterm. Tôi đã sử dụng một số ký tự mẫu mới trong dấu nhắc PS1 trong khi PROMPT_COMMAND chỉ chăm sóc dòng hoạt động và phần đệm 2 dòng sử dụng ký tự 1 byte.

Mẫu này cũng phù hợp với phân phối hiện tại của tôi, gọi archbeytrong .bashrc.:

nhập mô tả hình ảnh ở đây

Sắp đến Giáng sinh rồi! Chúc mừng mọi người :)


1
Đó không phải là một câu trả lời hay thực hiện dứt khoát, nhưng đó là một cột mốc quan trọng! ;-)

Cũng có thể tận dụng sức mạnh của một thư viện như aalib - xem aafire, ví dụ aafire -driver curses -extended -gamma 1 -floyd_steinberg -random 5cho một phần giới thiệu ấm áp.

Đừng bỏ lỡ câu trả lời này đã giải quyết giới hạn unicode được mã hóa utf8 được thảo luận ở đây !!

4

Hiển thị được quản lý bởi thiết bị đầu cuối một phần mềm hoạt động giống như trình duyệt web: nó diễn giải các chuỗi ký tự để đặt màn hình (xem man terminfo ). Shell bash sẽ không cho thiết bị đầu cuối biết cách lấp đầy vùng trống của màn hình.

Một số thiết bị đầu cuối có thể có hình ảnh làm nền như gterm nhưng nó không được tạo bởi vỏ.


Tôi đã chỉnh sửa Q để giải thích nhanh chóng những gì bạn đề cập cũng như thông tin liên quan khác từ các bình luận bị ẩn.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.