¿Cómo puedo obtener un comportamiento de deshacer en Evil similar al de Vim?

17

El comportamiento de deshacer predeterminado en Evil es demasiado complejo porque considera que ocurre algo entre ingresar al modo de inserción y dejarlo como una operación de edición. Cuando ingresa un párrafo completo de texto durante una inserción y luego ejecuta deshacer, se elimina todo el párrafo. En contraste con eso, Vim inicia una nueva unidad de deshacer cada vez que mueve el cursor en modo de inserción por otro medio que no sea ingresar texto.

Evil tiene una variable de personalización que se puede usar para obtener un historial de deshacer más detallado:

(setq evil-want-fine-undo t)

Con esta configuración, Evil inicia una nueva unidad de deshacer cuando el cursor se mueve en modo de inserción, al igual que Vim. Sin embargo, esta configuración también interfiere con la forma en que se maneja la operación de reemplazo: si reemplaza una palabra usando cw, debe deshacer dos veces para restaurar la palabra original: una para eliminar la nueva palabra y otra para volver a insertar la palabra original. Esto es inconsistente con Vim y no tiene mucho sentido porque el reemplazo debe ser atómico.

La pregunta: ¿Cómo puedo configurar Evil y undo-tree para obtener el comportamiento de deshacer de Vim?

Tmalsburg
fuente
Presente un problema aquí: bitbucket.org/lyro/evil/issues?status=new&status=open (Evil generalmente considera que las divergencias de vim son errores).
Shosti
@shosti, tiene razón, pero la existencia de la variable de personalización sugiere que decidieron hacer una excepción a esa regla en el presente caso. Archivaré un error de todos modos. Veamos qué pasa.
Tmalsburg
Creo que la variable de personalización es en realidad obtener un comportamiento de deshacer similar a Emacs (Emacs no realiza operaciones atómicas de la misma manera que vim).
shosti
Aquí está el nuevo número: bitbucket.org/lyro/evil/issue/444/…
tmalsburg

Respuestas:

10

Como @shosti señaló que Evil considera la desviación del comportamiento de Vim como errores, presenté un error y uno de los autores de Evil agregó un nuevo valor posible para evil-want-fine-undo:

(setq evil-want-fine-undo 'fine)

Con esta configuración, obtienes nuevas unidades de deshacer cuando mueves el cursor en modo de inserción, pero las operaciones de reemplazo se deshacen en un solo paso. Por lo que puedo decir, esto es consistente con Vim. Ver aquí para más detalles.

Tmalsburg
fuente
2
Esta solución ya no se recomienda porque la 'fineconfiguración ha quedado en desuso.
tmalsburg
1

Según la descripción de la variable (ver C-h v evil-want-fine-undo), el valor fineya no es compatible debido a un comportamiento inconsistente.

Como uso deshacer para deshacer errores tipográficos o la configuración mencionada ayudó a mi asignación.

(setq evil-want-fine-undo t) 

Tuve errores deshacer de conflicto en la edición de fórmula org-mesa, ya que no tiene que salir del modo de inserción, si desea cambiar a *Edit Forumlas*con C-'.

Jörn Reimerdes
fuente
Gracias por la actualización. Solicité que se vuelva a abrir el problema en Bitbucket.
tmalsburg