Eu estou tentando fazer a função do mal evil-jump-to-tag
, C-]comportam-se como ligando as Emacs M-..
O comportamento normal é bom para navegar nos arquivos Tags, mas quero que ele funcione também para Slime slime-edit-definition
, Elisps elisp-slime-nav-find-elisp-thing-at-point
, Clojures cider-jump-to-var
, etc.
Esses modos principais e muitos outros vincularam algum equivalente de salto para definição à combinação de teclas M-..
Para obter o mesmo comportamento no modo Evil, preciso vincular uma combinação de teclas localmente para cada um desses modos ou é possível usar uma combinação de teclas e informar ao Emacs que, sempre que essa tecla for pressionada, use a função associada a essa tecla no modo Emacs?
Respostas:
Estou trabalhando agora, graças às suas respostas:
Isso definirá o estado mau como "Emacs", chamará a função vinculada a M-. E voltará ao estado emacs anterior no outro buffer. Eu tentei com elisp, slime and go e está funcionando para todos eles.
fonte
(define-key evil-normal-state-map (kbd "C-]") (kbd "\\ M-.")
(onde "\" está vinculadoevil-execute-in-emacs-state
).Tente algo como
ou, se
evil
já usa esse atalho de teclas, pode ser necessário fazer algo parecido.Isso substituirá completamente o comportamento de
C-]
, se você quiser manter o comportamento do mal, dependendo do modo principal atual, a solução do @ Tyler é mais apropriada porque você pode ter uma função que decide se deseja chamarM-.
ou fazer alguma coisa.Isso ajuda?
fonte
Eu não entendo
evil
os mapas de teclas, mas a seguinte função faz o que M-.estiver vinculado no momento:Vincular isso ao
evil
mapa de teclas apropriado deve fazer o que você deseja. Pode haver maisevil
maneira específica de fazer isso.evil
se liga C-]emevil-motion-state-map
, por isso, tente o seguinte:fonte
M-.
paraevil-repeat-pop-next
. Se você mudar sua função para isso: (defun my-tag-jump () (interativo) (evil-emacs-state) (chame interativamente (key-binding (kbd "M-."))) (Evil-normal- state))evil-jump-to-tag
está definido e religá-lo à minha função lá.Em geral, não é possível.
O motivo é que pode haver vários mapas que definem a mesma ligação e não há como descobrir automaticamente qual você deseja. (no seu exemplo,
elisp-slime-nav-mode
é um modo tão secundário). Portanto, a única abordagem realmente confiável é você descobrir exatamente qual definição deseja.Dito isso ... existe um possível hack (nem sempre existe ...) Parte do que torna complicado é que a ligação que você deseja remapear já está potencialmente mascarada por um mapa de teclas ativo mal, obtendo a ligação atual de
M-.
é inútil.Normalmente eu não uso o mal, então pode haver ajustes necessários (veja os comentários incorporados)
Além disso, uma abordagem mais limpa seria procurar as ligações uma vez (em um gancho de modo, por exemplo), em vez de procurar dinamicamente toda vez que a tecla for pressionada. Mas não tenho certeza de qual gancho usar, então isso é deixado como um exercício;) (e dependendo da ordem que você usa para seus modos menores, ou se você os alternar dinamicamente, pode estar incorreto)
fonte
A solução aceita por @severin quase funciona para mim, mas, quando a tag não é encontrada, o buffer não retorna ao modo normal. Essa alternativa funciona para mim em todos os casos:
fonte
Eu acho que a maneira mais limpa é
(e também adicione todos os outros mapas de seu interesse)
xref-find-definitions
é a função binded paraM-.
no emacs, como você pode ver usando o comandoC-h k
.fonte
Algumas funções de encadernação no estilo vim.
Aqui estão algumas funções que defini para permitir a ligação no estilo vim no mapa global e em vários estados malignos, bem como duas funções gerais que usam um mapa de chave arbitrário ou uma função de ligação arbitrária. Eu coloquei essas funções em uma essência .
Em geral, é melhor usar essas funções apenas para ligações no estilo de teclado e macro (como o caso de uso na pergunta) e usar a combinação de teclas no estilo emacs para todo o resto.
notas
bind-key
macro dause-package
embalagem é uma excelente e versátil função de combinação de teclas.Vinculação C-]a M-..
Note-se que no estado normal, você vai querer ligar para \M-.acessar os emacs de ligação, uma vez que se liga-estado normal M-.para
'evil-repeat-pop-next
. Portanto, uma ligação de estado normal pode ser definida com:ou (religando qualquer
evil-jump-to-tag
chave no estado normal:fonte