48

最近我尝试了 Emacs,发现 Evil 有助于保持我的 vim 习惯。我习惯于像许多 Vimer 一样键入“jj”从插入模式返回正常模式,但不知道如何在 Evil 模式下实现。

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

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

7 回答 7

41

这对我有用。它需要KeyCord库:

;;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 的编码博客:Emacs 和 Unity Every Day

于 2012-11-24T17:16:01.950 回答
24

我不知道它是否适用于 Evil,但对于 Emacs,KeyChord库通常是为这类事情设计的。

试试看?

(key-chord-define evil-insert-state-map "jj" 'evil-normal-state)
于 2012-05-21T03:44:58.910 回答
16

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

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

于 2016-02-20T18:26:11.963 回答
14

请参阅此博客文章:http: //zuttobenkyou.wordpress.com/2011/02/15/some-thoughts-on-emacs-and-vim/并搜索“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))))))))
于 2012-05-21T00:51:38.470 回答
4

对于我的 Windows 安装,在 init.el 中添加作为 use-package evil 配置的一部分对我有用:

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

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

于 2017-08-23T16:32:58.733 回答
0

这有点复杂 - 你必须注意前一个角色。这应该可以解决问题。(要点是“jk”,您可以轻松地将其修改为“jj”,尽管您会注意到“jk”更有效/更快)。

于 2012-05-14T21:19:24.730 回答
0

这是我自己使用了一段时间的解决方案,尽管我实际上使用了“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)
于 2015-09-18T20:31:14.483 回答