Qual è la meta chiave di bash?


16

Ho provato a usare xmodmapper mappare META_Lla MENUchiave, ma non sembra essere accettato bashcome meta-chiave. Quindi, mi chiedo in che modo questi componenti (tastiera, X, xterm, bash) si relazionano con ciascuno per quanto riguarda i tasti Meta e Super. Qualsiasi spiegazione sarebbe apprezzata.

Vorrei dirlo in un altro modo. La pagina man di bash dice, ad esempio, che la funzione yank-nth-arg è legata M-C-ye funziona quando premo Esc-Control-y. Ma lo trovo un po 'ingombrante. Quindi, come posso fare in modo che bash accetti un'altra chiave come Meta(come la Menu) per tutti i suoi collegamenti predefiniti?


La tua MENUchiave viene notata anche da X? Quale gestore di finestre stai usando - alcuni di essi possono aiutarti a ridefinire le tue chiavi.
Choroba,

Risposte:


11

La mappatura dai tasti della tastiera ai modificatori piace Metaed Controlè gestita dal server X (ovvero la parte di basso livello della GUI). Questa mappatura può essere manipolata tramite il xmodmapcomando vecchio stile o l' interfaccia XKB di nuovo stile , oppure tramite uno strumento di configurazione della GUI che utilizza uno di questi sotto il cofano.

Per impostazione predefinita, sulla maggior parte delle configurazioni, la Metachiave è la chiave etichettata Alt. Questo perché, storicamente, molte workstation unix avevano una chiave etichettata in Metacui i PC hanno una chiave etichettata Alt. Quindi, se hai un'associazione per M-C-y, premi Ctrl+ Alt+ Y.

Per verificare quali sono i collegamenti correnti, avviare il xevprogramma in un terminale. Con la finestra xev focalizzata, premere i tasti; vedrai una trascrizione degli eventi generati nel terminale.

