Cách hiển thị các ký tự điều khiển (^ C, ^ D, ^ [, Tầm) khác nhau trong trình bao


13

Khi bạn nhập các ký tự điều khiển trong trình bao, chúng sẽ được hiển thị bằng cách sử dụng "ký hiệu dấu mũ". Thoát ví dụ được viết là^[ trong ký hiệu dấu mũ.

Tôi thích tùy chỉnh bash shell của mình để làm cho nó trông thật tuyệt. Tôi đã ví dụ thay đổi của tôi PS1PS2để trở thành màu sắc. Bây giờ tôi muốn các nhân vật điều khiển có được ngoại hình độc đáo cũng như làm cho chúng khác biệt hơn so với các nhân vật thông thường.

$ # Here I type CTRL-C to abort the command.
$ blahblah^C
          ^^ I want these two characters to be displayed differently

Có cách nào để làm nổi bật các ký tự điều khiển shell của tôi không?

Có thể làm cho nó hiển thị chúng trong một phông chữ đậm hoặc có thể làm cho chúng xuất hiện trong các màu sắc khác nhau từ văn bản thông thường?

Tôi đang sử dụng bash shell ở đây nhưng tôi không gắn thẻ câu hỏi bashvì có thể có một giải pháp áp dụng cho nhiều shell khác nhau.

Lưu ý rằng tôi không biết ở mức độ nổi bật của các ký tự điều khiển diễn ra. Lần đầu tiên tôi nghĩ nó nằm trong vỏ. Bây giờ tôi đã nghe nói rằng nó là readline rằng sự kiểm soát như thế nào ký tự điều khiển được trong vỏ như bash . Vì vậy, câu hỏi hiện được gắn thẻ readlinevà tôi vẫn đang tìm kiếm câu trả lời.


Tại sao bạn nghĩ rằng vỏ là làm nổi bật chúng? Đối với bashnó là readlinexử lý những thứ đó, và đối với hầu hết những người khác, nó là trình điều khiển tty.
mikeerv

Tôi không biết. Đó là lý do tại sao tôi viết ghi chú. Đó chỉ là phỏng đoán của tôi vì các ứng dụng khác thích vilessthường làm nổi bật các ký tự điều khiển khác với văn bản thông thường. Tôi sẽ chỉnh sửa câu hỏi với thông tin này. Cảm ơn bạn!
wefwefa3

Điều đó có ý nghĩa. loại công cụ đó khó khăn hơn đối với vỏ vì loại ưu tiên thứ hai. với các biên tập viên, toàn bộ công việc của họ là cung cấp một màn hình <> giao diện tệp, nhưng trình bao là trình thông dịch lệnh cho ngôn ngữ được dịch trước và trình soạn thảo dòng thứ hai (hoặc hoàn toàn không) .
mikeerv

Readline được sử dụng bởi các chương trình khác, nhưng nó cũng một phần của bash: nó là một thư viện được liên kết với nó. Và vỏ sò ngày nay, đặc biệt là bash, làm khá nhiều thứ bạn có thể nghĩ ra.
alexis

Chỉ cần sử dụng zshmà ra khỏi hộp.
Stéphane Chazelas

Câu trả lời:


20

Khi bạn nhấn Ctrl+X , trình giả lập thiết bị đầu cuối của bạn ghi byte 0x18 vào phía chính của cặp đầu cuối giả.

Điều gì xảy ra tiếp theo phụ thuộc vào cách thức kỷ luật dòng tty (mô-đun phần mềm trong kernel nằm ở giữa phía chính (dưới sự kiểm soát của trình giả lập) và phía nô lệ (ứng dụng chạy trong thiết bị đầu cuối tương tác với) được cấu hình.

Một lệnh để cấu hình kỷ luật dòng tty đó làstty lệnh.

Khi chạy một ứng dụng câm như thế catkhông biết và không quan tâm liệu stdin của nó có phải là thiết bị đầu cuối hay không, thiết bị đầu cuối ở chế độ chính tắc mặc định trong đó kỷ luật dòng tty thực hiện trình chỉnh sửa dòng thô .

Một số ứng dụng tương tác cần nhiều hơn trình soạn thảo dòng thô đó thường thay đổi các cài đặt đó khi khởi động và khôi phục chúng khi rời đi. Vỏ hiện đại, tại dấu nhắc của họ là các ví dụ về các ứng dụng như vậy. Họ thực hiện trình soạn thảo dòng nâng cao hơn của riêng họ.

Thông thường, trong khi bạn nhập một dòng lệnh, shell sẽ đặt kỷ luật dòng tty trong chế độ đó và khi bạn nhấn enter để chạy lệnh hiện tại, shell sẽ khôi phục chế độ tty bình thường (như đã có hiệu lực trước khi đưa ra dấu nhắc).

Nếu bạn chạy stty -alệnh, bạn sẽ thấy các cài đặt hiện tại được sử dụng cho các ứng dụng câm . Bạn đang có khả năng để xem icanon, echoechoctlthiết lập được kích hoạt.

Điều đó có nghĩa là:

  • icanon: trình chỉnh sửa dòng thô đó được bật.
  • echo: các ký tự bạn nhập (mà trình giả lập thiết bị đầu cuối ghi vào phía chính) được lặp lại (được cung cấp để đọc bởi trình giả lập thiết bị đầu cuối).
  • echoctl: thay vì được lặp lại asis, các ký tự điều khiển được lặp lại^X.

Vì vậy, hãy nói rằng bạn gõ A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return.

Trình giả lập thiết bị đầu cuối của bạn sẽ gửi : AB\bC\x18\b\r. Kỷ luật dòng sẽ lặp lại: AB\b \bC^X\b \b\b \b\r\nvà một ứng dụng đọc đầu vào từ phía nô lệ ( /dev/pts/x) sẽ đọcAC\n .

Tất cả các ứng dụng nhìn thấy là AC\nvà chỉ khi bạn nhấn Enterđể nó không có bất kỳ sự kiểm soát nào đối với đầu ra ^Xở đó.

Bạn sẽ nhận thấy rằng đối với tiếng vang , lần đầu tiên ^H( ^?với một số thiết bị đầu cuối, hãy xem erasecài đặt) dẫn đến \b \bviệc được gửi trở lại thiết bị đầu cuối. Đó là chuỗi để di chuyển con trỏ trở lại, ghi đè lên với không gian, di chuyển con trỏ trở lại một lần nữa, trong khi thứ hai ^Hdẫn đến \b \b\b \bđể xóa hai ^Xký tự.

Bản thân ^X(0x18) đã được dịch sang ^Xcho đầu ra. Giống như B, nó không xuất hiện trong ứng dụng, vì chúng tôi đã xóa nó bằng Backspace.

\r(aka ^M) đã được dịch thành \r\n( ^M^J) cho tiếng vang và \n( ^J) cho ứng dụng.

Vì vậy, các tùy chọn của chúng tôi cho các ứng dụng ngu ngốc đó là gì :

  • vô hiệu hóa echo( stty -echo). Điều đó thay đổi hiệu quả cách các ký tự điều khiển được lặp lại, bằng cách ... không lặp lại bất cứ điều gì. Không thực sự là một giải pháp.
  • vô hiệu hóa echoctl. Điều đó thay đổi cách các ký tự điều khiển (trừ ^H, ^M... và tất cả các ký tự khác được sử dụng bởi trình chỉnh sửa dòng) được lặp lại. Họ sau đó được lặp lại như vốn có. Chẳng hạn, ký tự ESC được gửi dưới dạng byte \e( ^[/ 0x1b) (được nhận dạng là bắt đầu một chuỗi thoát bởi thiết bị đầu cuối), ^Gbạn gửi một \a(một BEL, làm cho thiết bị đầu cuối của bạn phát ra tiếng bíp) ... Không phải là một tùy chọn .
  • vô hiệu hóa trình soạn thảo dòng thô ( stty -icanon). Không thực sự là một lựa chọn vì các ứng dụng thô sẽ trở nên ít sử dụng hơn.
  • chỉnh sửa mã hạt nhân để thay đổi hành vi của kỷ luật dòng tty để tiếng vang của ký tự điều khiển gửi \e[7m^X\e[mthay vì chỉ ^X(ở đây \e[7mthường cho phép quay ngược video trong hầu hết các thiết bị đầu cuối).

Một tùy chọn có thể là sử dụng một trình bao bọc như thế rlwraplà một bản hack bẩn để thêm trình chỉnh sửa dòng ưa thích vào các ứng dụng câm. Trình bao bọc đó có hiệu lực cố gắng thay thế read()các s đơn giản từ thiết bị đầu cuối thành các cuộc gọi đến trình soạn thảo dòng readline (điều này làm thay đổi chế độ của kỷ luật dòng tty).

Đi xa hơn nữa, bạn thậm chí có thể thử các giải pháp như thế này chiếm quyền điều khiển tất cả đầu vào từ thiết bị đầu cuối để đi qua trình chỉnh sửa dòng của zsh (điều này làm nổi bật ^Xs trong video đảo ngược) dựa trên :exectính năng của màn hình GNU .

Bây giờ đối với các ứng dụng thực hiện trình chỉnh sửa dòng riêng của chúng, tùy thuộc vào chúng quyết định cách thức tiếng vang được thực hiện. bashsử dụng đường dẫn đọc mà không có bất kỳ sự hỗ trợ nào để tùy chỉnh cách các ký tự điều khiển được lặp lại.

Để zshxem

info --index-search='highlighting, special characters' zsh

zshmặc định làm nổi bật các ký tự không in được. Bạn có thể tùy chỉnh tô sáng với ví dụ:

zle_highlight=(special:fg=white,bg=red)

Cho màu trắng trên màu đỏ nổi bật cho những nhân vật đặc biệt.

Đại diện văn bản của những nhân vật không phải là tùy chỉnh mặc dù.

Trong một locale UTF-8, 0x18 sẽ được trả lại như ^X, \u378, \U7fffffff(hai điểm mã unicode unassigned) như <0378>, <7FFFFFFF>, \u200b(một không-thực sự ký tự unicode in) như <200B>.

\x80trong một miền địa phương iso8859-1 sẽ được hiển thị là ^�... vv


3

Tôi thường có mã này trong tệp .bashrc của mình:

function get_exit_status()
{
        local code=$?
        if [ $code -ne 0 ]
        then
                printf $'\001\033[31m\002'"($code)"$'\001\033[0m\002'" "
        fi
}

và sau đó tôi gọi hàm này trong PS1 của tôi

PS1='\u@\h \w $(get_exit_status)'

Với điều này, nếu bạn nhấn ^ C, bạn sẽ thấy nó trong lời nhắc của bạn

I@mycomputer ~ ^C
I@mycomputer ~ (130)

Tất cả các mã trạng thái thoát không phải là "0" sẽ được nhắc.


$? mở rộng sang trạng thái thoát trong PS1, ví dụ: PS1 = '$? \ u @ \ h \ w'
teknopaul
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.