Cuando editamos un archivo, generalmente hacemos muchas UNDO seguidas, por ejemplo, 20 veces. En VIM, eso generalmente se realiza presionando u20 veces, y eso hace que VIM "suba" en la pila de historial 20 posiciones. Si luego se asegura change, todos los últimos 20 comandos del historial se pierden y se reemplazan por change. Me gustaría hacer changesin perder esas 20 posiciones. Así que supongo que me gustaría decirle a VIM que deje de grabar el historial antes de hacerlo changey que reanude el historial después (no quiero changeen el historial).
EDITAR
Tratando de ser más claro: tengo una función FFque actualiza las últimas líneas de un archivo cuando se escribe el búfer. Entonces, si realizo 20 undos + write, el último writeabre una nueva rama de deshacer. Intenté agregar undojoindentro FF(tratando de seguir una sugerencia de jlmg a continuación), pero una secuencia write-undo-write da un error: undojoint no está permitido después de deshacer . En cambio, podría hacer algo sed ....después de irme vim, pero como uso esto SSHprefiero una solución solo vim (ejecutar un comando después de descargar el búfer no escribe en el archivo).
EDITAR 2 Intente hacer esto en VIM: abra un archivo en blanco y haga:
i1<ESC>:wa2<ESC>:wa3<ESC>:wa4<ESC>uu:w
Si ahora hace un <CTRL>R, VIM escribirá el '3' de regreso, más <CTRL>Robtendrá el 4. Esto sucede INCLUSO si haces un :wdespués de cada uno <CTRL>R. Sin embargo, si cada vez que realiza una :wejecución a través de una función BufWritePre, <CTRL>Rno escribirá la 3respuesta. Y esto es lo que quiero hacer, es por eso que escribí para 'suspender la historia', pero tal vez lo que pido no sea posible, además de trabajar con todo undotree().

vi, pero para míviel comando deshacer se deshace una vez, y luego, cuando presionasunuevamente, deshace el deshacer ("rehacer"). Eso es real vi. Por lo tanto, yo y otros usuarios de este sitio podrían no saber la respuesta a su pregunta.vim.se, lo habría intentado. De todos modos, parece que Sato sabe cómo ayudar.sed, pero sed no puede deshacer las cosas, entonces, ¿cómo va a funcionar eso? Si pudieras "suspender el historial", ¿qué comportamiento amable esperarías de vim cuando hagas un deshacer después? El único comportamiento que podría visualizar es agrupar esos cambios (junto con los deshacer) en un bloque de deshacer, de ahí mi respuesta. Pero si no es así, ¿qué es?Respuestas:
No necesita suspender el historial de Vim. Los datos reales forman un árbol y puede recuperarlos con la
undotree()función. Hay, por supuesto, una serie de complementos que lo convierten en algo más fácil de usar, fi gundo , mundo e indescifrable . Si también habilita la persistencia de deshacer (cf.:h undo-persistence), puede navegar fácilmente por todo el historial de cambios de un archivo.fuente
undotree()debería ayudar?changeno aparezca en absoluto, en ninguna parte, ni enhistory, ni en elundoárbol. Por eso mi pregunta era "suspender la historia".:earlier, que acepta una unidad de tiempo y cruzará las ramas de deshacer si es necesario (por ejemplo,:earlier 1hhace que el búfer se vea como lo hizo hace una hora). Si no puede usar una unidad de tiempo (¿porque los cambios fueron demasiado juntos?), Entonces tendrá que usarg-para caminar el árbol de deshacer unos pasos a la vez.Si te entiendo correctamente, lo que quieres es que luego deshacer deshaga eso
changey deshaga las 20 acciones.Cuando vim ejecuta una función o comando, todas las acciones que realiza se deshacen juntas. No estoy seguro de si esas acciones pueden incluir deshacer. Quizás esta parte de la documentación pueda ayudar:
Por desgracia, intenté usar
:undo 2 | undojoin | normal ohi, pero recibí el mensaje de errorE790: undojoin is not allowed after undo.Sin embargo, si las acciones se realizan en una función como esta:
luego llamarlo con
:call F()realiza laundootra acción en un bloque de deshacer. Tenga en cuenta que debido a que está utilizando deshacer, está creando una nueva rama de deshacer. Una vez hecho esto, puede usar el comando de modo normalg-para deshacerF(); usaruserá como haberlo hecho:undo 3al principio.fuente
undo, todo lo que haces en tu funciónF()no abra una nueva rama de deshacer. En mi caso,F()se ejecuta cada vez que escribo el archivo, y si lo hagoundoy luego escribo el archivo,F()abre una nueva rama de deshacer. Probé conundojoinal comienzo deF(), pero una secuencia de escritura-undo-escritura da un error:undojoint not allowed after undo.:undojoinno funcionó para lo que querías, mencionando el mismo error, y no estaba sugiriendo usarlo:undojoinal comienzo deF().F()está destinado a hacer lo:undojoinque no podría, que es unir los comandos deshacer y otros en un bloque de deshacer.g-yg+.