Apa itu kunci meta bash?

16

Saya mencoba menggunakan xmodmapuntuk memetakan META_Lke MENUkunci tetapi tampaknya tidak diterima bashsebagai 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?

Leo
sumber
Apakah MENUkunci Anda diperhatikan oleh X? Apa pengelola jendela yang Anda gunakan - beberapa di antaranya dapat membantu Anda mendefinisikan ulang kunci Anda.
choroba

Jawaban:

11

Pemetaan dari tombol keyboard ke pengubah suka Metadan Controlditangani oleh server X (yaitu bagian tingkat rendah dari GUI). Pemetaan ini dapat dimanipulasi melalui xmodmapperintah 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, Metakuncinya 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 untuk M-C-y, tekan Ctrl+ Alt+ Y.

Untuk memeriksa apa ikatan Anda saat ini, mulailah xevprogram 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 " Akunci, tidak ada pengubah", tetapi apa yang dikirim ke aplikasi yang berjalan di terminal adalah karakter a. 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 \eatau ^[). Ketika emulator terminal seperti xterm menerima peristiwa tekan tombol dengan Metapengubah, 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.

Gilles 'SO- berhenti menjadi jahat'
sumber
5

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.

Teddy
sumber
2

Kunci meta Bash awalnya didefinisikan seperti ini ( lib/readline/ChangeLog):

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

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:

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

dan menjelaskan fitur:

Jika terminal memiliki "kunci meta" yang bertindak sebagai tombol shift, mengatur bit ke-8 dari setiap karakter yang ditransmisikan, fakta ini dapat ditunjukkan dengan km. Jika tidak, perangkat lunak akan menganggap bahwa bit ke-8 adalah paritas dan biasanya akan dihapus. Jika string ada untuk menghidupkan dan mematikan "mode meta" ini, mereka dapat diberikan sebagai smmdan rmm.

Fitur yang berbeda, mengawali karakter pelarian sebagai respons terhadap Altkunci dimasukkan ke beberapa emulator terminal. Bash (sebenarnya readlineperpustakaan) mendokumentasikan penggunaan itu di changelog dari 2004:

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

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, misalnya mod2,. 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 xmodmapatau tidak xkbtahu 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 dalam translationsumber 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 ):

  • altIsNotMetadan altSendsEscape(ditambahkan pada 2007 ).
  • eightBitInputsejak 2006 sesuai dengan indera asli mode meta, dan ada urutan jalan keluar yang ditentukan untuk ini yang menyediakan smmdan rmm(mengatur / menghapus meta-mode) kemampuan terminal.
  • eightBitInputtelah dimodifikasi pada tahun 2003 untuk mempertimbangkan UTF-8 dengan menggeser nilai Unicode yang didekodekan oleh 128 daripada byte input mentah.
  • metaSendsEscapeberasal dari tahun 1999
  • eightBitInputjauh lebih tua dari metaSendsEscape. 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, eightBitInputpengaturan sumber daya xterm adalah bagian dari solusi untuk mendapatkan meta-key yang bisa diterapkan.

Bacaan lebih lanjut:

Thomas Dickey
sumber