Qual é a meta-chave do bash?

16

Tentei usar xmodmappara mapear META_Lpara a MENUchave, mas ela não parece ser aceita bashcomo meta-chave. Então, eu estou querendo saber como esses componentes (teclado, X, xterm, bash) se relacionam com cada um deles, em relação às Meta e Super Teclas. Qualquer explicação seria apreciada.

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

Leo
fonte
Sua MENUchave é notada pelo X? Qual gerenciador de janelas você está usando - alguns deles podem ajudá-lo a redefinir suas chaves.
choroba

Respostas:

11

O mapeamento das teclas do teclado para os modificadores, como Metae Controlé tratado pelo servidor X (ou seja, a parte de baixo nível da GUI). Esse mapeamento pode ser manipulado por meio do xmodmapcomando de estilo antigo ou da interface XKB de estilo novo , ou por meio de ferramentas de configuração da GUI que usam um deles sob o capô.

Por padrão, na maioria das configurações, a Metachave é a chave Alt. Isso ocorre porque, historicamente, muitas estações de trabalho unix tinham uma chave rotulada Metaonde os PCs tinham uma chave rotulada Alt. Portanto, se você tem uma ligação M-C-y, pressione Ctrl+ Alt+ Y.

Para verificar quais são suas ligações atuais, inicie o xevprograma 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 de terminal correspondentes a terminais físicos) e aplicativos usa caracteres. Quando você pressiona A, o terminal recebe as informações “ Achave, sem modificador”, mas o que envia para o aplicativo em execução no terminal é o caractere a. Quando você pressiona uma tecla de função como Upou F1, não há caracteres correspondentes; o terminal envia uma sequência de caracteres começando com o caractere de escape (byte 27, às vezes escrito \eou ^[). Quando um emulador de terminal como o xterm recebe um evento de pressionamento de tecla com o Metamodificador, ele converte essa tecla em um caractere de escape seguido da função subjacente da tecla, por exemplo \ea(escape, a minúsculo) quando você pressiona Meta+ A.

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

Gilles 'SO- parar de ser mau'
fonte
5

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

Observe que nem todos os eventos são traduzidos diretamente em bytes pelo XTerm. Por exemplo, as teclas Ctrle shift, por si só, geram eventos do teclado X, mas o XTerm não envia nada para o shell (ou outro aplicativo) em execução nele. Isso também inclui a Metachave por si só, mas não a Menuchave. No entanto, o evento gerado ao pressionar Meta- efará com que o XTerm envie o byte 0xE5 ou a sequência de dois bytes 0x1B 0x65, dependendo da configuração do recurso XTerm.VT100.metaSendsEscape.

Urso de pelúcia
fonte
2

A meta-chave do Bash foi definida originalmente como esta ( 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.

É assim que é interpretado com ncurses e xterm . A poucos terminais previstos tornando este recurso opcional (esse aspecto não foi generalizada A maioria dos terminais você encontrará o uso comportamento codificado (e não muito interessante) As.. Terminfo documentos de página manual estas capacidades 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:

Se o terminal possui uma "meta-chave" que atua como uma tecla shift, configurando o 8º bit de qualquer caractere transmitido, esse fato pode ser indicado com km. Caso contrário, o software assumirá que o oitavo bit é paridade e geralmente será limpo. Se existirem cadeias para ativar e desativar esse "modo meta", elas podem ser fornecidas como smme rmm.

Um recurso diferente, prefixando um caractere de escape em resposta à Altchave, foi incorporado em alguns emuladores de terminal. O Bash (atualmente a readlinebiblioteca) documenta esse uso em seu registro de alterações 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 controle shift, você pressiona-o ao mesmo tempo que outra tecla e espera ver algo diferente de pressionar a tecla sozinha. X fornece chaves modificadoras atribuindo um bit ao valor do modificador passado no evento X da chave. As teclas pressionadas podem ser vários eventos X; X fornece funções para combinar esses eventos, mantendo os modificadores.

X também define símbolos para cada uma das teclas que podem aparecer no seu teclado. Ele fornece outros valores (como Unicode), com tratamento especial nas funções que combinam eventos.

Mas "meta" é um caso especial.

Os aplicativos X não têm metachave, exceto por convenção. X não tem uma definição para a meta chave ou o meta modificador. Convencionalmente, os terminais procuram a Alttecla -e / ou um dos modificadores conhecidos por xmodmap, por exemplo mod2,. O recurso posterior do xkb complica as coisas (mas não fornece melhorias em relação a esta discussão), fornecendo outra camada de informações para encontrar a Altchave.

A convenção, é claro, pode levá-lo apenas até agora, dado que nem xmodmapnem xkbsabemos nada em particular sobre a meta . O xterm, por exemplo, é configurável e nem todos os usuários desejam configurar a meta da mesma maneira. Por exemplo, Altpode não ser a meta-chave pretendida, por exemplo, se for usada no translationrecurso. Outra tecla pode ser a meta-chave, mas os usuários (especialmente aqueles que usam sequências de escape no bash) podem querer que um caractere de escape seja enviado ao pressionar Alt. Mas lembre-se de que, a menos que esteja configurado como um modificador, nada disso acontece: o xterm não combina eventos sozinho.

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

  • altIsNotMetae altSendsEscape(adicionado em 2007 ).
  • eightBitInputdesde 2006 corresponde ao sentido original do modo meta, e há uma sequência de escape definida para isso, que fornece os recursos do terminal smme rmm(definir / remover meta-modo).
  • eightBitInputfoi modificado em 2003 para levar em consideração o UTF-8, deslocando os valores Unicode decodificados por 128 em vez dos bytes de entrada brutos.
  • metaSendsEscapedata de 1999
  • eightBitInputé muito mais velho que metaSendsEscape. Isso implementou uma escolha entre o modo meta (adicionando o oitavo bit) ou o prefixo de uma chave escapedesde X11R4 (1989). Mas o recurso foi determinado na inicialização: foi verificado durante a inicialização para determinar se a entrada foi configurada para permitir 8 bits ou apenas 7. Depois disso, ela não foi alterada.

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

Leitura adicional:

Thomas Dickey
fonte