¿Cuál es la meta clave de bash?

16

Traté de usar xmodmappara asignar META_La la MENUclave, pero no parece ser aceptado por bashla meta clave. Por lo tanto, me pregunto cómo estos componentes (teclado, X, xterm, bash) se relacionan entre sí en lo que respecta a las Meta y Super Teclas. Cualquier explicación sería apreciada.

Dejame poner esto de otro modo. La página de manual de bash dice, por ejemplo, que la función yank-nth-arg está vinculada M-C-yy funciona cuando presiono Esc-Control-y. Pero esto me parece un poco engorroso. Entonces, ¿cómo puedo hacer que bash acepte otra clave como Meta(como la Menu) para todos sus enlaces predeterminados?

León
fuente
¿Tu MENUclave es notada por X? ¿Qué administrador de ventanas está utilizando? Algunos de ellos pueden ayudarlo a redefinir sus claves.
choroba

Respuestas:

11

El mapeo de las teclas del teclado a los modificadores gusta Metay Controles manejado por el servidor X (es decir, la parte de bajo nivel de la GUI). Este mapeo se puede manipular a través del xmodmapcomando de estilo antiguo o la interfaz XKB de estilo nuevo , o mediante herramientas de configuración de GUI que utilizan uno de estos bajo el capó.

Por defecto, en la mayoría de las configuraciones, la Metaclave es la clave etiquetada Alt. Esto se debe a que históricamente, muchas estaciones de trabajo Unix tenían una clave etiquetada Metadonde las PC tienen una clave etiquetada Alt. Entonces, si tiene un enlace para M-C-y, presione Ctrl+ Alt+ Y.

Para verificar cuáles son sus enlaces actuales, inicie el xevprograma en un terminal. Con la ventana xev enfocada, presione las teclas; verá una transcripción de los eventos generados en la terminal.

La comunicación entre emuladores de terminal (o dispositivos de terminal correspondientes a terminales físicos) y aplicaciones utiliza caracteres. Cuando presiona A, el terminal recibe la información " Aclave, sin modificador", pero lo que envía a la aplicación que se ejecuta en el terminal es el carácter a. Cuando presiona una tecla de función como Upo F1, no hay un carácter correspondiente; el terminal envía una secuencia de caracteres que comienza con el carácter de escape (byte 27, a veces escrito \eo ^[). Cuando un emulador de terminal como xterm recibió un evento de presionar una tecla con el Metamodificador, traduce esa tecla a un carácter de escape seguido de la función subyacente de la tecla, por ejemplo \ea(escape, minúscula a) cuando presiona Meta+ A.

¿Cuál es la diferencia exacta entre un 'terminal', un 'shell', un 'tty' y una 'consola'? puede ser útil fondo.

Gilles 'SO- deja de ser malvado'
fuente
5

El evento clave es generado por el servidor X (como lo configuró xmodmap) y se envía a su aplicación X. Su administrador de ventanas podría interceptar esto antes de enviarlo a xterm. XTerm, a su vez, traduce el evento a algunos bytes y los envía a la pseudo-tty asignada por su shell, bash.

Tenga en cuenta que XTerm no traduce todos los eventos directamente a bytes. Por ejemplo, las teclas Ctrly shift, por sí mismas, generan eventos de teclado X, pero XTerm no envía nada al shell (u otra aplicación) que se ejecuta dentro de él. Esto también incluye la Metaclave por sí misma, pero no la Menuclave. Sin embargo, el evento generado al presionar Meta- ehará que XTerm envíe el byte 0xE5 o la secuencia de dos bytes 0x1B 0x65, dependiendo de la configuración del recurso XTerm.VT100.metaSendsEscape.

Osito de peluche
fuente
2

La meta clave de Bash se definió originalmente de esta manera ( 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.

Esa es la forma en que se interpreta con ncurses y xterm . Se proporcionaron algunos terminales para hacer que esta función sea opcional (ese aspecto no estaba muy extendido. La mayoría de los terminales que encontrará utilizan un comportamiento codificado (y no muy interesante). La página del manual de terminfo documenta estas capacidades de 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)

y explica la característica:

Si el terminal tiene una "meta clave" que actúa como una tecla shift, configurando el octavo bit de cualquier carácter transmitido, este hecho se puede indicar con km. De lo contrario, el software asumirá que el octavo bit es paritario y generalmente se borrará. Si existen cadenas para activar y desactivar este "modo meta", se pueden asignar como smmy rmm.

Se incorporó una característica diferente, prefijando un carácter de escape en respuesta a la Altclave en algunos emuladores de terminal. Bash (en realidad la readlinebiblioteca) documenta ese uso en su registro de cambios de 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 es un caso especial de una tecla modificadora . Al igual que controly shift, lo presiona al mismo tiempo que otra tecla y espera ver algo diferente de presionar la tecla por sí mismo. X proporciona claves modificadoras asignando un bit en el valor modificador pasado en el evento X para la clave. Las pulsaciones de teclas pueden ser múltiples eventos X; X proporciona funciones para combinar estos eventos mientras retiene los modificadores.

X también define símbolos para cada una de las teclas que pueden aparecer en su teclado. Proporciona otros valores (como Unicode) mediante un manejo especial en las funciones que combinan eventos.

Pero "meta" es un caso especial.

Las aplicaciones X no tienen metaclave, excepto por convención. X no tiene una definición para la metaclave o el meta modificador. Convencionalmente, los terminales buscan la Alttecla y / o uno de los modificadores se sabe que xmodmap, por ejemplo, mod2. La característica posterior de xkb complica las cosas (pero no proporciona ninguna mejora en relación con esta discusión) al proporcionar otra capa de información para encontrar la Altclave.

La convención, por supuesto, puede llevarte solo hasta cierto punto, dado que xmodmapni xkbsabe nada en particular sobre meta . xterm, por ejemplo, es configurable y no todos los usuarios desean configurar meta de la misma manera. Por ejemplo, Altpuede no ser la metaclave deseada, por ejemplo, si se usa en el translationrecurso. Otra tecla puede ser la meta tecla, pero los usuarios (particularmente aquellos que usan secuencias de escape en bash) pueden querer que se envíe un carácter de escape cuando presionan Alt. Pero tenga en cuenta que a menos que esté configurado como un modificador, nada de eso sucede: xterm no combina eventos por sí mismo.

xterm tiene varias configuraciones de recursos (documentadas en la página del manual ):

  • altIsNotMetay altSendsEscape(agregado en 2007 ).
  • eightBitInputdesde 2006 corresponde al sentido original del modo meta, y hay una secuencia de escape definida para esto que proporciona las capacidades del terminal smmy rmm(establecer / eliminar el modo meta).
  • eightBitInputse modificó en 2003 para tener en cuenta UTF-8 cambiando los valores Unicode decodificados por 128 en lugar de los bytes de entrada sin formato.
  • metaSendsEscapedata de 1999
  • eightBitInputes mucho mayor que metaSendsEscape. Eso ha implementado una opción entre el modo meta (agregando el octavo bit) o ​​prefijando una clave escapedesde X11R4 (1989). Pero la característica se determinó al inicio: se verificó durante la inicialización para determinar si la entrada se configuró para permitir 8 bits o solo 7. Después de eso, no cambió.

Algunas personas equiparan los dos ( 8th-bit y escape-prefix), refiriéndose a este último como meta modo. Dependiendo de su punto de vista sobre el asunto, la eightBitInputconfiguración de recursos de xterm es parte de la solución para obtener una metaclave viable.

Otras lecturas:

Thomas Dickey
fuente