É possível fazer com que o ESC se comporte como uma chave de escape real?

3
Então eu finalmente mudei para o Emacs, não tanto porque eu ainda estou convencido de que é o melhor editor, mas porque certamente tem extensões mais poderosas. Eu ainda estou usando o modo-vim , talvez isso seja parte do meu problema ... mas eu realmente não pretendo abandonar a abordagem dos modos, então provavelmente vou ficar com ele.

Estou me dando muito bem, mas uma coisa que eu acho realmente desconcertante é o comportamento da tecla esc (que eu tenho na posição shift-lock ) . Eu estou acostumado a confiar muito nisso como mais ou menos uma "tecla de pânico", o que pode não ser legal, mas acho que me permite trabalhar um pouco menos com os pressionamentos de teclas, e portanto mais rápido.

O que eu gostaria que essa chave fizesse é me tirar de qualquer minibuffer ou modo de edição especial em um estado normal bem definido. Talvez o mais importante, eu gostaria que não fizesse algo não relacionado,

  • Simule meta . O que eu tenho uma chave alt para?
  • Feche as janelas nas quais nem estou na hora.
  • Ser interpretado como a chave final em alguma sequência-chave.
  • ...

É possível desativar tudo isso e tornar esc uma chave de escape real? O modo Vim faz com que ele se comporte como eu gosto em algumas situações, mas especialmente quando outros plugins estão envolvidos, isso geralmente quebra.

Como alternativa, existem opções diferentes que podem se adequar ao meu tipo de fluxo de trabalho?

    
por leftaroundabout 05.11.2013 / 16:55

2 respostas

1

O comportamento para o qual você está procurando está incorporado na função Emacs Lisp keyboard-quit , vinculada por padrão a C-g (Control-g). Seu comportamento é aproximadamente equivalente, no contexto do Emacs, à função usual de C-c em um shell; ele irá interromper qualquer código Lisp e o levará de volta ao nível superior. (Em particular, se você está sendo solicitado a inserir texto no minibuffer e decidir que não quer fazer o que é que está lhe pedindo, afinal de contas, C-g é como você o cancela.)

Um simples toque na tecla Escape, por padrão, funciona como uma chave de prefixo Meta; isto é, um atalho que envolve a chave Meta (por exemplo, M-x , execute-extended-command ) funcionará tão bem se você pressionar Alt-x, ou se você pressionar Escape e pressionar X - o Emacs não se diferencia. Pressionar três vezes a tecla Escape executará keyboard-escape-quit , que é como keyboard-quit , mas com mais de um comportamento "faça o que eu quero dizer" - algo que nunca precisei em vários anos de uso do Emacs e, de fato, não Não sei até alguns minutos atrás, mas você pode achar útil.

Falando de coisas que você pode achar útil: Você pode obter documentação sobre qualquer função do Emacs através da função describe-function , chamada como C-h f FUNCTION-NAME RET (ou seja, pressione e solte Control -h, pressione f, digite um nome de função no prompt, pressione Return) ou como M-x describe-function RET FUNCTION-NAME RET . Para variáveis, é o mesmo, exceto C-h v ou describe-variable , além do nome da variável; para pressionamentos de tecla, é C-h k ou describe-key e você digita o acorde de chave cuja ligação deseja descrever. Essas três funções, além de C-h m para recuperar a documentação nos modos principal e secundário do buffer atual, são extremamente úteis para descobrir como o Emacs funciona e o que ele pode fazer, e eu os recomendo entusiasticamente como a melhor e mais rápida maneira de reduzir o grau em que o Emacs parece estranho e intimidante.

Agora, finalmente, para responder sua pergunta: pode ser possível reconfigurar o mapeamento de chave padrão do Emacs, de forma que ele diferencie a tecla Escape e a tecla Meta. No entanto, eu realmente não recomendo que você tente fazê-lo, por alguns motivos.

Em primeiro lugar, embora eu tenha certeza de que há uma maneira de fazê-lo, isso necessariamente será obscuro e complicado, e terá muito potencial para dar errado de maneiras não óbvias - algo que, enquanto bom para os veteranos do Emacs, não é realmente aconselhável quando você está tentando aprender o editor. Pior, se você tentar fazer isso de maneira ingênua e óbvia (por exemplo, M-: (global-set-key (kbd "ESC") 'keyboard-quit) RET ), você quebrará completamente o comportamento das teclas Meta. Na verdade, fazer com que funcione corretamente exigirá que você desça aos níveis mais baixos do processamento de eventos de entrada do Emacs - use um farol, traga um facão e prepare um almoço. (Talvez dois almoços).

Segundo, mesmo que você consiga que a ligação funcione de forma confiável, ela é muito diferente do padrão, enquanto qualquer Emacs que você usar, em qualquer lugar, terá C-g limitado a keyboard-quit . Especialmente ao aprender o editor, é aconselhável ficar o mais familiar possível com os atalhos de teclado padrão, em vez de religar as coisas de uma forma que funcionará apenas com seus próprios arquivos init do Emacs. (Se você pode garantir que você nunca usará um Emacs em qualquer lugar, mas em sua própria caixa, ou que você sempre será capaz de instalar seus arquivos init, ótimo! Vá para ele. Além disso, para este propósito, um modo Vim que faz parte da biblioteca padrão do Emacs conta como "default", porque você pode invocá-lo em qualquer Emacs instalado corretamente via M-x vim-mode RET ou similar.

tl: dr: Provavelmente você pode fazer isso com o ESC, mas será necessário um hackter horrível para fazer isso, assumindo que é possível, e é melhor você se acostumar com os recursos que o Emacs fornece por padrão para invocar o comportamento que você quer.

    
por 12.11.2013 / 19:43
3

Você pode usar isso no arquivo init do Emacs:

;;; 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)
    
por 25.07.2015 / 19:07