Выйдите из режима злого оператора Emacs с помощью клавиши "jk"

Я хочу выйти из состояния ожидания оператора режима зла, когда я нажму "jk" в быстрой последовательности.

Например, если я нажму d, а потом jkничего не должно быть удалено и Emacs должен быть в нормальном режиме.

Я попытался использовать key-chord.el для выхода из режима оператора, но это не сработало.

(key-chord-define evil-operator-state-map "jk" 'evil-force-normal-state)

Аналогичный вопрос заключался в том, как выйти из isearch с "jk": ключевые аккорды в isearch. Я думаю, что решение может потребовать аналогичного подхода.

1 ответ

Решение

Это немного хакерский, так как полагается на <down> быть привязанным к так же, как j, но это лучшее, что я могу сделать со своим нынешним знанием зла. Он должен работать правильно во всех случаях, включая повторы.

(define-key evil-operator-state-map "j" 'evil-operator-state-j)

(evil-define-command evil-operator-state-j ()   (save-excursion
    (let ((evt (read-event "Press k to exit operator state" nil 0.5)))
      (if (and (integerp evt) (char-equal evt ?k))
          (keyboard-quit)
        ;; assume <down> is bound to the same as j:
        (let* ((operator-string (substring (this-command-keys) 0 -1)) ; get the keys used to invoke the operator
               (new-macro (kbd (concat operator-string " <down>"))))  ; add " <down>" to the end instead of "j"
          (evil-force-normal-state)
          (execute-kbd-macro new-macro)
          (when (not (null evt))
            (push evt unread-command-events))))))) ; process any other key pressed within 0.5 seconds

Если вы нашли ошибку или у вас есть вопросы о том, как она работает, просто спросите.:)

Другие вопросы по тегам