Ketika Anda mengetik karakter kontrol di shell mereka ditampilkan menggunakan apa yang disebut "notasi caret". Escape misalnya dituliskan ^[
dalam notasi tanda sisipan.
Saya ingin menyesuaikan bash shell saya agar terlihat keren. Misalnya saya telah mengubah PS1
dan PS2
menjadi berwarna. Saya sekarang ingin mengontrol karakter untuk mendapatkan penampilan yang unik juga untuk membuatnya lebih dapat dibedakan dari karakter biasa.
$ # Here I type CTRL-C to abort the command.
$ blahblah^C
^^ I want these two characters to be displayed differently
Apakah ada cara untuk membuat karakter kontrol shell highlight saya berbeda?
Apakah mungkin membuatnya menampilkannya dalam huruf tebal atau membuatnya muncul dalam warna berbeda dari teks biasa?
Saya menggunakan bash shell di sini tetapi saya tidak memberi tag pada pertanyaan bash
karena mungkin ada solusi yang berlaku untuk banyak shell yang berbeda.
Perhatikan bahwa saya tidak tahu pada level apa penyorotan karakter kontrol terjadi. Saya pertama kali berpikir itu ada di shell itu sendiri. Sekarang saya telah mendengar bahwa itu adalah readline yang mengontrol bagaimana karakter kontrol di shell seperti bash . Jadi pertanyaannya sekarang ditandai dengan readline
dan saya masih mencari jawaban.
bash
itureadline
menangani hal-hal itu, dan bagi kebanyakan orang lain itu adalah driver tty.vi
danless
sering menyorot karakter kontrol berbeda dari teks biasa. Saya akan mengedit pertanyaan dengan informasi ini. Terima kasih!zsh
yang melakukan itu di luar kotak.Jawaban:
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 melihaticanon
,echo
danechoctl
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 membacaAC\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, lihaterase
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^
danX
karakter.The
^X
(0x18) sendiri sedang diterjemahkan ke^
danX
untuk output. SepertiB
, 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 :
echo
(stty -echo
). Itu secara efektif mengubah cara karakter kontrol digaungkan, dengan ... tidak menggema apa pun. Bukan solusi.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 .stty -icanon
). Tidak benar-benar pilihan karena aplikasi kasar akan menjadi jauh lebih tidak dapat digunakan.\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 menggantiread()
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:zsh
tidak menyorot karakter yang tidak dapat dicetak secara default. Anda dapat menyesuaikan sorotan dengan misalnya: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.sumber
Saya biasanya memiliki kode ini di file .bashrc saya:
dan kemudian saya memanggil fungsi ini di PS1 saya
Dengan ini, jika Anda menekan ^ C Anda akan melihatnya di prompt Anda
Semua kode status keluar yang bukan "0" akan diminta.
sumber