Come posso annullare in modo sicuro le modifiche che posso o non posso aver fatto?


12

Troppo spesso faccio l'errore di digitare con la finestra sbagliata focalizzata (e l'ho fatto alcune volte con un autenticatore USB). Nei programmi con molti tasti di scelta rapida abilitati (Gmail, VLC, Vim), ciò ha spesso la conseguenza involontaria di apportare modifiche indesiderate.

A volte riesco a rintracciare i miei passi e ricordare ciò che ho digitato per riparare eventuali modifiche o ripristinare qualsiasi impostazione che ho modificato se mi prendo presto. Sfortunatamente, non è sempre così.

In Vim, potrei avere qualcosa di innocuo e apparente come l'alterazione di una riga di testo che può essere facilmente annullata. Oppure avrei potuto inconsapevolmente modificare qualcosa che non era così facilmente identificabile. Se digito accidentalmente una sequenza di comandi indesiderati in Vim, come posso controllare e annullare eventuali modifiche o modifiche alle impostazioni?


1
Sei alla ricerca di un'azione "ripristinata"? :e!lo farebbe
Jasper,

1
Penso che :e!sarebbe male se non si fosse salvato dall'ultimo stato corretto e upotrebbe essere insufficiente se si digitasse un sacco di cose. (Se hai digitato date month, ad esempio, avresti cancellato un tag, impostato un segno ed eseguito una ricerca, il che sarebbe abbastanza confuso da annullare tramite u.)
wchargin

1
@WChargin Non sta parlando di ufar parte della sequenza, eseguendo alcuni annullamenti nel mezzo.
yo'

Risposte:


14

Invocare

:undolist

per vedere quando hai apportato l'ultima serie di modifiche. Se si dice che sono state apportate alcune modifiche, ad esempio "3 secondi fa" e si sa che è stato modificato solo intenzionalmente , ad esempio un minuto fa, quindi eseguire

:earlier 10s

per tornare allo stato desiderato. Altrimenti, se non ci sono cambiamenti recenti, non devi fare nulla.


Ulteriore riferimento: :help undo-tree .


4

Per riformulare la domanda, stai cercando un modo per vedere o ricevere notifiche in merito alle modifiche apportate a un file, quindi utilizzare una funzione di annullamento. Forse c'è un altro modo o addirittura plugin che supporta questo. Spiegherò cosa ho usato per lo stesso scopo.

Combina la funzione vim esistente per farlo. Ad esempio, è possibile definire una funzione come:

" 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()

Puoi quindi chiamarlo in un secondo momento e persino mappare un tasto di scelta rapida.

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

Questo aprirà una vista diff basata su una finestra divisa che ti mostrerà le modifiche apportate dall'ultimo salvataggio. Dopo aver identificato le modifiche apportate, è possibile uscire da quella vista e utilizzare altre funzionalità di vim come annulla e annulla albero, ecc. O persino plug-in per tornare agli stati precedenti.

Mi rendo conto che questo non è l'ideale perché devi avere un certo tipo di flusso di lavoro affinché questo sia utile. Ma funziona abbastanza bene. E il lato positivo, non stiamo cambiando il modo in cui vim funziona o facendo affidamento su qualcosa al di fuori.

Spero che lo trovi utile Ho adattato questa soluzione qualche tempo fa da frammenti trovati su Internet tra cui vim Wikia. Ecco dove è dovuto qualsiasi credito.


3

Mi sembra che la semplice risposta sia premere ufino a quando non annulli una modifica che desideri mantenere, quindi premi Ctrl-R.


0

Come @superjer, continuo a premere ufino a quando l' [+]indicatore rosso nella mia linea di stato scompare.

set statusline=%f\ %#Error#%m%##

Potrebbe essere utile disporre di una chiave per annullare automaticamente il ritorno all'ultimo stato non modificato. Ma :e!è anche una bella soluzione; in questi giorni Vim manterrà anche le modifiche "scartate" nella cronologia degli annullamenti.
joeytwiddle,

5
Questo comando è :earlier 1f. I 1fmezzi "1 precedente stato salvato", così si torna a quello precedente è stato salvato il file. Se il buffer viene modificato, ciò annulla tutte le modifiche. Se il buffer non viene modificato (ovvero, è attualmente in uno stato salvato), passerà alla volta precedente in cui è stato salvato il file.
Jamessan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.