Cuando editamos un archivo, generalmente hacemos muchas UNDO seguidas, por ejemplo, 20 veces. En VIM, eso generalmente se realiza presionando u
20 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 change
sin perder esas 20 posiciones. Así que supongo que me gustaría decirle a VIM que deje de grabar el historial antes de hacerlo change
y que reanude el historial después (no quiero change
en el historial).
EDITAR
Tratando de ser más claro: tengo una función FF
que actualiza las últimas líneas de un archivo cuando se escribe el búfer. Entonces, si realizo 20 undos + write
, el último write
abre una nueva rama de deshacer. Intenté agregar undojoin
dentro 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 SSH
prefiero 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>R
obtendrá el 4
. Esto sucede INCLUSO si haces un :w
después de cada uno <CTRL>R
. Sin embargo, si cada vez que realiza una :w
ejecución a través de una función BufWritePre
, <CTRL>R
no escribirá la 3
respuesta. 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ívi
el comando deshacer se deshace una vez, y luego, cuando presionasu
nuevamente, 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?change
no 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 1h
hace 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
change
y 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 laundo
otra 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()
; usaru
será como haberlo hecho:undo 3
al 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 hagoundo
y luego escribo el archivo,F()
abre una nueva rama de deshacer. Probé conundojoin
al comienzo deF()
, pero una secuencia de escritura-undo-escritura da un error:undojoint not allowed after undo
.:undojoin
no funcionó para lo que querías, mencionando el mismo error, y no estaba sugiriendo usarlo:undojoin
al comienzo deF()
.F()
está destinado a hacer lo:undojoin
que no podría, que es unir los comandos deshacer y otros en un bloque de deshacer.g-
yg+
.