2012-05-13 9 views
35

Kürzlich habe ich Emacs ausprobiert und gefunden, dass Evil hilfreich ist, meinen vim custom zu behalten. Ich bin es gewohnt, "jj" einzugeben, um den normalen Modus aus dem Einfügemodus zurückzuholen, wie es viele Vimer tun, aber ich weiß nicht, wie man es im Bösen Modus macht.Wie man "jj" in emacs auf Esc abbildet. Evil mode

ich wo es wie dies scheint aber nicht richtig:

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

Antwort

20

Das funktioniert für mich. Es erfordert die KeyChord Bibliothek:

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

es von @phils inspiriert Antwort oben und basiert auf Simon's Coding Blog: Emacs and Unity Every Day.

+0

musste die Verzögerung angeben, damit es funktioniert, danke – jarandaf

0

Es ist ein bisschen komplizierter - Sie für das vorherige Zeichen zu beobachten haben. This should do the trick. (das Wesentliche ist für "jk", Sie können es leicht für "jj" ändern, obwohl Sie bemerken, dass "jk" effizienter/schneller ist).

+1

Ich finde "kj" ist besser als "jk" ist besser als "jj" :) – vijiboy

14

Sehen Sie diesen Blogpost: http://zuttobenkyou.wordpress.com/2011/02/15/some-thoughts-on-emacs-and-vim/ und suchen Sie nach "Cofi". Ich benutze die "kj" Version selbst und es funktioniert genau wie Vim.

EDIT: Hier ist der eigentliche Code-Schnipsel aus dem Blog-Post:

(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

Keine Lüge, das war verwirrender als ich für die Zuordnung erwartet. –

+0

@opt Ich möchte 'jk' als Escape-Taste verwenden, aber nachdem ich alle 'j' und 'k' oben ausgetauscht habe, kann ich 'k' nicht mehr eingeben (es wird j ??). Vielen Dank. – Tony

+0

@Tony Ich bin mir nicht sicher. Es hört sich so an, als hätten Sie ein Problem mit der Eingabecodierung. –

22

Ich weiß nicht, ob es mit dem Bösen funktioniert, aber für Emacs im Allgemeinen die KeyChord Bibliothek für diese Art der Sache ausgelegt ist .

Versuchen Sie es und sehen?

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

Ja, ich kann bestätigen, dass das funktioniert. Es ist was ich benutze und ich finde es funktioniert reibungsloser als die angenommene Antwort. –

+0

Schön! Lief wie am Schnürchen! Ich sage, der böse Modus sollte von dieser Bibliothek abhängen und diese Funktionalität in das Böse bringen, da sich Vim so verhält. – Nacht

0

Dies ist meine eigene Lösung, die ich seit einiger Zeit verwende, obwohl ich "jf" tatsächlich verwende.

(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

Wenn Sie Spacemacs dann fand ich nur, dass diese Einstellung (zu dem Anfang user-init) funktioniert sehr gut, installieren Sie

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

+2

Dies ist tatsächlich Teil des Pakets [evil-escape] (https://github.com/syl20bnr/evil-escape), so dass Sie nicht alle spacemacs benötigen . – Long

+3

Wenn Sie Schwierigkeiten haben, diese Arbeit zu machen, versuchen Sie es auch (setq-default evil-escape-delay 0.2).Außerdem schlage ich vor, diese beiden Zeilen in den Benutzerkonfigurationsabschnitt Ihrer ~/.spacemacs-Datei anstelle des Benutzer-Init-Abschnitts einzufügen – Macmee

0

Für meine Fenster mit sind, das Hinzufügen als Teil Verwendung-Paket böse Konfiguration für mich in init.el gearbeitet:

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

für Ubuntu, folgte ich E. Sambo Antwort.