2012-05-13 9 views
35

Recientemente probé Emacs y encontré Evil útil para mantener mi vim personalizado. Estoy acostumbrado a escribir "jj" para regresar al modo normal desde el modo de inserción como lo hacen muchos Vimers pero no sé cómo hacerlo en modo Evil.Cómo asignar "jj" a Esc en emacs Modo maligno

que asignarla como este, pero no parece correcta:

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

Respuesta

20

Esto funciona para mí. Se requiere la biblioteca 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) 

Se inspira en @phils respuesta anterior y en base a Simon's Coding Blog: Emacs and Unity Every Day.

+0

tuvo que especificar el retraso para que funcione, gracias – jarandaf

0

Es un poco más complicado - usted tiene que mirar para el carácter anterior. This should do the trick. (la esencia es para "jk", puedes modificarla fácilmente para "jj" aunque notarás que "jk" es más eficiente/más rápido).

+1

Encuentro "kj" es mejor que "jk" es mejor que "jj" :) – vijiboy

14

Ver esta publicación de blog: http://zuttobenkyou.wordpress.com/2011/02/15/some-thoughts-on-emacs-and-vim/ y buscar "cofi". Yo uso la versión "kj" y funciona igual que Vim.

EDIT: He aquí el fragmento de código real de la entrada del blog:

(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

No mentir, eso fue más confuso de lo que esperaba para el mapeo. –

+0

@opert Quiero usar 'jk' como la tecla de escape, pero después de intercambiar todas las 'j' y 'k' anteriores, no puedo ingresar 'k' más (se convierte en j ??). Gracias. – Tony

+0

@Tony No estoy seguro. Parece que tienes algún tipo de problema de codificación de entrada. –

22

No sé si funciona con el mal, sino por Emacs, en general, la biblioteca KeyChord está diseñado para este tipo de cosas .

Pruébalo y mira?

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

Sí, puedo confirmar que funciona. Es lo que uso y creo que funciona más fácilmente que la respuesta aceptada. –

+0

¡Agradable! ¡Trabajado como un encanto! Digo que el modo maligno debería depender de esta biblioteca y llevar esa funcionalidad al mal ya que así es como se comporta vim. – Nacht

0

Esta es mi propia solución que he estado usando durante algún tiempo, aunque uso `jf 'en realidad.

(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

Si está utilizando Spacemacs entonces me acaba de encontrar que este ajuste (se añade al principio de user-init) funciona muy bien,

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

+2

Esto es realmente parte del paquete [evil-escape] (https://github.com/syl20bnr/evil-escape), por lo que no necesita todos los equipos espaciales . – Long

+3

Si tiene problemas para hacer esto, intente agregar (setq-default evil-escape-delay 0.2) también.Además, sugiero poner ambas líneas dentro de la sección de configuración de usuario de su archivo ~/.spacemacs en lugar de la sección de inicio de usuario – Macmee

0

Para mis instalación de Windows, añadiendo como parte de use-package evil configuration funcionó para mí en init.el:

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

Para Ubuntu, seguí la respuesta de E. Sambo.