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ế cat
khô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 -a
lệ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
, echo
và echoctl
thiế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 là ^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\n
và 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\n
và 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 erase
cài đặt) dẫn đến \b \b
việ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 ^H
dẫn đến \b \b\b \b
để xóa hai ^
và X
ký tự.
Bản thân ^X
(0x18) đã được dịch sang ^
và X
cho đầ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), ^G
bạ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[m
thay vì chỉ ^X
(ở đây \e[7m
thườ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ế rlwrap
là 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 ^X
s trong video đảo ngược) dựa trên :exec
tí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. bash
sử 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.
Để zsh
xem
info --index-search='highlighting, special characters' zsh
zsh
mặ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>
.
\x80
trong một miền địa phương iso8859-1 sẽ được hiển thị là ^�
... vv
bash
nó làreadline
xử 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.