Como remover ligações à chave de prefixo ESC

9

Eu gostaria de usar a ESCchave em vez de C-gpara keyboard-quit. Minha abordagem ingênua de apenas fazer

(define-key global-map (kbd "ESC") 'keyboard-quit)

não funciona. ESCainda é uma tecla de prefixo e pressioná-lo não chama keyboard-quit.

Geier
fonte
1
Você pode estar interessado neste tópico relacionado - usei essa solução por cerca de um ano até me acostumar com Cg e ESC-ESC-ESC: Como usar <escape> (condicionalmente) como uma chave modificadora stackoverflow.com/a/20036348/ 2112489 A resposta de Stefan nesse segmento relacionado é o mesmo conceito usado pelo universal-argumentcom o universal-argument-map.
lawlist

Respostas:

7

Você pode fazer (define-key key-translation-map (kbd "ESC") (kbd "C-g")). Eu fiz o mesmo há muito tempo e não tive problemas.

Edite para melhorar a resposta de acordo com os comentários:

Se você deseja manter a ESCfuncionalidade principal, pode fazer

(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))

Uma coisa a observar é que, se o Emacs travar, você ainda precisará usar a C-gchave por algum motivo, mas isso raramente acontece.

clemera
fonte
1
@EmacsUser Mesmo que eu nunca pressione o ESC enquanto estiver usando o emacs?
Geier
1
@EmacsUser: Então? A partir de agora, nunca pressiono ESC uma vez, muito menos duas ou três vezes. Eu não vou sentir falta disso.
Geier
2
@EmacsUser Não estou dizendo que essa é a resposta correta e que quero usá-la, só quero entender o que há de errado com ela. O conjunto "no futuro, você não poderá pressionar ESC duas vezes" não me afeta em nada. Se você me disser sob quais condições eu poderia entrar em um loop infinito com isso e por que, isso seria realmente esclarecedor.
Geier
1
@ Gee Eu usei esse remapeamento por um longo tempo e nunca encontrei nenhum problema com ele. A única coisa é que, se o emacs travar, é necessário pressionar C-gpara liberá-lo, o ESCremapeamento não funciona nesse caso.
Clemera
1
@EmacsUser Eu nunca tive um caso de uso, ESCentão isso não me incomodou. Mas se você precisar, pode fazer outra tradução, por exemplo(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))
clemera 15/08/2015
8

Meu conselho seria deixar em ESCpaz, porque é uma chave especial.

Por padrão, o Emacs usa ESC(ASCII 27) como o meta-prefix-key. No Manual Elisp:

'esc-map' é o mapa de teclas global para a chave de prefixo. Assim, as definições globais de todos os meta caracteres são realmente encontradas aqui. Este mapa também é a definição de função do 'prefixo ESC'.

e

Em vez disso, os meta caracteres são considerados para fins de pesquisa de chaves como sequências de dois caracteres, o primeiro dos quais é ESC (ou qualquer que seja o valor atual de 'meta-prefix-char'). Assim, a chave 'M-a' é representada internamente como 'ESC a', e sua ligação global é encontrada no slot para 'a' no 'esc-map'.

Portanto, para usar o ESC para outra coisa, você precisará definir meta-pefix-keyoutra coisa e também vincular alguma outra chave ESC-prefix. Também pode haver outras alterações necessárias - nunca tentei isso.

Para mais informações meta-prefix-char, consulte Funções para pesquisa de chaves no manual Elisp.

glucas
fonte
1
+1. Você não remover a ligação do ESC. Ligue outra chave keyboard-quit, se quiser. E esteja ciente de que ESC ESC ESCjá lhe fornece o comportamento de escape que você deseja - consulte o manual do Emacs, nó Quitting .
Tirou
2
Definir meta-prefix-charcomo nilno OSX não impedirá que ele seja uma chave de prefixo - apenas o separará da meta-chave. No OSX com uma versão gráfica do Emacs, eu gosto de separar a chave de escape da meta-chave - defino (setq meta-prefix-char nil)no início da minha inicialização para que todas as bibliotecas carregadas posteriormente entendam o que eu quero. Isso me permite usar a meta-chave como chave de prefixo e a tecla de escape como uma chave de prefixo. O esc-mapé definido no nível do código-fonte C dentro keymap.c. Ele deve ser usado como uma chave de prefixo.
lawlist
@lawlist Interessante - então você mapeia meta para ser o esc-mapprefixo para preservar as ligações M padrão?
glucas
Eu acho que essa é a configuração relevante no OSX:, o (setq ns-alternate-modifier 'meta)que torna a meta a tecla alt esquerda no teclado da Apple. Eu gosto de usar a tecla alt à direita para criar caracteres unicode usando as configurações padrão do OSX: (setq ns-right-alternate-modifier 'none)- para inserir caracteres em espanhol, símbolos de parágrafos, etc. Ao criar --with-ns, as teclas alt esquerda e direita são definidas como meta. A configuração padrão vincula a chave de escape à meta-chave no OSX usando o meta-prefix-char, que é 27como você afirmou.
lawlist
5
Use emacs, eles dizem. É extensível, eles dizem. Você não precisa se ajustar a isso, ele se ajusta a você, dizem eles. Ou seja, ele só se ajusta a você se você deseja escapar de uma situação pressionando ESC três vezes. Como alguém no passado pensava que o ESC era uma tecla tão desconhecida (é apenas no canto superior esquerdo de cada teclado) que é melhor amarrá-la com a tecla Meta :-(.
Geier
1

Resposta adorável aqui: https://superuser.com/a/945245/624661

Citação:

Você pode usar isso no seu arquivo Emacs init:

;;; esc always quits
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
(global-set-key [escape] 'keyboard-quit)
Ole
fonte
0

Você deseja ligar [escape], não (kbd "ESC"), como mostram as ligações referenciadas por Ole . Em estoque, isso funcionará apenas se o emacs frames em um sistema de janelas. Eu acho que isso vale um pouco de explicação.

(kdb "ESC")significa, na verdade, o caractere de controle ASCII ESCe, como glucas mencionou, você certamente não deseja remapear este. Mas Escnão é ASCII ESC: é símbolo escape, pelo menos em um ambiente gráfico. Como ocorre que a ligação (kbd "ESC")afeta Escentão? Isso acontece porque o emacs se traduz escapeem ESC se não houver ligação disponível paraescape . Tipo de fallback, se desejar (que é implementado por meio de local-function-key-mapse você estiver interessado em tais coisas).

Assim, quando você se liga [escape], você está seguro e não precisa se preocupar ESC; além de suas próprias ligações, você apenas precisa aumentar os mapas de teclas que indicam ESCquando eles significam [escape].

Hmm ... bem, quase. Por que esses mapas não são usados [escape]na primeira vez? Porque isso não vai funcionar em um terminal. Se você deseja Esctrabalhar em um dispositivo desse tipo, terá pelo menos para personalizar seu terminal antes.

A história do terminal é relatada em outro post: Como vincular C- [de verdade? . O que você precisa fazer é dizer ao terminal para enviar uma sequência personalizada quando Escpressionado e, em seguida, mapeá-la para [escape]um estágio inicial de entrada no emacs (the input-decode-map).

Espero que isto ajude.

Champignac
fonte