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

时间:2012-05-13 03:40:03

标签: emacs evil-mode

最近我尝试了Emacs并发现Evil对保持我的vim习惯很有帮助。我习惯输入“jj”从插入模式返回正常模式,就像许多Vimers一样,但不知道如何在Evil模式下进行。

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

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

7 个答案:

答案 0 :(得分:26)

这对我有用。它需要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

答案 1 :(得分:22)

我不知道它是否适用于Evil,但对于Emacs,KeyChord库通常用于此类事情。

试试看?

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

答案 2 :(得分: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))))))))

答案 3 :(得分:11)

如果您正在使用Spacemacs,那么我发现此设置(添加到user-init的开头)效果非常好,

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

答案 4 :(得分:1)

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

const s3 = require('node-s3-client')

const s3Config= {
    localDir: './dist',
    deleteRemoved: false,
    s3Params: {
        Bucket: 'cdn',
        Prefix: 'dist/',
        Metadata: {
            'Cache-Control': 'max-age=31536000',
            'Expires': oneYearLater(new Date())
        }
    }
}

const client = s3.createClient({
    s3Options: {
        accessKeyId: KEY_ID,
        secretAccessKey: ACCESS_KEY,
        signatureVersion: 'v4',
        region: 'us-east-2',
        s3DisableBodySigning: true
    }
})

client.uploadDir(s3Config)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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)