web-dev-qa-db-ja.com

emacs Evilモードで「jj」をEscにマッピングする方法

最近Emacsを試してみたところ、vimのカスタムを維持するのにEvilが役に立ったと思いました。私は「jj」と入力して、多くのVimersのように挿入モードから通常モードに戻るのに慣れていますが、Evilモードでそれを作成する方法がわかりません。

私はこのようにマッピングしますが、正しくないようです:

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

これでうまくいきます。 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のコーディングブログに基づいています:EmacsとUnity Every Everyday

28
E. Sambo

Evilで動作するかどうかはわかりませんが、Emacsの場合、一般に KeyChord ライブラリはこの種の目的のために設計されています。

試してみてください。

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

次のブログ投稿を参照してください: 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))))))))
14
Linus Arver

Spacemacsを使用している場合、この設定(user-initの先頭に追加)が非常にうまく機能することがわかりました。

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

12
Caoilte

私のWindowsインストールの場合、init.elで、use-package evil configurationの一部として追加するとうまくいきました。

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

Ubuntuについては、E。Samboの回答に従いました。

1
roger

これは私がしばらく使用してきた私の独自のソリューションですが、実際には「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)
0
xwl

もう少し複雑です-前のキャラクターに注意する必要があります。 これでうまくいくはずです。 (要旨は「jk」用です。「jj」用に簡単に変更できますが、「jk」の方が効率的/高速です)。

0
user673592