bash - ligações de sequência de chaves erradas com control + alt + space

3

Estou tentando instalar algumas ligações de sequência de teclas, mas tenho problemas. Meu shell é bash, meu terminal é gnome-terminal e meu sistema é o Ubuntu 14.04 no modo gráfico. Edit: meu teclado é francês azerty com o teclado numérico e ctrl, fn, super, alt.

Editar: um guia bash, capítulo readline

Eu quero adicionar contol + alt + espaço , mas esta sequência exata não funciona enquanto outras sequências funcionam bem. Meu objetivo é executar readline de linha de expansão de shell, mas tentei usar a palavra-maiúscula para comparar.

- Vamos analisar o efeito de instalação do meu objetivo.

Este é o meu ~/.inputrc adicionado ( ctrl + meta + espaço ):

"\e\C- ": shell-expand-line

Este é o novo resultado de bind -p :

"\e\C-@": shell-expand-line

É claro que eu iniciei alguns terminais, um antes da instalação e um após cada instalação para comparar completamente.

- Alguns experimentos para garantir o controle + alt funciona no lugar do controle + meta.

O sistema deve emular Meta com Alt e o bash deve emular Meta com Escape , ambos usando o byte '\ 033'. Eu tentei os dois Alt e Esc para concluir que funciona bem . Eu testei algumas sequências de ctrl + meta + letra para ter certeza.

A propósito, os exemplos individuais de Ctrl + Alt são simples: expandindo um til isolado '~' (linha de expansão do shell) ou alterando o caso aleatoriamente palavras minúsculas (palavra maiúscula) com ctrl + meta + e ou ctrl + meta + v . Ctrl + meta + e já está ligado à linha de expansão do shell, então eu apenas misturei as ligações com o inútil ctrl + meta + v .

- Algumas observações mais complicadas ...

Eu li '^ @' ilustra o caractere 'NUL'. Por que essa fuga?

Eu testei o xev e pressionei ctrl + alt + espaço : o caractere relatado é 'NUL'.

Eu vi o alt + space geralmente abrir o menu da janela do gnome-terminal, enquanto o alt ativa menus, é claro, sem a tecla control.

Um conflito parece vir do sistema, mas eu sou um novato. Acabei de ler a maior parte do manual bash (especialmente capítulo readline) e um conselho sobre o xev.

- Pergunta

Há mais a dizer ou corrigir? Por que as seqüências são reescritas? Como posso fazer o meu ctrl + alt + espaço funcionar com bash e gnome-terminal?

Edit: Eu descobri que '@' é transformado em 'NUL' por causa de uma máscara bit-a-bit aplicada ao escapar, mas não vejo razão alguma por que Alt + space dá 'NUL'.

    
por Link-akro 20.03.2015 / 22:41

2 respostas

1

Seu gnome-terminal (na verdade o vte-0.34 subjacente) emite a seqüência errada para ctrl + Alt + espaço . O bug ( link ) foi corrigido em vte-0.36.

Se você não tem medo de invadir um pouco e conseguir reverter as coisas em caso de problemas, você pode tentar instalar o vte-0.36 no seu Ubuntu 14.04. Você terá muitas outras correções e melhorias junto com essa. Você pode encontrar um PPA ou um pacote no Gnome3, ou compilá-lo para si mesmo. Atualizar para esta versão do vte não requer tocar em nenhum outro componente de software. Uma reinicialização completa do terminal gnome é necessária (feche todas as janelas).

    
por 22.04.2015 / 13:25
3

O emulador de terminal (Gnome-terminal, no seu caso) converte combinações de teclas como Ctrl + Alt + Espaço (que recebe como o Space keysym com os Ctrl e os meta modificadores são) em seqüências de bytes. Caracteres de texto como a e espaço são enviados como estão; chaves que não correspondem a caracteres são enviadas como caracteres de controle quando há um (por exemplo, byte 13 = retorno de carro = Retorno , byte 9 = tabulação = Tab ) e como seqüências de escape começando com byte 27 = escape se não houver. Alt + caractere é enviado como escape seguido por esse caractere (para todos os efeitos, em configurações típicas atualmente, trate "Alt" e "Meta" como sinônimos - não vou entrar nesse tópico em esta postagem). Veja também Como a entrada de teclado e a saída de texto funcionam?

Ctrl O caractere + é enviado como um caractere de controle se houver um (por exemplo, Ctrl + A ou Ctrl + Shift + A → byte 1 = ^ A). Não existe nenhum caractere de espaço de controle, mas por razões históricas, a combinação de teclas Ctrl + Espaço é normalmente transmitida como byte 0 = ^ @.

Você pode ver qual sequência de teclas o terminal envia pressionando Ctrl + V na linha de comando do bash, depois a tecla ou combinação de teclas em que você está interessado. > Ctrl + V informa ao bash para inserir o próximo caractere, seja ele qual for, em vez de interpretá-lo como um comando.

Seria lógico transmitir Ctrl + Alt + Espaço como a sequência de dois bytes 27, 0 = escape, ^ @. Infelizmente para você, o Gnome-terminal não faz isso, ele envia 27, 32 = escape, espaço em vez disso. Sequências de chaves enviadas pelo Gnome-terminal não podem ser configuradas (você precisaria corrigir a biblioteca VTE). Então, se você quiser usar Ctrl + Alt + Espaço no terminal, você tem várias possibilidades:

  • Use um emulador de terminal diferente. Existem cerca de 40 no Ubuntu.
  • Edite o código-fonte da biblioteca VTE para enviar uma sequência de escape diferente. Você pode sugerir isso como um aprimoramento.
  • Talvez use LD_PRELOAD para fazer o patch das chamadas do Gnome-terminal para o libvte. Não verifiquei se é prático e, de qualquer forma, seria complicado - se você se importa muito, use um emulador de terminal diferente.
  • Configure o gerenciador de janelas ou um programa externo para alterar Ctrl + Alt + Espaço para Esc Ctrl + Espaço quando uma janela do terminal Gnome está ativa. Isso não é fácil de fazer sem interromper outros aplicativos na maioria dos ambientes.

Em suma, se você quiser usar essa ligação, você precisará usar um emulador de terminal diferente, como xterm (onde as seqüências de escape para combinações de teclas são totalmente configuráveis).

    
por 22.03.2015 / 02:23