He estado usando la función no archivada en Vim por un tiempo. Es una característica muy bonita.
Sin embargo, una molestia es que es muy fácil deshacer accidentalmente los cambios que hice la última vez que abrí el archivo; que puede ser hace 2 minutos, hace una hora, la semana pasada o hace un mes.
Por ejemplo, supongamos que abro un archivo, hago algunos cambios, apago y cambio algunos otros archivos, y descubro que mis cambios no fueron necesarios, o tal vez fueron solo unas pocas declaraciones de depuración temporales.
Anteriormente, podía mantener presionada la utecla hasta que Vim dijera "Ya en el cambio más antiguo" :wq
, y listo. Pero ahora tengo que tener mucho cuidado de no deshacer los cambios que hice la última vez que abrí el archivo. No hay una forma obvia de ver cuándo estás haciendo esto.
¿Hay alguna manera de hacer esto más explícito? Por ejemplo, mostrándolo en algún lugar, emitiendo una advertencia o incluso pidiendo una confirmación.
fuente
Respuestas:
Yo tuve el mismo problema. Esto es lo que agregué a mi vimrc para solucionarlo:
Tenga en cuenta que no establece la
undofile
opción; debe eliminarlo de su vimrc si lo tiene.Deshacer ahora funciona como "normal". Pero nosotros hacemos escribir manualmente en el archivo de deshacer con el
wundo
comando enBufWritePost
.La
ReadUndo()
función lee manualmente el archivo deshacer conrundo
y establece laundofile
opción. Ahora podemos usar upara retroceder más en la historia. Mapeé esto a<Leader>u
.Esto probablemente podría ser mejor. Sobrescribe la información de deshacer anterior, por lo que no puede volver a la anterior vez que editó el archivo. Pero no lo he necesitado yo mismo.
fuente
¡Oooh, ooh, finalmente una oportunidad de mostrar este ingenioso comando!
Vim puede "retroceder en el tiempo". Tiene un
:earlier
comando ...... que puede revertir el archivo a un estado anterior. Esto se puede usar de varias maneras.
Si puede hacer una estimación aproximada de cuánto tiempo le llevó realizar estos cambios, puede pasar un tiempo en este comando. O, por ejemplo, si sabe que no ha cambiado el archivo (excepto los cambios que desea deshacer) en el último día, puede usar
Si solo ha escrito (guardado) el archivo una vez desde los cambios que desea deshacer, o no ha guardado el archivo, puede usar
Como se describe en el
:help
texto, esto volverá a la versión escrita anteriormente si acaba de escribir el archivo, o volverá a la última vez que se guardó si no tiene ningún cambio guardado.Esto no responde a su pregunta con precisión, pero suena como un problema de XY.
fuente
u
y accidentalmente paso los cambios que hice en este momento ... ¿No estoy seguro de cuál podría ser el "problema X" original?:earlier
por cierto, pero todavía tengo que adivinar ; tal como necesito adivinar cuando uso elu
... En casos probablemente sea un poco mejor, pero preferiría algo más explícito (si es posible).:ea 5d
. También podrías usar el:ea 1f
enfoque. En cualquier caso, es mucho menos granular.Actualización 2015-06-28 : arreglé un pequeño error y lo lancé como un complemento . El código del complemento es ligeramente mejor, ya que advierte nuevamente después de mover el cursor; Te recomiendo que uses el complemento.
La respuesta de superjer funciona muy bien, pero tiene el desafortunado efecto secundario de que solo puede deshacer los cambios de la última sesión de Vim, y no todas las sesiones anteriores de Vim.
Esto se debe a que
wundo
sobrescribe el archivo de deshacer; No está fusionado. Que yo sepa, no hay forma de arreglar esto.Así que aquí está mi solución alternativa, mostrará un gran mensaje de advertencia rojo cuando deshaga los cambios del archivo de deshacer.
Esto es similar a la respuesta de Ingo Karkat , pero no requiere un complemento externo y tiene algunas diferencias sutiles (muestra advertencia en lugar de pitido, no requiere que presione
u
dos veces).Nota Este sólo modifica el
u
y<C-r>
se une, y no elU
,:undo
y:redo
los comandos.fuente
Tengo lo siguiente, que se detiene y emite un pitido cuando deshacer alcanza el contenido del búfer persistente.
Esto se integra con el complemento repeat.vim; requiere mi complemento ingo-library .
fuente
Realmente me gustó la idea citada, así que hice el
:Revert
comando. Espero que lo encuentres relevante para tu pregunta.Las funciones auxiliares
Get_seq
yReal_seq
, basadas en unotree , son necesarias porque aundotree()['seq_cur']
veces no es suficiente para determinar la posición actual en el árbol de deshacer. Puedes leer más sobre esto aquí .fuente
au
. El vimrc allí es el culpable. Simplemente déjalo afuera