Qual é a meta key do bash?

12

Eu tentei usar xmodmap para mapear META_L para a tecla MENU , mas ela não parece ser aceita por bash como a chave meta. Então, eu estou querendo saber como esses componentes (teclado, X, xterm, bash) se relacionam com cada um no que diz respeito a Meta e Super-chaves. Qualquer explicação seria apreciada.

Deixe-me colocar isso de outra maneira. A página man bash diz, por exemplo, que a função yank-nth-arg está ligada a M-C-y e funciona quando pressiono Esc-Control-y . Mas acho isso um pouco complicado. Então, como posso fazer o bash aceitar outra chave como Meta (como o Menu ) para todas as suas ligações padrão?

    
por Leo 13.01.2012 / 04:44

3 respostas

10

O mapeamento das teclas do teclado para modificadores como Meta e Control é manipulado pelo servidor X (ou seja, a parte de baixo nível da GUI). Esse mapeamento pode ser manipulado por meio do comando de estilo antigo xmodmap ou a interface do novo estilo XKB , ou através de ferramentas de configuração GUI que usem um desses recursos.

Por padrão, na maioria das configurações, a tecla Meta é a chave Alt . Isto é porque, historicamente, muitas estações de trabalho unix tinham uma chave rotulada Meta onde os PCs tinham uma chave rotulada Alt . Portanto, se você tiver uma ligação para M-C-y , pressione Ctrl + Alt + Y .

Para verificar quais são suas ligações atuais, inicie o programa xev em um terminal. Com a janela xev focada, pressione as teclas; você verá uma transcrição dos eventos gerados no terminal.

A comunicação entre emuladores de terminal (ou dispositivos terminais correspondentes a terminais físicos) e aplicativos usa caracteres. Quando você pressiona A , o terminal recebe as informações “ A key, no modifier”, mas o que ele envia para o aplicativo em execução no terminal é o caractere a . Quando você pressiona uma tecla de função como Up ou F1 , não há caractere correspondente; o terminal envia uma sequência de caracteres começando com o caractere de escape (byte 27, às vezes escrito \e ou ^[ ). Quando um emulador de terminal, como xterm, recebe um evento de pressionamento de tecla com o modificador Meta , ele traduz essa chave para um caractere de escape seguido pela funo subjacente da chave, e. \ea (escape, minúscula a) quando você pressiona Meta + A .

Qual é a diferença exata entre um 'terminal', um 'shell', um 'tty' e um 'console'? pode ser um plano de fundo útil.

    
por 14.01.2012 / 02:27
5

O evento-chave é gerado pelo servidor X (conforme configurado por xmodmap ) e é enviado para seu aplicativo X. Seu gerenciador de janelas pode interceptar isso antes de ser enviado para o xterm. O XTerm, por sua vez, traduz o evento para alguns bytes e envia os bytes para o pseudo-tty alocado pelo seu shell, bash.

Por favor, note que nem todos os eventos são traduzidos diretamente para bytes pelo XTerm. Por exemplo, as teclas Ctrl e shift , por si só, geram X eventos de teclado, mas o XTerm envia nada para o shell (ou outra aplicação) correndo dentro dele. Isto também inclui a chave Meta , mas não a tecla do Menu . No entanto, o evento gerado pressionando Meta - e fará com que o XTerm envie o byte 0xE5 ou a seqüência de dois bytes 0x1B 0x65, dependendo do recurso XTerm.VT100.metaSendsEscape. configuração.

    
por 13.01.2012 / 10:08
2

A meta-chave originalmente foi definida assim ( 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.

Por acaso, é assim que é interpretado com ncurses e xterm . Um poucos terminais fornecidos para tornar esse recurso opcional (esse aspecto não era difundido. A maioria dos terminais que você encontrará usa um comportamento codificado (e não muito interessante). terminfo documenta esses recursos do 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)

e explica o recurso:

If the terminal has a "meta key" which acts as a shift key, setting the 8th bit of any character transmitted, this fact can be indicated with km. Otherwise, software will assume that the 8th bit is parity and it will usually be cleared. If strings exist to turn this "meta mode" on and off, they can be given as smm and rmm.

Um recurso diferente, o prefixo de um caractere de escape em resposta à chave Alt foi incorporado em alguns emuladores de terminal. Bash (na verdade, a biblioteca readline ) documenta esse uso em seu changelog 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 é um caso especial de uma tecla modificadora . Como control e shift , você pressiona ao mesmo tempo que outra tecla e espera ver algo diferente de pressionar a tecla por si só. X fornece chaves modificadoras atribuindo um bit no valor do modificador passado no evento X da chave. Prensas de tecla podem ser múltiplos eventos X; X fornece funções para combinar esses eventos enquanto mantém os modificadores.

X também define símbolos para cada uma das chaves que podem aparecer no seu teclado. Ele fornece outros valores (como Unicode) por manipulação especial nas funções que combinam eventos.

Mas "meta" é um caso especial.

As aplicações X não possuem uma chave meta , exceto por convenção. X não possui uma definição para a meta-chave ou o modificador meta. Convencionalmente, os terminais procuram a tecla Alt e / ou um dos modificadores conhecidos por xmodmap , por exemplo, mod2 . O último recurso xkb complica as coisas (mas não fornece melhorias em relação a esta discussão) fornecendo outra camada de informação para encontrar a tecla Alt .

A convenção só pode levá-lo até agora, dado que nem xmodmap nem xkb sabem alguma coisa em particular sobre meta . O xterm, por exemplo, é configurável, e nem todos os usuários querem configurar o meta da mesma maneira. Por exemplo, Alt pode não ser a meta-chave pretendida, por exemplo, se for usada no recurso translation . Outra chave pode ser a meta key, mas os usuários (particularmente aqueles que usam sequências de escape no bash) podem querer que um caractere de escape seja enviado quando pressionar Alt . Mas tenha em mente que, a menos que seja configurado como um modificador , nada disso acontece: o xterm não combina eventos sozinho.

O xterm tem várias configurações de recursos (documentadas na página de manual ):

  • altIsNotMeta e altSendsEscape (adicionado em 2007 ).
  • eightBitInput desde 2006 corresponde ao sentido original do meta-modo, e há uma seqüência de escape definida para isso, que fornece os recursos de terminal smm e rmm (definir / remover meta-modo).
  • eightBitInput foi modificado em 2003 para levar em consideração o UTF-8 alterando os valores Unicode decodificados por 128, em vez dos bytes de entrada brutos.
  • metaSendsEscape datas de 1999
  • eightBitInput é muito mais antigo que metaSendsEscape . Isso implementou uma escolha entre o modo meta (adicionando o oitavo bit) ou prefixando uma chave com escape desde o X11R4 (1989). Mas o recurso foi determinado na inicialização: ele foi verificado durante a inicialização para determinar se a entrada foi definida para permitir 8 bits ou apenas 7. Depois disso, ela não mudou.

Algumas pessoas igualam os dois ( 8-bit e prefixo-escape), referindo-se a este último como modo meta . Dependendo do seu ponto de vista sobre o assunto, a configuração de recurso eightBitInput do xterm é parte da solução para obter uma meta-chave viável.

Leitura adicional:

por 29.02.2016 / 11:28