Use Super no emacs -nw no linux

15

Tenho lutado para encontrar uma pergunta simples e direta à resposta e, portanto, decidi fazer aqui.

P: Existe uma maneira de usar o Super no Emacs lançado em um terminal no Linux?

PS : Eu li muitas informações, xmodmapmas acho que a chave é que o emulador de terminal não pode representar a tecla Super. No entanto, (kbd "s-SPC")retorna algo e eu estava pensando em usar o recurso de tradução de .Xdefaults/X. Estou no caminho certo? Dado o resultado de kbd, o que preciso colocar como tradução XTerm.VT100.?

Andrea Richiardi
fonte

Respostas:

21

Você estará mais confortável em um X11 Emacs, que pode receber entrada do teclado e exibir texto sem passar pela codificação e decodificação do terminal . O principal motivo para usar um editor de modo de texto é executá-lo na tela ou tmux em uma máquina remota, mas graças ao Tramp, geralmente é mais fácil editar o arquivo remoto no Emacs local. Dito isto, você pode fazer o que quiser, desde que o emulador de terminal coopere, como é o caso do Xterm.

Quando você pressiona uma tecla ou combinação de teclas em um terminal, ele é transmitido ao aplicativo em execução no terminal como uma sequência de um ou mais caracteres. Por exemplo, quando você pressiona a, o aplicativo recebe a. Quando você pressiona Enter, o aplicativo recebe o caractere CR(aka ^M(pronunciado “control-emm”), também conhecido como número 13, aka \rou \015). As combinações de teclas envolvendo Altsão normalmente transmitidas como o caractere ESC(também ^[conhecido como \eou \033) seguido pela sequência da combinação de teclas ou teclas sem Alt. As teclas de função e outras combinações de teclas são transmitidas como seqüências de escape começando com \e[ou \eO.

As seqüências de escape não são totalmente padronizadas e os terminais geralmente ignoram certos atributos para determinadas chaves. Por exemplo, os hiper e super modificadores geralmente são ignorados. Você pode ver o que o seu terminal envia para uma combinação de teclas pressionando Ctrl+ Vseguido por essa combinação de teclas em um prompt de shell ou C-qou C-h cseguido pela combinação de teclas no Emacs.

Xterm permite configurar as sequências de escape para cada tecla através de recursos X . A maioria das configurações lê recursos a partir do ~/.Xresourcesmomento em que o X é iniciado e você pode carregar o arquivo manualmente com xrdb -merge ~/.Xresources.

XTerm.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <Key> Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <Key> percent: string("\033[37;6~")

Uma convenção comum usa seqüências de escape do formulário ESC [ number1 ; number2 ~para teclas de função com modificadores. number1indica a tecla de função ( 15para 24para F5a F12- por razões históricas, F1 a F4ter sequências de escape diferentes) e number2indica o modificador ( 2para Shift, 5para Ctrl, 3para Meta, 8para Ctrl+ Meta, e adicione 1 para + Shift- não, não é muito consistente).

Você precisará especificar os modificadores Hyper e Super através do seu número, como Mod1através Mod5. Execute xmodmap -pmpara ver o mapeamento de academias de teclas para modificadores. Por exemplo, se Super_Lestiver associado ao Mod5, a seguinte linha (use exatamente esse caso) define uma ligação para Super+ Space:

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

O Emacs converte seqüências de escape em sua representação interna de chave através input-decode-mapoulocal-function-key-map (ou function-key-mapantes do Emacs 23).

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

Esta publicação é composta por 80% de material reciclado. Existem terminais Linux que podem lidar com todas as combinações de teclas?

Gilles 'SO- parar de ser mau'
fonte
Esta é uma ótima resposta, abrangendo todo o conhecimento que encontrei um pouco disperso. Apenas uma pergunta: onde você encontrou / como escolheu 32; 16 ~ e por que não está de acordo com a ligação do emacs abaixo? Entendi a origem dos números, mas gostaria de perguntar se você pode vincular a uma tabela de mapeamento em algum lugar para number1 e number2 .
Andrea Richiardi
@AndreaRichiardi Escolhi 32 porque é o valor ASCII / Unicode para o caractere de espaço e 16 porque as ligações padrão usam valores de até 8 para Ctrl, Meta e Shift. Os 33 abaixo foram um erro de digitação. Você pode escolher qualquer coisa, desde que não entre em conflito com outras chaves.
Gilles 'SO- stop be evil'
Eu tive que vincular a sequência a uma função, então resolvi momentaneamente (global-set-key "\033[32;16~" 'set-rectangular-region-anchor). Mas, para ser completo, tentei o que você disse define-keyacima, mas não pude acionar (global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor). Estava apenas imprimindo; 16 ~ no buffer. Teria sido bom vincular essa sequência a (kbd "s-SPC") para que eu tenha a sequência de teclas vinculada e possa atribuí-la novamente a outros comandos.
Andrea Richiardi
C-h lretorna o seguinte pressionando s-SPC agora: ESC [ 3 2 ; 1 6 ~mas o emacs ainda reclama disso #M-[ 32 is undefined
Andrea Richiardi
@AndreaRichiardi Depois de corrigir mais erros de digitação na parte xterm (que você parece ter corrigido desde que o Emacs recebe a sequência de caracteres pretendida), funciona para mim. Funciona se você usar em function-key-mapvez de local-function-key-map? Pode ser uma questão de quando você definir local-function-key-map, pois depende do terminal.
Gilles 'SO- stop be evil'
0

Se você deseja instalar um pacote Emacs e configurar seu terminal, escrevi um pacote Emacs que pode ensinar ao Emacs e aos terminais como reconhecer corretamente todas as teclas do teclado do PC e combinações de teclas modificadoras:

https://github.com/CyberShadow/term-keys

A codificação do super modificador não está ativada por padrão, mas o pacote é personalizável e permite configurar quais combinações de teclas modificadoras são codificadas. Para habilitar combinações de teclas de codificação que incluem o Super modificador, defina term-keys/want-key-p-funcuma função que retorne tquando (elt mods 3)não for nula (consulte a implementação padrão para obter uma explicação).

Vladimir Panteleev
fonte
0

Eu tenho o seguinte nos meus arquivos init:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

Isso me permite enviar teclas super e hiper usando as teclas de função.

Realraptor
fonte
-1

Resposta curta: use Konsole.

Explicação:

  • O Emacs ' local-function-key-maptem um mapeamento de entrada C-x @ spara event-apply-super-modifier.
  • Konsolemapeia Super(a tecla do logotipo do Windows) para a sequência de escape ^X@s(que parece não estar documentada em nenhum lugar, descobri-a por acaso). Você pode tentar isso abrindo Konsolee pressionando, por exemplo Ctrl-v Win-o.
ubolonton
fonte
Obrigado pela resposta, mas alterar o termo não é a solução que estou procurando.
Andrea Richiardi