2012-05-13 66 views
35

最近我尝试了Emacs,发现邪恶有助于保持我的vim自定义。我习惯于键入“jj”像许多Vimers一样从插入模式返回正常模式,但不知道如何在邪恶模式下进行。如何在emacs邪恶模式下将“jj”映射到Esc

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

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

回答

20

这适用于我。它要求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's Coding Blog: Emacs and Unity Every Day

+0

不得不指定延迟来使其工作,谢谢 – jarandaf

0

这是一个比较复杂一点 - 你必须注意的一个字符。 This should do the trick.(主旨是“jk”,你可以很容易地修改它为“jj”,但你会注意到“jk”更高效/更快)。

+1

我发现“kj”比“jk”要好于“jj”:) – vijiboy

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)))))))) 
+5

没有谎言,这比我预期的映射更混乱。 –

+0

@opert我想使用'jk'作为转义键,但在我交换了上面的所有'j'和'k'后,我不能再输入'k'(它变成了j ??)。谢谢。 – Tony

+0

@Tony我不确定。这听起来像你有某种输入编码问题。 –

22

我不知道它是否有效与邪恶,但对于Emacs的一般KeyChord库是专为这样的事情。

试试看吧?

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

是的,我可以证实这一点。这是我使用的,我发现它比接受的答案更顺畅。 –

+0

不错!像魅力一样工作!我认为邪恶模式应该依赖这个库,并将这个功能带入邪恶之中,因为这就是vim的行为。 – Nacht

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

如果你使用Spacemacs然后我就发现,此设置(添加到user-init开头)的作品非常好,

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

+2

这实际上是[evil-escape](https://github.com/syl20bnr/evil-escape)包的一部分,所以你不需要所有的spacemacs 。 – Long

+3

如果你在做这个工作时遇到了问题,尝试添加(setq-default evil-escape-delay 0.2)。另外,我建议把这两行放入〜/ .spacemacs文件的user-config部分,而不是user-init部分 – Macmee

0

对于我的窗户安装,如添加的一部分使用封装邪配置init.el工作对我来说:

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

对于Ubuntu的,我也跟着E.三宝的答案。

相关问题