Подтвердить что ты не робот

Как сопоставить "jj" с Esc в emacs Злой режим

Недавно я попробовал Emacs и нашел Evil полезным, чтобы сохранить свой виртуальный обычай. Я привык печатать "jj", чтобы вернуть нормальный режим из режима вставки, как это делают многие Vimers, но не знаю, как сделать это в режиме "Злой".

Я сопоставляю его так, но кажется неправильным:

(define-key evil-insert-state-map (kbd "jj") 'evil-normal-state)
4b9b3361

Ответ 1

Это работает для меня. Для этого требуется библиотека KeyChord:

;;Exit insert mode by pressing j and then j quickly
(setq key-chord-two-keys-delay 0.5)
(key-chord-define evil-insert-state-map "jj" 'evil-normal-state)
(key-chord-mode 1)

Это вдохновлено ответом @phils выше и на основе Саймон Кодирование: Emacs and Unity Every Day.

Ответ 2

Я не знаю, работает ли это с Evil, но для Emacs вообще библиотека KeyChord предназначена для такого рода вещей.

Попробуй и посмотри?

(key-chord-define evil-insert-state-map "jj" 'evil-normal-state)

Ответ 3

Смотрите это сообщение в блоге: http://zuttobenkyou.wordpress.com/2011/02/15/some-thoughts-on-emacs-and-vim/ и найдите "cofi". Я сам использую версию "kj", и она работает так же, как Vim.

EDIT: Вот фрагмент кода из сообщения в блоге:

(define-key evil-insert-state-map "k" #'cofi/maybe-exit)

(evil-define-command cofi/maybe-exit ()
  :repeat change
  (interactive)
  (let ((modified (buffer-modified-p)))
    (insert "k")
    (let ((evt (read-event (format "Insert %c to exit insert state" ?j)
               nil 0.5)))
      (cond
       ((null evt) (message ""))
       ((and (integerp evt) (char-equal evt ?j))
    (delete-char -1)
    (set-buffer-modified-p modified)
    (push 'escape unread-command-events))
       (t (setq unread-command-events (append unread-command-events
                          (list evt))))))))

Ответ 4

Если вы используете Spacemacs, я просто обнаружил, что этот параметр (добавленный в начало user-init) работает очень хорошо,

(setq-default evil-escape-key-sequence "jj")

Ответ 5

Это немного сложнее - вам нужно следить за предыдущим персонажем. Это должно сделать трюк. (смысл для "jk", вы можете легко изменить его для "jj", хотя вы заметите, что "jk" более эффективно/быстрее".

Ответ 6

Это мое собственное решение, которое я использовал некоторое время, хотя на самом деле я использую `jf '.

(defun xwl-jj-as-esc ()
  (interactive)
  (if (memq evil-state '(insert replace))
      (let ((changed? (buffer-modified-p)))
          (insert "j")
          (let* ((tm (current-time))
                 (ch (read-key)))
            (if (and (eq ch ?j)
                     (< (time-to-seconds (time-since tm)) 0.5))
                (save-excursion
                  (delete-char -1)
                  (evil-force-normal-state)
                  (set-buffer-modified-p changed?))
              (insert ch))))
    (call-interactively 'evil-next-line)))

(define-key evil-insert-state-map  "j" 'xwl-jj-as-esc)
(define-key evil-replace-state-map "j" 'xwl-jj-as-esc)

Ответ 7

Для моих окон установка, добавление как часть конфигурации злонамеренного использования, работало для меня в init.el:

(use-package evil
 :ensure t
 :config
 (evil-mode 1)
 (define-key evil-insert-state-map "jj" 'evil-normal-state)
)

Для Ubuntu я последовал за ответом Е. Самбо.