Я пытаюсь заставить Зло функционировать evil-jump-to-tag
, C-]вести себя как привязка Emacs M-..
Нормальное поведение подходит для просмотра файлов тегов, но я хочу, чтобы оно работало также для Slime slime-edit-definition
, Elisps elisp-slime-nav-find-elisp-thing-at-point
, Clojures cider-jump-to-var
и т. Д.
Эти основные режимы и многие другие связывают некоторый эквивалент перехода к определению с привязкой клавиш M-..
Чтобы получить такое же поведение для режима Evil, нужно ли привязывать привязку клавиш локально для каждого из этих режимов, или можно взять привязку клавиш и сообщить Emacs, что при каждом нажатии этой клавиши используйте функцию, привязанную к этой клавише? в режиме Emacs?
Ответы:
У меня это работает сейчас, благодаря вашим ответам:
Это установит злое состояние на «Emacs», вызовет функцию, связанную с M-, и вернется к предыдущему состоянию emacs в другом буфере. Я попробовал это с elisp, slime и go, и это работает для всех них.
источник
(define-key evil-normal-state-map (kbd "C-]") (kbd "\\ M-.")
(где «\» связаноevil-execute-in-emacs-state
).Попробуйте что-то вроде
или, если
evil
уже используется эта привязка клавиш, вам может потребоваться сделать что-то вроде.Это полностью переопределит поведение:
C-]
если вы хотите сохранить поведение зла в зависимости от текущего основного режима, решение @ Tyler более уместно, потому что вы можете иметь функцию, которая решает, вызывать лиM-.
или делать что-то еще.Это помогает?
источник
Я не понимаю
evil
раскладки клавиш, но следующая функция делает все, что M-.связано в данный момент:Привязка этого к соответствующей
evil
раскладке клавиш должна делать то, что вы хотите. Там может быть болееevil
конкретный способ сделать это.evil
связывается C-]вevil-motion-state-map
, так что попробуйте следующее:источник
M-.
с этимevil-repeat-pop-next
. Если вы измените свою функцию следующим образом: (defun my-tag-jump () (интерактивный) (evil-emacs-state) (call-интерактивно (связывание ключей (kbd "M-."))) (Evil-normal- состояние))evil-jump-to-tag
схему ключей, где она определена, и привязать ее к моей функции там.В общем, это невозможно.
Причина в том, что может быть несколько карт, которые определяют одну и ту же привязку, и нет способа автоматически определить, какую вы хотите. (в вашем примере
elisp-slime-nav-mode
такой второстепенный режим). Таким образом, единственный действительно надежный подход для вас - выяснить, какое именно определение вы хотите.Тем не менее ... есть возможность взломать (не всегда ...) Часть того, что делает его хитрым, состоит в том, что привязка, которую вы хотите переназначить, потенциально уже замаскирована злой активной картой ключей, поэтому получение текущей привязки
M-.
бесполезно.Обычно я вообще не использую зла, поэтому могут потребоваться корректировки (см. Встроенные комментарии)
Кроме того, более понятный подход заключается в том, чтобы искать привязки один раз (например, в хуке режима) вместо динамического поиска при каждом нажатии связывания клавиш. Но я не уверен, какой злой крючок использовать, так что это оставлено в качестве упражнения;) (и в зависимости от порядка, который вы используете для своих второстепенных режимов, или если вы переключаете их динамически, это может быть неправильно)
источник
Принятое @severin решение почти работает для меня, но, когда тег не найден, буфер не возвращается в нормальный режим. Эта альтернатива работает для меня во всех случаях:
источник
Я думаю, что самый чистый путь
(а также добавьте любую другую карту, которая вас интересует)
xref-find-definitions
это функция, связанная сM-.
Emacs, как вы можете видеть, используя командуC-h k
.источник
Некоторые функции связывания клавиш в стиле vim.
Вот некоторые функции, которые я определил, чтобы разрешить привязку в стиле vim на глобальной карте и в различных злых состояниях, а также две общие функции, которые принимают либо произвольную карту ключей, либо произвольную функцию привязки. Я поместил эти функции в суть .
В общем, лучше использовать эти функции только для привязок в стиле макросов клавиатуры (например, в примере использования в вопросе) и использовать привязку клавиш в стиле emacs для всего остального.
Примечания
bind-key
Макрос изuse-package
пакета является отличным и универсальным ключом функции связывания.Привязка C-]к M-..
Обратите внимание, что в нормальном состоянии вы захотите привязаться к, \M-.чтобы получить доступ к привязке emacs, поскольку нормальное состояние связывается M-.с
'evil-repeat-pop-next
. Таким образом, привязка нормального состояния может быть определена с помощью:или (повторное связывание любого
evil-jump-to-tag
ключа в нормальном состоянии:источник