2012-05-13 19 views
35

最近、私はEmacsを試して、Evilが私のvim customを維持するのに役立つことを発見しました。私は多くのVimersのように挿入モードから通常モードを返すために "jj"とタイプするのに慣れていますが、Evilモードでどのようにするかはわかりません。emacsのEscに "jj"をマッピングする方法Evilモード

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

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

答えて

20

これは私に役立ちます。それは、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に基づいて触発されています。

+0

は、動作させるために遅延を指定しなければならなかったので、ありがとう – jarandaf

0

それはもう少し複雑だ - あなたは前の文字を監視しなければなりません。 This should do the trick.(要点は "jk"用ですが、 "jk"がより効率的/より速いことに気づくでしょうが、 "jj"用にそれを簡単に変更できます)。

+1

「kj」が「jk」よりも優れているとわかりました。「jj」よりも良いです:) – vijiboy

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)))))))) 
+5

いいえ、それは私がマッピングに期待していたよりも混乱していました。 –

+0

@opertエスケープキーとして 'jk'を使用したいが、上記の 'j'と 'k'をすべて交換した後、もうkを入力できなくなる(j?となる)。ありがとう。 – Tony

+0

@Tonyわかりません。何らかの入力エンコーディングの問題があるようです。 –

22

私はそれが悪で動作するかどうか分かりませんが、Emacsのために、一般的にKeyChordライブラリーは、この種のもののために設計されています。

お試しください。

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

うん、私はそれが動作することを確認することができます。それは私が使用するものであり、受け入れられた答えよりもスムーズに機能することがわかります。 –

+0

ニース!チャームのように働いた!私は、悪意のあるモードがこのライブラリに依存し、その機能を悪にする必要があると言うのは、それがvimの動作の仕方だからです。 – Nacht

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

あなたがSpacemacsを使用している場合、私はちょうど私のWindows用

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

+2

これは実際には[evil-escape](https://github.com/syl20bnr/evil-escape)パッケージの一部なので、すべてのspacemacsは必要ありません。 – Long

+3

この作業に問題がある場合は、(setq-default evil-escape-delay 0.2)も追加してみてください。また、私はこれらの行を〜/ .spacemacsファイルのuser-configセクションの中にuser-initセクションの代わりに入れることをお勧めします – Macmee

0

、(user-initの先頭に追加)、この設定は非常にうまく機能することを見つけるには、の一部として追加して、インストールします使用パッケージ悪構成は私のためにinit.elで働いた:

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

私はEサンボの答えに従った。

関連する問題