¿Cómo puedo descartar mi historial de deshacer en vim?

23

Deshacer es bueno tener en Vim. Pero a veces, en un buen momento conocido, quiero borrar mi historial de deshacer, para poder usarlo upara deshacer cambios individuales, pero solo de regreso a un cierto punto. (Por ejemplo, esto podría ser la última vez que me comprometí).

Una forma de lograr esto sería cerrar y volver a abrir el archivo: el historial de deshacer comienza limpio en ese punto. Pero eso es una molestia.

En el pasado, logré esto con :edit!. Pero en Vim 7.3, eso no descarta el historial de deshacer.

¿Hay otra forma de hacer esto, además de cerrar el archivo?

Nathan Long
fuente
Entonces, ¿solo desea restaurar el estado del archivo tal como estaba en su última confirmación? ¿Desea simplemente reasignar la tecla 'u' a algo como git checkout -f fileo hg rollback file?
akira
@akira: no, quiero poder usar upara deshacer cambios individuales, pero no más allá del punto donde me comprometí por última vez. Exactamente como si, cada vez que me comprometiera, cerrara el archivo y lo volviera a abrir. Que es lo que :edit!solía hacer: era como cerrar el archivo y volver a abrirlo. Esto NO TIENE que estar vinculado a un punto de confirmación, ese es el momento en que lo quiero con mayor frecuencia.
Nathan Long
ah, eso hace que el problema sea mucho más claro. deberías cambiar un poco tu pregunta.
akira

Respuestas:

11
:set undoreload=0 | edit

debe hacer lo que pides.

Steven
fuente
1
¡Decir ah! Solo apaga esa función, ¿eh? :) No estoy seguro de por qué me tomó tanto tiempo notar esto.
Nathan Long
7

El viejo: editar! comportamiento en una línea:

:exe "set ul=-1 | e! | set ul=" . &ul
Aldrik
fuente
Eso funciona ¿Te importaría explicarlo?
Nathan Long
Concatene el valor de la configuración de deshacer niveles al final de la cadena de comandos (para que pueda restaurarse) y los ejecute. Para obtener más información consulte la documentación: :h :exe, :h :bar, :h :set-args, :h 'ul'y :h :edit!.
Aldrik
6

La función de Benoit no funcionó para mí, pero encontré algo similar en el manual de vim, aquí:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

Lo puse en una función, lo agregué a mi vimrc y parece estar funcionando bien en vim 7.3:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

Esto se puede usar con :ClearUndo.

Nycto
fuente
1
Trabajando normalmente con el complemento Gundo y la recarga de archivos deshacer, esto me resulta muy útil. Sin embargo, cambié dos cosas: en lugar del comando de edición normal (que al parecer deja algo de historial de edición en 7.4), ¡simplemente uso una edición! (y siempre escribe antes de borrar el historial de deshacer). Parece que algunas listas internas no se actualizan correctamente, por lo que si desea usar esto con el complemento Gundo, ¡realice una edición adicional! al final de las funciones evitará que se produzca un error más tarde.
PlasmaHH
@PlasmaHH ¿Podría publicar la función para borrar el historial de deshacer, porque no entendí qué cambió ... (tal vez podría publicarlo como una respuesta para aquellos de nosotros que usamos gundu). Gracias
Ben
5

Probablemente:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

( 'ul'es alias para 'undolevels').

Benoit
fuente
¡Esto funciona! Ahora estoy tratando de hacer que un solo comando haga eso, preferiblemente :edit!. Para empezar, hice una función llamada ClearUndos () con los comandos que enumeró, pero llamarlo no parece hacer nada, mientras que hacer los comandos individualmente sí ...
Nathan Long
3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit
¿está destinado a ser el contenido de la función? No me funciona, pero tal vez no lo entendí. Además, ¿tal vez mover esto a su propia respuesta?
Nathan Long
Tal vez no pueda poner crudo |en un contenido de comando. Luego cree una función que haga lo que le dije en mi respuesta y configure el comando en call thefunction().
Benoit
3

"Borrar historial de deshacer (: w para borrar el archivo de deshacer si se presenta)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Cuando establece 'deshacer niveles' en -1, la información de deshacer no se borra inmediatamente, esto sucede en el siguiente cambio, es decir m-1, que en realidad no cambia su texto.
  • Cuando 'undofile'está activado, :wpara borrar el archivo de deshacer, o encadenar como UndoClear|w.
Bohr
fuente
1

En un guion:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

Luego usa :Resetpara llamarlo.

Benoit
fuente
Su línea de definición de función necesita () al final.
Nathan Long el
Esto es extraño: ejecutar esos comandos individualmente funciona bien, y hacer eco de los valores en toda la función muestra que están configurados y desarmados de manera adecuada. Pero ejecutar la función no restablece mi historial de deshacer; después, aún puedo deshacer varias veces. ¿Tal vez el set ul=comando solo afecta a una variable local hasta que sale el script, y dado que lo cambiamos antes de que el script salga, nunca afecta el entorno? ¿Probaste esta función y la hiciste funcionar? Es decir, ¿hay algo extraño en mi configuración?
Nathan Long el