servidores - Cómo asignar "jj" a Esc en modo emacs Evil
linux administración avanzada mantenimiento y explotación de los servidores pdf (7)
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.
Lo mapeo así pero parece no ser correcto:
(define-key evil-insert-state-map (kbd "jj") ''evil-normal-state)
Es un poco más complicado, tienes que estar pendiente del personaje anterior. Esto debería funcionar. (la esencia es para "jk", puedes modificarla fácilmente para "jj" aunque notarás que "jk" es más eficiente / más rápido).
Esta es mi propia solución que he estado usando durante un tiempo, aunque utilizo `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)
Esto funciona para mí 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)
Está inspirado en la respuesta de @phils anterior y está basado en el Blog de codificación de Simon: Emacs y Unity Every Day .
No sé si funciona con Evil, pero para Emacs en general, la biblioteca KeyChord está diseñada para este tipo de cosas.
Pruébalo y verás?
(key-chord-define evil-insert-state-map "jj" ''evil-normal-state)
Para mi instalación de Windows, agregar como parte de la configuración mal uso-paquete 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.
Si está usando Spacemacs, entonces descubrí que esta configuración (agregada al comienzo de user-init
) funciona muy bien,
(setq-default evil-escape-key-sequence "jj")
Vea esta publicación en el blog: http://zuttobenkyou.wordpress.com/2011/02/15/some-thoughts-on-emacs-and-vim/ y busque "cofi". Yo uso la versión "kj" y funciona igual que Vim.
EDITAR: Aquí está el fragmento de código real de la publicación 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))))))))