如何在emacs Evil模式下将“jj”映射到Esc

最近我尝试了Emacs,发现邪恶有助于保持我的VIM自定义。 我习惯于input“jj”像许多Vimers一样从插入模式返回正常模式,但不知道如何使它在邪恶模式。

我像这样映射,但似乎不正确:

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

这对我有用。 它需要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答案的启发,并基于Simon的Coding博客:Emacs和Unity每一天 。

我不知道它是否适用于Evil,但是对于Emacs来说, KeyChord库是专门为这类事情devise的。

试试看看?

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

看到这篇博文:http://zuttobenkyou.wordpress.com/2011/02/15/some-thoughts-on-emacs-and-vim/并search“cofi”。; 我自己使用“kj”版本,就像Vim一样工作。

编辑:这是从博客文章的实际代码片段:

 (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)))))))) 

如果您使用的是Spacemacs,那么我只是发现这个设置(添加到user-init的开头)工作得很好,

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

这有点复杂 – 你必须注意前一个angular色。 这应该做的伎俩。 (要点是“jk”,你可以很容易地修改它为“jj”,虽然你会注意到“jk”更有效率/更快)。

这是我自己的解决scheme,我已经使用了一段时间,但我实际上使用`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) 

对于我的Windows安装,作为use-package邪恶configuration的一部分添加在init.el中为我工作:

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

对于Ubuntu,我遵循了E. Sambo的回答。