“如何绘制地图”;jj";在emacs邪恶模式下Esc

“如何绘制地图”;jj";在emacs邪恶模式下Esc,emacs,evil-mode,Emacs,Evil Mode,最近我尝试了Emacs,发现邪恶有助于保持我的vim习惯。我习惯于键入“jj”从插入模式返回正常模式,就像许多Vimer一样,但不知道如何在邪恶模式下返回正常模式 我这样绘制地图,但似乎不正确: (define-key evil-insert-state-map (kbd "jj") 'evil-normal-state) 这有点复杂-你必须注意前面的角色。(要点是“jk”,你可以很容易地将其修改为“jj”,尽管你会注意到“jk”更高效/更快)。请参阅本文:并搜索“cofi”。我自己使用“kj

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

我这样绘制地图,但似乎不正确:

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

这有点复杂-你必须注意前面的角色。(要点是“jk”,你可以很容易地将其修改为“jj”,尽管你会注意到“jk”更高效/更快)。

请参阅本文:并搜索“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))))))))

我不知道它是否适用于邪恶,但对于Emacs来说,一般来说,这个库就是为这类事情而设计的

试试看

(键和弦定义邪恶插入状态映射“jj”'邪恶正常状态)

这对我很有用。它要求图书馆:

;;按j键退出插入模式,然后快速按j键
(setq键和弦双键延迟0.5)
(键和弦定义邪恶插入状态映射“jj”'邪恶正常状态)
(主音和弦模式1)

它的灵感来源于上面的@phils答案并基于此。

这是我自己的解决方案,我已经使用了一段时间,尽管我实际上使用了“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)
(将xwl jj定义为esc()
(互动)
(如果(memq邪恶状态)(插入替换))
(let((已更改)(缓冲区修改-p)))
(插入“j”)
(let*((tm(当前时间))
(ch(读取键)))
(如果(和(等式ch?j)
(<(时间到秒(从tm开始的时间))0.5))
(省去远足
(删除字符-1)
(邪恶势力正常状态)
(set-buffer-modified-p已更改?)
(插入ch)))
(以交互方式调用“邪恶的下一行”))
(将键插入状态映射“j”'xwl jj定义为esc)
(将状态映射“j”xwl jj定义为esc)

如果您使用的是SpaceMac,那么我刚刚发现这个设置(添加到
user init
的开头)工作得非常好


(setq default evil escape key sequence“jj”)

用于我的windows安装,作为在init.el中为我工作的使用包邪恶配置的一部分添加:

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

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

没有谎言,这比我对映射的预期更令人困惑。@opert我想用'jk'作为转义键,但在我交换了上面所有的'j'和'k'之后,我再也不能输入'k'(它变成了j??)。谢谢。@Tony我不确定。听起来你好像有某种输入编码问题。@Tony我在尝试将其改编为“jj”时也遇到了同样的问题。修改后重新启动emacs修复了它。我可以再打一次“k”。是的,我可以确认它有效。这就是我所用的,我发现它比公认的答案更流畅。很好!工作得很有魅力!我说邪恶模式应该依赖于这个库,并将该功能引入邪恶,因为这就是vim的行为方式。我发现“kj”比“jk”好(jk比“jj”):)这实际上是软件包的一部分,所以你不需要所有的SpaceMac。如果你在这方面遇到困难,也可以尝试添加(setq默认邪恶逃脱延迟0.2)。另外,我建议将这两行放在~/.spacemacs文件的user config部分中,而不是放在sambo的user init section中。谢谢你的回答,效果很好。但是我以前在vim中使用“ii”而不是“jj”,所以我用上面的代码检查了它。但它不起作用。我是emacs和lisp的新手,对此我有点困惑。我检查了一些其他功能,比如addhook,但它们也不起作用。您能帮我找到原因吗?@AMIRREZASADEQI您必须安装key chord,然后将代码放入您的Emacs init文件(~/.Emacs或~/.Emacs.d/init.el)我认为这是迄今为止最好的答案,因为它是来自邪恶软件包本身内部的配置,不需要安装其他软件包。