Às vezes, minhas combinações de teclas globais são substituídas por um modo principal. Um exemplo fácil é a seguinte configuração no meu arquivo init
(global-set-key (kbd "C-j") 'newline-and-indent)
Mas irritantemente essa combinação de teclas é ocultada pelo modo principal "Interação Lisp", que é o modo padrão do buffer temporário.
Quando me encontro em uma situação em que um modo principal (ou modo secundário) está ocultando minha combinação de teclas global, como posso recuperá-lo?
Nota: A minha pergunta não é "Como posso vincular C-j
a newline-and-indent
'? Mode' em" Lisp Interaction Estou interessado em uma resposta muito mais geral sobre como lidar com mapas de teclas que se chocam ou com combinações de teclas de usuário que ficam ocultas por algum modo principal / secundário.
key-bindings
major-mode
keymap
minor-mode
nispio
fonte
fonte
Respostas:
Também existe uma abordagem de "atalho" para a mesma solução, se você não quiser definir seu próprio modo secundário (sobre o qual falo na minha primeira resposta).
Você pode instalar o
use-package
pacote disponível a partir Melpa e fazer usobind-key*
oubind-keys*
macro que é parte dobind-key
pacote que vem comuse-package
.A partir da documentação de
bind-key.el
:fonte
emulation-mode-map-alists
para impor precedência).(bind-key* "C-M-&" 'override-global-mode)
ao seu init e, geralmente, você pode obter rapidamente os vínculos, se necessário. Comooverride-global-mode
não é um modo secundário "global", você ainda precisará desativá-lo por buffer. Portanto, se você costuma desativar as chaves de substituição global, essa solução não é conveniente.Você pode definir seu próprio modo secundário e seu mapa de teclas e fazer com que todos os outros modos sejam substituídos (menor + maior). Foi exatamente por isso que escolhi escrever meu próprio modo secundário.
Etapas para que suas ligações de teclas substituam todas as ligações:
(define-key my-mode-map (kbd "C-j") #'newline-and-indent)
Da mesma forma, as outras combinações de teclas definidas no modo secundário substituirão as dos outros modos.
Eu recomendo a leitura do post de Christopher Wellons sobre como escrever um modo menor. Esse blog mais o aborrecimento de ter que definir várias ligações de teclas
nil
em vários modos principais e secundários me inspiraram a escrever meu próprio modo secundário.A melhor parte do uso dessa abordagem é que, quando você deseja verificar o que as associações de teclas fazem na configuração padrão do emacs, você simplesmente desativa o modo secundário; você o ativa novamente e recupera suas associações de teclas personalizadas.
fonte
Para que uma ligação global substitua uma ligação do modo principal, simplesmente defina a ligação
nil
no modo principal:Não é possível fazer com que a ligação global tenha precedência sobre todos os modos em geral (caso contrário, não faria sentido ter modos principais), mas você poderia invadir isso criando seu próprio modo secundário com as ligações mais importantes. Então você teria pelo menos precedência sobre a maioria dos modos (embora não necessariamente todos).
fonte
(define-key foo-mode (kbd "C-j") nil)
no meu arquivo .emacs e esperar que isso funcione?foo-mode-map
(meu exemplo na resposta foi ruim), mas sim, isso desativará a combinação de teclas no modo principal, para que a combinação global de teclas seja usada (a menos que exista um modo secundário diferente).foo-mode
seja chamadofoo-mode-map
?Você pode usar estas macros:
EDIT :
Veja o exemplo abaixo:
Se o mapa de teclas X estiver substituindo sua ligação global Y, você escreve:
(expose-bindings X '("Y"))
E então a substituição será 'desfeita'.
fonte
other map
, portanto, expondo a ligação do mapa global por meio doother map
. O segundo apenas permite aplicar o primeiro a uma lista de ligações.expose-bindings
primeiro e depois vinculo globalmente essas chaves aos comandos que desejo? Talvez você possa mostrar um exemplo do que eu poderia colocar no meu arquivo init para fazer isso funcionar.