最近Emacsを試してみたところ、vimのカスタムを維持するのにEvilが役に立ったと思いました。私は「jj」と入力して、多くのVimersのように挿入モードから通常モードに戻るのに慣れていますが、Evilモードでそれを作成する方法がわかりません。
私はこのようにマッピングしますが、正しくないようです:
(define-key evil-insert-state-map (kbd "jj") 'evil-normal-state)
これでうまくいきます。 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 。
Evilで動作するかどうかはわかりませんが、Emacsの場合、一般に KeyChord ライブラリはこの種の目的のために設計されています。
試してみてください。
(key-chord-define evil-insert-state-map "jj" 'evil-normal-state)
次のブログ投稿を参照してください: 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))))))))
Spacemacsを使用している場合、この設定(user-init
の先頭に追加)が非常にうまく機能することがわかりました。
(setq-default evil-escape-key-sequence "jj")
私の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の回答に従いました。
これは私がしばらく使用してきた私の独自のソリューションですが、実際には「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)
もう少し複雑です-前のキャラクターに注意する必要があります。 これでうまくいくはずです。 (要旨は「jk」用です。「jj」用に簡単に変更できますが、「jk」の方が効率的/高速です)。