【问题标题】:How to map "jj" to Esc in emacs Evil mode如何在 emacs Evil 模式中将“jj”映射到 Esc
【发布时间】:2012-05-13 03:40:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: emacs evil-mode


    【解决方案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 答案并基于Simon's Coding Blog: Emacs and Unity Every Day

    【讨论】:

    • 你好,三宝。谢谢你的回答,效果很好。但我以前在 vim 中使用“ii”而不是“jj”,所以我用上面的代码检查了它。但它不起作用。我是 emacs 和 lisp 的新手,对此我有点困惑。我检查了一些其他功能,例如添加挂钩,但它们也不起作用。你能帮我找出原因吗?
    • @AMIRREZASADEQI 您必须安装 key-chord 然后将代码放入您的 Emacs 初始化文件(~/.emacs 或 ~/.emacs.d/init.el)
    • Key-chord GitHub 存储库是 here
    【解决方案2】:

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

    试试看?

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

    【讨论】:

    • 是的,我可以确认它有效。这是我使用的,我发现它比接受的答案更顺利。
    • 不错!像魅力一样工作!我说 evil-mode 应该依赖于这个库并将该功能带入 evil,因为这就是 vim 的行为方式。
    【解决方案3】:

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

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

    【讨论】:

    • 这实际上是evil-escape 包的一部分,所以你不需要所有的spacemacs。
    • 如果您在完成这项工作时遇到问题,请尝试添加 (setq-default evil-escape-delay 0.2)。另外,我建议将这两行放在 ~/.spacemacs 文件的 user-config 部分而不是 user-init 部分
    【解决方案4】:

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

    编辑:这是博客文章中的实际代码 sn-p:

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

    【讨论】:

    • 没有谎言,这比我对映射的预期更加混乱。
    • @opert 我想使用 'jk' 作为转义键,但是在我交换了上面所有的 'j' 和 'k' 之后,我不能再输入 'k' 了(它变成了 j? ?)。谢谢。
    • @Tony 我不确定。听起来您有某种输入编码问题。
    • @Tony 我在尝试将其改编为“jj”时遇到了同样的问题。进行更改后重新启动emacs修复了它。我可以再次输入“k”。
    【解决方案5】:

    对于我的 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 的回答。

    【讨论】:

    • 我认为这是迄今为止最好的答案,因为它是来自 evil 包本身内部的配置,无需安装另一个包。
    • 但是现在你可以将jj 直接插入到你的缓冲区中,这远远不能令人满意。
    【解决方案6】:

    这有点复杂 - 你必须注意前一个字符。 This should do the trick.(要点是“jk”,您可以轻松修改它为“jj”,尽管您会注意到“jk”更高效/更快)。

    【讨论】:

    • 我发现“kj”比“jk”比“jj”好:)
    【解决方案7】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 2021-06-13
      • 2014-09-06
      相关资源
      最近更新 更多