readline / bash: Bagaimana memetakan Escape key dan Arrow key?

6

Dari perangkat lunak berbasis baris perintah lainnya, saya terbiasa dengan perilaku berikut: Panah atas / bawah menelusuri sejarah perintah, mencocokkan garis yang cocok dengan karakter yang diketik sejauh ini pada baris saat ini, dan Esc menghapus semua yang diketik sejauh ini. pada baris saat ini. Saya mencoba membuat bash (melalui readline) melakukan hal yang sama. Inilah yang saya masukkan ke .bashrc saya:

bind 'Escape: kill-whole-line'
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

Perilaku tidak seperti yang dimaksudkan, karena gangguan pemetaan Escape = "\ e" dengan pemetaan urutan escape "\ e [A" dan "\ e [B".

Pertanyaan saya: Apakah ada cara untuk membuat ini berhasil? Satu kemungkinan akan berbasis waktu, yaitu jika \ e diikuti dengan cepat oleh kunci lain itu diperlakukan sebagai bagian dari urutan, tetapi jika tidak ada lagi yang datang selama penundaan singkat itu diperlakukan sebagai kunci dengan sendirinya. Namun, membaca bash dan dokumentasi readline saya tidak dapat menemukan hal seperti itu.

Pertanyaan sampingan: Apakah ada terminal "emulator" modern yang tidak benar-benar mencoba untuk meniru perilaku berbelit-belit dari mesin historis, tetapi memberikan program yang berjalan di dalamnya dengan informasi yang jelas tentang tombol yang ditekan? Yang juga memungkinkan hal-hal seperti membedakan antara CTRL-A dan CTRL-SHIFT-A ... Saya menguji hal-hal ini di Konsole KDE, yang berperilaku seperti xterm, dan pada konsol Linux.

A. Donda
sumber

Jawaban:

4

Jika Anda menggunakan xterm, Anda bisa mendapatkannya untuk mengirim CSI(0x9B) alih-alih urutan \e[dengan mengatur sumber daya boolean eightBitControl. Misalnya, mulai xterm ke atas seperti ini:

xterm -xrm '*eightBitControl:true'

Anda dapat mengatur sumber daya ini secara permanen dengan mengedit file sumber daya spesifik aplikasi XTerm (Ubuntu tampaknya memasukkan ini ke dalam /etc/X11/app-defaultstetapi saya pikir /usr/share/X11/app-defaults ini lebih standar.)

Tetapi berhati-hatilah: ini pada dasarnya akan merusak terminal Anda sampai Anda memperbaiki semua ikatan kunci Anda.

Adapun pertanyaan yang lebih umum, saya pikir ini lebih sulit daripada yang mungkin muncul pertama kali. Konsol Linux dirancang dengan sangat baik untuk menghasilkan kode karakter delapan-bit (sehingga dapat bekerja dengan UTF-8). Dari konsol yang sebenarnya (yaitu, tidak menggunakan X), Anda bisa mendapatkan scancode "mentah", tetapi kemudian Anda harus melakukan sendiri semua keymapping logic (yang sebenarnya dilakukan X). Anda mungkin dapat menggunakan fasilitas X keymapping untuk menghasilkan beberapa kode spesifik untuk kombinasi alt + ctrl + huruf, tetapi saya tidak tahu di mana Anda akan memerasnya ke dalam urutan pengkodean delapan-bit. Tapi aku merasakan sakitmu :)

Rici
sumber
Terima kasih! Bagus untuk tahu, tapi saya rasa saya tidak akan melakukan itu. Melanggar ikatan kunci di mana-mana agak terlalu banyak hanya untuk membuat bash melakukan penawaran saya ... Saya mengerti kemudian bahwa membedakan berdasarkan waktu adalah sesuatu yang tidak dilakukan readline? Meskipun program konsol lain seperti vim harus melakukan sesuatu seperti itu, karena Esc dan Arrows yang fungsional pada saat yang sama.
A. Donda
@ A.Donda: Itu benar: Vim membedakan berdasarkan waktu, yang kadang-kadang memiliki konsekuensi yang mengganggu ketika ssh'ing ke sesi vim melalui tautan lambat. (Ini juga berarti bahwa ESC sedikit tidak responsif, tetapi vimites belajar untuk hidup dengan itu.)
rici