¿Cómo puedo deshacer de manera segura los cambios que puedo haber hecho o no?

12

Demasiado a menudo cometo el error de escribir con la ventana equivocada enfocada (y lo he hecho varias veces con un autenticador USB). En los programas con muchas teclas de acceso rápido habilitadas (Gmail, VLC, Vim), esto a menudo tiene la consecuencia no deseada de realizar modificaciones no deseadas.

A veces puedo rastrear mis pasos y recordar lo que he escrito para reparar cualquier cambio o revertir cualquier configuración que haya modificado si me descubro temprano. Por desgracia, eso no es siempre el caso.

En Vim, podría tener algo tan inocuo y aparente como alterar una línea de texto que se deshace fácilmente. O bien, podría haber modificado sin saberlo algo que no es tan fácil de identificar. Si accidentalmente escribo una secuencia de comandos no deseados en Vim, ¿cómo puedo verificar y deshacer cualquier edición o cambio en la configuración?

JohnB
fuente
1
¿Estás buscando una acción de "reversión"? :e!haría eso
Jasper
1
Creo que :e!sería malo si no has guardado desde el último estado correcto, y upodría ser insuficiente si escribiste un montón de cosas. (Si ha escrito date month, por ejemplo, entonces habría eliminado una etiqueta, establecer una marca, y se realizó una búsqueda, que sería muy confuso para deshacer a través u.)
wchargin
1
@WChargin No se habla de un user parte de la secuencia, se realizan algunas acciones de deshacer en el medio.
yo '

Respuestas:

14

Invocar

:undolist

para ver cuándo realizó el último conjunto de cambios. Si dice que se hicieron algunos cambios, por ejemplo, "hace 3 segundos", y sabe que solo lo cambió intencionalmente , digamos, hace un minuto, luego ejecute

:earlier 10s

para volver al estado deseado. De lo contrario, si no hay cambios recientes, no tiene que hacer nada.


Además referencia: :help undo-tree .

wchargin
fuente
4

Para reformular la pregunta, está buscando una manera de ver u obtener notificaciones sobre los cambios que ha realizado en un archivo, y luego usar una función de deshacer. Tal vez haya otra forma o incluso complementos que lo admitan. Pero explicaré lo que he estado usando para el mismo propósito.

Combina la función vim existente para hacer esto. Por ejemplo, podría definir una función como:

" Function: View changes after the last save
function! s:DiffSinceSave()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
  exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffSinceSave()

Luego puede llamarlo más tarde e incluso asignar una tecla de acceso directo.

" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>

Esto abrirá una vista de diferencias basada en una ventana dividida que le mostrará los cambios realizados desde el último guardado. Después de haber identificado los cambios realizados, puede salir de esa vista y usar otras funciones de vim como deshacer y deshacer árbol, etc. o incluso complementos para volver a los estados anteriores.

Me doy cuenta de que esto no es ideal porque tienes que tener un cierto tipo de flujo de trabajo para que esto sea útil. Pero esto funciona bastante bien. Y en el lado positivo, no estamos cambiando cómo funciona vim ni confiamos en nada exterior.

Espero que encuentres esto útil. Hace un tiempo, adapté esta solución de fragmentos encontrados en Internet, incluido vim Wikia. Entonces ahí es donde se debe cualquier crédito.

Giveen
fuente
3

Me parece que la respuesta simple a esto es presionar uhasta que deshaga un cambio que desea conservar, luego presione Ctrl-R.

superjer
fuente
0

Como @superjer, sigo presionando uhasta que el [+]marcador rojo en mi línea de estado desaparece.

set statusline=%f\ %#Error#%m%##
joeytwiddle
fuente
Puede ser bueno tener una clave para deshacer automáticamente el último estado no modificado. Pero :e!también es una buena solución; en estos días, Vim incluso mantendrá sus cambios "descartados" en el historial de deshacer.
joeytwiddle
55
Ese comando es :earlier 1f. Los 1fmedios "1 anterior estado guardado", por lo que volverá a la anterior vez que guardó el archivo. Si se modifica el búfer, eso deshace todas las modificaciones. Si el búfer no se modifica (es decir, actualmente está en un estado guardado), irá a la hora anterior en que guardó el archivo.
jamessan