Ketika Anda menekan Ctrl+X, emulator terminal Anda menulis byte 0x18 ke sisi master dari pasangan pseudo-terminal.
Apa yang terjadi selanjutnya tergantung pada bagaimana disiplin garis tty (modul perangkat lunak di kernel yang berada di antara sisi master (di bawah kendali emulator) dan sisi budak (yang aplikasi yang berjalan di terminal berinteraksi dengan)) dikonfigurasi.
Perintah untuk mengonfigurasi disiplin garis tty adalah stty
perintah.
Ketika menjalankan aplikasi bodoh seperti cat
itu tidak menyadari dan tidak peduli apakah stdinnya adalah terminal atau tidak, terminal berada dalam mode kanonik default di mana disiplin garis tty mengimplementasikan editor garis kasar .
Beberapa aplikasi interaktif yang memerlukan lebih dari itu editor garis kasar biasanya mengubah pengaturan tersebut saat start-up dan mengembalikannya saat meninggalkan. Kerang modern, pada prompt mereka adalah contoh dari aplikasi tersebut. Mereka menerapkan editor baris yang lebih maju.
Biasanya, saat Anda memasukkan baris perintah, shell menempatkan disiplin garis tty dalam mode itu, dan ketika Anda menekan enter untuk menjalankan perintah saat ini, shell mengembalikan mode tty normal (seperti yang berlaku sebelum mengeluarkan prompt).
Jika Anda menjalankan stty -a
perintah, Anda akan melihat pengaturan saat ini digunakan untuk aplikasi bodoh . Anda mungkin melihat icanon
, echo
dan echoctl
pengaturan diaktifkan.
Artinya adalah:
icanon
: editor garis kasar diaktifkan.
echo
: karakter yang Anda ketikkan (yang ditulis emulator terminal ke sisi master) digaungkan kembali (tersedia untuk dibaca oleh emulator terminal).
echoctl
: Bukannya menggema asis, karakter kontrol bergema sebagai ^X
.
Jadi, katakanlah Anda mengetik A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return.
Emulator terminal Anda akan mengirimkan: AB\bC\x18\b\r
. Disiplin garis akan menggema kembali :,AB\b \bC^X\b \b\b \b\r\n
dan aplikasi yang membaca input dari sisi slave ( /dev/pts/x
) akan membaca AC\n
.
Semua aplikasi melihat adalah AC\n
, dan hanya ketika Anda menekan Entersehingga tidak dapat mengontrol output untuk ^X
sana.
Anda akan melihat bahwa untuk echo , yang pertama ^H
( ^?
dengan beberapa terminal, lihat erase
pengaturan) mengakibatkan \b \b
dikirim kembali ke terminal. Itulah urutan untuk memindahkan kursor ke belakang, menimpa dengan spasi, memindahkan kursor kembali, sedangkan yang kedua ^H
menghasilkan \b \b\b \b
untuk menghapus dua karakter ^
dan X
karakter.
The ^X
(0x18) sendiri sedang diterjemahkan ke ^
dan X
untuk output. Seperti B
, itu tidak berhasil masuk ke aplikasi, karena kami menghapusnya dengan Backspace.
\r
(alias ^M
) diterjemahkan ke \r\n
( ^M^J
) untuk gema, dan \n
( ^J
) untuk aplikasi.
Jadi, apa saja pilihan kami untuk aplikasi bodoh itu :
- nonaktifkan
echo
( stty -echo
). Itu secara efektif mengubah cara karakter kontrol digaungkan, dengan ... tidak menggema apa pun. Bukan solusi.
- nonaktifkan
echoctl
. Itu mengubah cara kontrol karakter (selain ^H
, ^M
... dan yang lainnya digunakan oleh editor baris) digaungkan. Mereka kemudian didengungkan apa adanya. Misalnya, karakter ESC dikirim sebagai byte \e
( ^[
/ 0x1b
) (yang dikenali sebagai permulaan urutan escape oleh terminal), ^G
Anda mengirim \a
(BEL, membuat terminal Anda berbunyi) ... Bukan pilihan .
- nonaktifkan editor baris kasar (
stty -icanon
). Tidak benar-benar pilihan karena aplikasi kasar akan menjadi jauh lebih tidak dapat digunakan.
- edit kode kernel untuk mengubah perilaku disiplin tty line sehingga gema dari karakter kontrol mengirim
\e[7m^X\e[m
bukan hanya ^X
(di sini \e[7m
biasanya memungkinkan membalikkan video di sebagian besar terminal).
Sebuah opsi bisa menggunakan pembungkus seperti rlwrap
itu adalah hack kotor untuk menambahkan editor garis mewah ke aplikasi bodoh. Wrapper yang berlaku mencoba untuk mengganti read()
s sederhana dari perangkat terminal untuk panggilan ke editor baris readline (yang mengubah mode disiplin garis tty).
Lebih jauh lagi, Anda bahkan dapat mencoba solusi seperti ini yang membajak semua input dari terminal untuk melalui editor baris zsh (yang kebetulan menyorot ^X
dalam video terbalik) mengandalkan :exec
fitur layar GNU .
Sekarang untuk aplikasi yang mengimplementasikan editor baris mereka sendiri, terserah kepada mereka untuk memutuskan bagaimana gema dilakukan. bash
menggunakan readline untuk apa yang tidak memiliki dukungan untuk mengkustomisasi bagaimana karakter kontrol digaungkan.
Untuk zsh
, lihat:
info --index-search='highlighting, special characters' zsh
zsh
tidak menyorot karakter yang tidak dapat dicetak secara default. Anda dapat menyesuaikan sorotan dengan misalnya:
zle_highlight=(special:fg=white,bg=red)
Untuk warna putih pada highlight merah untuk karakter khusus tersebut.
Representasi teks dari karakter tersebut tidak dapat disesuaikan.
Dalam UTF-8 lokal, 0x18 akan diberikan sebagai ^X
, \u378
, \U7fffffff
(dua poin kode unicode belum ditetapkan) sebagai <0378>
, <7FFFFFFF>
, \u200b
(a dicetak karakter tidak-benar-benar unicode) sebagai <200B>
.
\x80
di lokal iso8859-1 akan diterjemahkan sebagai ^�
... dll.
bash
itureadline
menangani hal-hal itu, dan bagi kebanyakan orang lain itu adalah driver tty.