Eu tenho a seguinte linha em init.el
:
(global-set-key [(control \;)] 'comment-region)
Funciona muito bem na janela da GUI, mas se emacs
for chamado com a -nw
opção, C-;não comenta a região, apenas insere o ;
caractere. M-x comment-region RETfunciona bem no entanto.
Tentei seguir esta resposta em um problema semelhante, mas C-q C-;retorna apenas ;
e obviamente não quero vincular-me ;
.
Como alcançar o efeito desejado?
key-bindings
terminal
WeSenseASoulInSearchOfAnswers
fonte
fonte
C-;
combo e useM-x view-lossage
para ver se ele está chegando ao Emacs.gnome-terminal
eM-x view-lossage
retorna:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
C-;
mais do quec ;
(ou, pelo menos, eu entendoC-;
).Respostas:
Primeiro, a questão mais geral: os emuladores de terminal geralmente são limitados nas seqüências de controle e escape que podem enviar. Portanto: pode ser que o terminal engula seus caracteres especiais antes que eles cheguem ao Emacs. Como diagnóstico geral, você pode pressionar
C-h l
(ouM-x view-lossage
) para ver se suas combinações de teclas fazem parte do Emacs.Para mais discussões sobre esse problema, consulte este thread do Stack Overflow e os links nele.
Para resumir as idas e vindas dos comentários, seu problema específico sugere que é o terminal, e não o Emacs, que é o problema. Quando você tentou
C-;
e depoisM-x view-lossage
conseguiublah blah blah c ; ESC v i e w - l o s s a g e RET
. Isso parece um problema terminal: se a combinação de teclas chegasse ao Emacs, ac ;
parte seria parecidaC-;
.fonte
No Shift + Up não é reconhecido pelo Emacs em um terminal , explico como os terminais convertem a maioria das teclas de função em seqüências de escape, porque a interface entre aplicativos e terminais transmite caracteres (ou melhor, bytes), não chaves. Apenas algumas combinações de modificador + caractere têm seu próprio caractere:
@[\]^_
transformações em bytes de 0 a 31 (caracteres de controle ASCII ).Então, e outras combinações como Ctrl+ ;ou Ctrl+ Shift+ letter? Como não há caractere correspondente, o terminal precisa reutilizar um caractere ou enviar uma sequência de escape. Muitos terminais ignoram modificadores quando não há caracteres correspondentes, então você acaba com Ctrl+ ;envio
;
, Ctrl+ Shift+ letterequivalente a Ctrl+ letter, etc.Os fornecedores de terminais continuaram fazendo a coisa simples por um longo tempo. Não havia um padrão para seqüências de escape, que se perpetuavam - os fornecedores de terminais não o implementam, os aplicativos não o suportam, os usuários não esperam. Alguns emuladores de terminal podem ser configurados para enviar seqüências de escape arbitrárias; portanto, se o seu puder, você pode configurá-lo e declarar as seqüências de escape para o Emacs (mais sobre isso mais adiante).
Ultimamente, a situação está mudando, porque houve duas propostas para padronizar as seqüências de escape. Um deles é a libtermkey do LeoNerd, com a sintaxe . Outro é o xterm de Thomas Dickey com a sintaxe . As versões atuais do xterm (≥216) podem ser configuradas para qualquer uma das sintaxes, definindo o recurso; o recurso deve ser ativado definindo-o como um valor diferente de zero.
ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Se o seu emulador de terminal não suportar essas sintaxes, mas puder ser configurado, escolha um dos dois.
Desde o Emacs 24.4, o Emacs ativa automaticamente o
modifyOtherKeys
recurso quando detecta que o terminal é da versão xterm ≥216. Detecção de Emacs de seqüências de escape para as chaves codificar funciona através da variávellocal-function-key-map
. No Emacs 24.4, nem todas as seqüências de escape são suportadas. Você pode usar o seguinte código no seu arquivo init para concluir o trabalho.Se a
TERM
variável de ambiente não estiver definida comoxterm
ou uma variante comoxterm-256color
, o Emacs não ativará essas seqüências. Se o Emacs já tiver suporte para o seu valor deTERM
, você poderá adicionar suporte definindo uma função semelhante à acima, a ser executada após carregar o arquivo Lisp cujo nome é o valor deTERM
. Se o Emacs não tiver esse suporte, você poderá adicioná-lo criando um subdiretório chamadoterm
em algum lugar no seuload-path
e criando um arquivo Lisp chamadoterm/$TERM.el
where$TERM
é o valor deTERM
, definindo uma função chamadaterminal-init-$TERM
.Enquanto escrevo, parece que poucos emuladores de terminal, exceto o xterm, adotaram essas seqüências de escape. No OSX, você pode configurar o iTerm2 selecionando uma sequência de escape para cada combinação de teclas, uma por uma.
fonte
M-C-%
ser reconhecido comoESC 5
modifyOtherKeys
recurso não estiver ativo. Observe que ele é suportado apenas nas versões recentes o suficiente do xterm e só é ativado automaticamente desde o Emacs 24.4. Não sei se o OSX vem com versões recentes. Se não funcionar e não estiver funcionando para você, sugiro que faça uma nova pergunta. Mencione as versões que você está usando.A resposta de Gilles afirmou:
On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one.
Eu tive um pequeno problema para chegar lá, então aqui está uma explicação detalhada, caso você seja como eu, confusa.Se, ao executar o Emacs em um terminal (por exemplo, Terminal.app padrão do Mac),
C-x C-;
não executarcomment-line
, e você desejar essa funcionalidade, deverá mudar para o iTerm2 (o Terminal.app não tem capacidade) e criar um Mapeamento de Chaves em Perfis ... Teclas da seguinte maneira:Isso é feito clicando no
+
botão, que abre uma pequena janela chamada "Atalho do teclado"; esta janela possui inicialmente dois campos; a parte superior possui o valor "Clique para definir" e a parte inferior possui o valor "Ignorar". Clique no botão superior e digiteC-;
. Isso define a combinação de teclas que executará a ação e o código. Clique no campo inferior, "Ação", localize e clique em "Enviar sequência de escape", que está um pouco abaixo da metade. Depois que você clicar nele, um terceiro campo aparecerá, chamado "Esc +". Dentro deste campo, digite:O
59
código ASCII decimal da vírgula e5
o código paraCtrl
. Então pressione "OK" para finalizar. A combinação correta de teclas para a sequência de teclas agora será incluída nas preferências do iTerm2. Ao iniciar o Emacs no iTerm, você terá acesso àC-x C-;
funcionalidade.fonte