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

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

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

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

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

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


person Joe    schedule 26.07.2014    source источник


Ответы (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

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

person Gordon Gustafson    schedule 27.07.2014
comment
Работает, нашел один баг. Если вы нажмете d (или аналогичную команду), а затем j достаточно быстро, ничего не произойдет, он просто выйдет. - person Joe; 27.07.2014
comment
@Joes Хммм, для меня dj всегда удаляет 2 строки через 0,5 секунды, даже при практически одновременном нажатии клавиш. К сожалению, я не думаю, что elisp сможет еще «ускорить» это решение. Из любопытства, вы используете emacs в терминале или в «режиме графического интерфейса»? - person Gordon Gustafson; 28.07.2014
comment
Ничего страшного, на практике это работает достаточно хорошо. Нажатия клавиш для переключения ошибки должны быть практически одновременными. Я использую режим графического интерфейса. - person Joe; 28.07.2014