Saya mencoba menggunakan xmodmap
untuk memetakan META_Lke MENUkunci tetapi tampaknya tidak diterima bash
sebagai kunci meta. Jadi, saya bertanya-tanya bagaimana komponen ini (keyboard, X, xterm, bash) berhubungan dengan masing-masing dalam kaitannya dengan Meta- dan Super-Keys. Penjelasan apa pun akan dihargai.
Biarkan saya katakan ini dengan cara lain. Halaman bash man mengatakan, misalnya, bahwa fungsi yank-nth-arg terikat M-C-ydan berfungsi ketika saya menekan Esc-Control-y. Tapi saya merasa ini agak rumit. Jadi bagaimana saya bisa membuat bash menerima kunci lain sebagai Meta(seperti Menu) untuk semua binding standarnya?
MENU
kunci Anda diperhatikan oleh X? Apa pengelola jendela yang Anda gunakan - beberapa di antaranya dapat membantu Anda mendefinisikan ulang kunci Anda.Jawaban:
Pemetaan dari tombol keyboard ke pengubah suka
Meta
danControl
ditangani oleh server X (yaitu bagian tingkat rendah dari GUI). Pemetaan ini dapat dimanipulasi melaluixmodmap
perintah gaya lama atau antarmuka XKB gaya baru , atau melalui alat konfigurasi GUI yang menggunakan salah satunya di bawah tenda.Secara default, pada sebagian besar pengaturan,
Meta
kuncinya adalah kunci yang berlabel Alt. Ini karena secara historis, banyak workstation unix memiliki kunci berlabel di Metamana PC memiliki kunci berlabel Alt. Jadi jika Anda memiliki ikatan untukM-C-y
, tekan Ctrl+ Alt+ Y.Untuk memeriksa apa ikatan Anda saat ini, mulailah
xev
program di terminal. Dengan jendela xev terfokus, tekan tombol; Anda akan melihat transkrip acara yang dibuat di terminal.Komunikasi antara emulator terminal (atau perangkat terminal yang terkait dengan terminal fisik) dan aplikasi menggunakan karakter. Ketika Anda menekan A, terminal menerima informasi "
A
kunci, tidak ada pengubah", tetapi apa yang dikirim ke aplikasi yang berjalan di terminal adalah karaktera
. Ketika Anda menekan tombol fungsi seperti Upatau F1, tidak ada karakter yang sesuai; terminal mengirimkan urutan karakter yang dimulai dengan karakter escape (byte 27, terkadang ditulis\e
atau^[
). Ketika emulator terminal seperti xterm menerima peristiwa tekan tombol denganMeta
pengubah, itu menerjemahkan kunci itu ke karakter pelarian diikuti oleh fungsi yang mendasari tombol, misalnya\ea
(melarikan diri, huruf kecil a) ketika Anda menekan Meta+ A.Apa perbedaan yang tepat antara 'terminal', 'shell', 'tty' dan 'konsol'? semoga bermanfaat latar belakang.
sumber
Acara utama dihasilkan oleh server X (seperti yang dikonfigurasikan oleh
xmodmap
), dan dikirim ke aplikasi X Anda. Pengelola jendela Anda dapat memotong ini sebelum dikirim ke xterm. XTerm, pada gilirannya, menerjemahkan event ke beberapa byte dan mengirimkan byte ke pseudo-tty yang dialokasikan oleh shell Anda, bash.Harap dicatat bahwa tidak semua acara diterjemahkan langsung ke byte oleh XTerm. Misalnya, tombol Ctrldan shift, dengan sendirinya, menghasilkan peristiwa keyboard X, tetapi XTerm tidak mengirim apa pun ke shell (atau aplikasi lain) yang berjalan di dalamnya. Ini juga termasuk Metakunci itu sendiri, tetapi bukan Menukunci itu. Namun, peristiwa yang dihasilkan dengan menekan Meta- eakan membuat XTerm mengirim byte 0xE5 atau urutan dua byte 0x1B 0x65, tergantung pada pengaturan sumber daya XTerm.VT100.metaSendsEscape.
sumber
Kunci meta Bash awalnya didefinisikan seperti ini (
lib/readline/ChangeLog
):Itu terjadi dengan cara ditafsirkan dengan ncurses dan xterm . Sebuah beberapa terminal yang disediakan untuk membuat fitur opsional ini (aspek yang tidak meluas Sebagian besar terminal Anda akan menemukan penggunaan perilaku hardcoded (dan tidak sangat menarik) The.. Terminfo halaman dokumen pengguna kemampuan ini terminal:
dan menjelaskan fitur:
Fitur yang berbeda, mengawali karakter pelarian sebagai respons terhadap
Alt
kunci dimasukkan ke beberapa emulator terminal. Bash (sebenarnyareadline
perpustakaan) mendokumentasikan penggunaan itu di changelog dari 2004:Meta adalah kasus khusus dari kunci pengubah . Suka controldan shift, Anda menekannya pada saat yang sama dengan tombol lain dan berharap untuk melihat sesuatu yang berbeda dari menekan tombol itu sendiri. X menyediakan untuk kunci pengubah dengan menetapkan sedikit nilai pengubah yang diteruskan dalam peristiwa X untuk kunci. Penekanan tombol dapat berupa beberapa peristiwa X; X menyediakan fungsi untuk menggabungkan peristiwa ini sambil mempertahankan pengubah.
X juga mendefinisikan simbol untuk setiap tombol yang mungkin muncul pada keyboard Anda. Ini memberikan nilai-nilai lain (seperti Unicode) dengan penanganan khusus pada fungsi yang menggabungkan acara.
Tetapi "meta" adalah kasus khusus.
Aplikasi X tidak memiliki metakunci, kecuali dengan konvensi. X tidak memiliki definisi untuk kunci meta, atau pengubah meta. Secara konvensional, terminal mencari kunci- Altdan / atau salah satu dari pengubah yang diketahui
xmodmap
, misalnyamod2
,. Fitur xkb yang lebih baru memperumit banyak hal (tetapi tidak memberikan peningkatan relatif terhadap diskusi ini) dengan menyediakan lapisan informasi lain untuk menemukan Altkuncinya.Konvensi tentu saja dapat membawa Anda sejauh ini, mengingat tidak ada
xmodmap
atau tidakxkb
tahu apa-apa tentang meta . xterm, misalnya, dapat dikonfigurasi, dan tidak semua pengguna ingin mengonfigurasi meta dengan cara yang sama. Misalnya, Altmungkin bukan meta-key yang dimaksudkan, misalnya, jika digunakan dalamtranslation
sumber daya. Kunci lain mungkin adalah meta key, tetapi pengguna (khususnya yang menggunakan urutan escape dalam bash) mungkin menginginkan karakter escape dikirim ketika mereka menekan Alt. Tetapi perlu diingat bahwa kecuali jika dikonfigurasi sebagai pengubah, tidak ada yang terjadi: xterm tidak menggabungkan peristiwa dengan sendirinya.xterm memiliki beberapa pengaturan sumber daya (didokumentasikan di halaman manual ):
altIsNotMeta
danaltSendsEscape
(ditambahkan pada 2007 ).eightBitInput
sejak 2006 sesuai dengan indera asli mode meta, dan ada urutan jalan keluar yang ditentukan untuk ini yang menyediakansmm
danrmm
(mengatur / menghapus meta-mode) kemampuan terminal.eightBitInput
telah dimodifikasi pada tahun 2003 untuk mempertimbangkan UTF-8 dengan menggeser nilai Unicode yang didekodekan oleh 128 daripada byte input mentah.metaSendsEscape
berasal dari tahun 1999eightBitInput
jauh lebih tua darimetaSendsEscape
. Itu telah menerapkan pilihan antara mode meta (menambahkan bit kedelapan) atau mengawali kunci dengan escapesejak X11R4 (1989). Tetapi fitur ditentukan pada startup: itu diperiksa selama inisialisasi untuk menentukan apakah input diatur untuk mengizinkan 8 bit atau hanya 7. Setelah itu, tidak berubah.Beberapa orang menyamakan keduanya ( 8-bit dan escape-prefix), merujuk pada yang kedua sebagai mode meta . Bergantung pada sudut pandang Anda tentang masalah ini,
eightBitInput
pengaturan sumber daya xterm adalah bagian dari solusi untuk mendapatkan meta-key yang bisa diterapkan.Bacaan lebih lanjut:
sumber