La comunicazione tra emulatori di terminale (o dispositivi terminali corrispondenti a terminali fisici) e applicazioni utilizza caratteri. Quando si preme A, il terminale riceve l'informazione " Achiave, nessun modificatore", ma ciò che invia all'applicazione in esecuzione nel terminale è il carattere a. Quando si preme un tasto funzione come Upo F1, non viene visualizzato alcun carattere corrispondente; il terminale invia una sequenza di caratteri che inizia con il carattere di escape (byte 27, talvolta scritto \eo ^[). Quando un emulatore di terminale come xterm ha ricevuto un evento di pressione dei tasti con il Metamodificatore, traduce quel tasto in un carattere di escape seguito dalla funzione sottostante del tasto, ad esempio \ea(escape, lettera minuscola a) quando si preme Meta+ A.

Qual è la differenza esatta tra un 'terminale', una 'shell', una 'tty' e una 'console'? può essere utile sfondo.


5

L'evento chiave viene generato dal server X (come configurato da xmodmap) e viene inviato all'applicazione X. Il tuo gestore di finestre potrebbe intercettarlo prima che venga inviato a xterm. XTerm, a sua volta, traduce l'evento in alcuni byte e invia i byte alla pseudo-tty allocata dalla shell, bash.

Si noti che non tutti gli eventi vengono tradotti direttamente in byte da XTerm. Ad esempio, i tasti Ctrle shift, da soli, generano eventi da tastiera X, ma XTerm non invia nulla alla shell (o altra applicazione) in esecuzione al suo interno. Questo include anche la Metachiave da sola, ma non la Menuchiave. Tuttavia, l'evento generato premendo Meta- efarà in modo che XTerm invii il byte 0xE5 o la sequenza a due byte 0x1B 0x65, a seconda dell'impostazione della risorsa XTerm.VT100.metaSendsEscape.


2

La meta chiave di Bash era originariamente definita in questo modo ( 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.

Questo sembra essere il modo in cui viene interpretato ncurses e xterm . A pochi terminali previsti per rendere questa funzione opzionale (questo aspetto non era diffusa La maggior parte dei terminali si incontreranno uso comportamento hardcoded (e non molto interessante) I.. Terminfo documenti delle pagine di manuale queste capacità del terminale:

   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)

e spiega la funzione:

Se il terminale ha una "meta chiave" che funge da tasto shift, impostando l'ottavo bit di qualsiasi carattere trasmesso, questo fatto può essere indicato con km. Altrimenti, il software supporrà che l'ottavo bit sia parità e che di solito verrà cancellato. Se esistono stringhe per attivare e disattivare questa "meta-modalità", possono essere fornite come smme rmm.

Una funzione diversa, che precede un carattere di escape in risposta a Alt chiave, è stata incorporata in alcuni emulatori di terminale. Bash (in realtà la readlinebiblioteca) documenta tale utilizzo nel suo log delle modifiche del 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 è un caso speciale di un tasto modificatore . Come controle shift, lo premi contemporaneamente a un altro tasto e ti aspetti di vedere qualcosa di diverso dalla pressione del tasto da solo. X fornisce i tasti modificatori assegnando un bit nel valore del modificatore passato nell'evento X per il tasto. I tasti premuti possono essere più eventi X; X fornisce funzioni per combinare questi eventi mantenendo i modificatori.

X definisce anche simboli per ciascuno dei tasti che potrebbero apparire sulla tastiera. Fornisce altri valori (come Unicode) mediante una gestione speciale nelle funzioni che combinano eventi.

Ma "meta" è un caso speciale.

Le applicazioni X non hanno metachiave, se non per convenzione. X non ha una definizione per la meta chiave o il meta modificatore. Convenzionalmente, i terminali cercano il Alttasto-e / o uno dei modificatori noti xmodmap, ad esempio mod2. Più tardi funzione xkb complica le cose (ma non fornisce alcun miglioramento rispetto a questa discussione) fornendo un altro livello di informazioni per trovare la Altchiave.

La convenzione ovviamente può portarti solo così lontano, dato che né xmodmapxkbsapere nulla in particolare sulla meta . xterm, per esempio, è configurabile e non tutti gli utenti vogliono configurare meta allo stesso modo. Ad esempio, Altpotrebbe non essere la meta-chiave desiderata, ad esempio se viene utilizzata nella translationrisorsa. Un'altra chiave potrebbe essere la meta-chiave, ma gli utenti (in particolare quelli che usano sequenze di escape in bash) potrebbero voler inviare un carattere di escape quando premono Alt. Ma tieni presente che a meno che non sia configurato come a modificatore, nulla di tutto ciò accade: xterm non combina gli eventi da solo.

xterm ha diverse impostazioni delle risorse (documentate nella pagina del manuale ):

  • altIsNotMetae altSendsEscape(aggiunto nel 2007 ).
  • eightBitInputdal 2006 corrisponde al senso originale della meta-modalità, e per questo esiste una sequenza di escape che fornisce le funzionalità del terminale smme rmm(imposta / rimuovi meta-modalità).
  • eightBitInputè stato modificato nel 2003 per tenere conto di UTF-8 spostando i valori Unicode decodificati di 128 anziché i byte di input non elaborati.
  • metaSendsEscape date da 1999
  • eightBitInputè molto più vecchio di metaSendsEscape. Ciò ha implementato una scelta tra la modalità meta (aggiungendo l'ottavo bit) o ​​il prefisso di una chiave conescape da X11R4 (1989). Ma la funzione è stata determinata all'avvio: è stata verificata durante l'inizializzazione per determinare se l'ingresso era impostato per consentire 8 bit o solo 7. Successivamente, non è cambiato.

Alcune persone identificano i due ( ottavo bit e prefisso di escape), riferendosi a quest'ultimo come meta mode. A seconda del punto di vista sull'argomento, ileightBitInput impostazione delle risorse di xterm fa parte della soluzione per ottenere una meta-chiave realizzabile.

Ulteriori letture:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.