Comment annuler en toute sécurité les modifications que j'ai pu ou non avoir apportées?

12

Trop souvent, je fais l'erreur de taper avec la mauvaise fenêtre focalisée (et je l'ai fait plusieurs fois avec un authentificateur USB). Dans les programmes avec beaucoup de raccourcis clavier activés (Gmail, VLC, Vim), cela a souvent pour conséquence involontaire de faire des modifications indésirables.

Je peux parfois suivre mes étapes et me souvenir de ce que j'ai tapé pour réparer les modifications ou annuler les paramètres que j'ai modifiés si je me rattrape tôt. Malheureusement, ce n'est pas toujours le cas.

Dans Vim, je pourrais avoir quelque chose d'aussi anodin et apparent que de modifier une ligne de texte qui se défait facilement. Ou, j'aurais pu modifier sans le savoir quelque chose qui n'est pas si facile à identifier. Si je tape accidentellement une séquence de commandes indésirables dans Vim, comment puis-je vérifier et annuler les modifications ou changements de paramètres?

JohnB
la source
1
Recherchez-vous une action "revenir"? :e!ferait cela
Jasper
1
Je pense que ce :e!serait mauvais si vous n'avez pas enregistré depuis le dernier état correct, et upourrait être insuffisant si vous avez tapé un tas de choses. (Si vous avez tapé date month, par exemple, vous auriez supprimé une balise, défini une marque et effectué une recherche, ce qui serait assez déroutant à annuler via u.)
wchargin
1
@WChargin Ne pas parler de ufaire partie de la séquence, effectuer des annulations au milieu.
yo '

Réponses:

14

Invoquer

:undolist

pour savoir quand vous avez effectué la dernière série de modifications. S'il indique que quelques modifications ont été apportées, par exemple, "il y a 3 secondes", et que vous savez que vous ne les avez intentionnellement modifiées, disons, il y a une minute, puis exécutez

:earlier 10s

pour revenir à l'état souhaité. Sinon, s'il n'y a pas de changements récents, vous n'avez rien à faire.


En outre référence: :help undo-tree .

wchargin
la source
4

Pour reformuler la question, vous recherchez un moyen de voir ou d'être informé des modifications que vous avez apportées à un fichier, puis utilisez une fonction d'annulation. Il existe peut-être une autre façon ou même des plugins qui prennent en charge cela. Mais je vais expliquer ce que j'utilise dans le même but.

Vous combinez la fonction vim existante pour y parvenir. Par exemple, vous pouvez définir une fonction telle que:

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

Vous pouvez ensuite l'appeler plus tard et même mapper une touche de raccourci.

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

Cela ouvrira une vue diff basée sur une fenêtre divisée qui vous montrera les modifications apportées depuis la dernière sauvegarde. Après avoir identifié les modifications apportées, vous pouvez quitter cette vue et utiliser d'autres fonctionnalités de vim telles que l'annulation et l'annulation de l'arborescence, etc. ou même des plugins pour revenir aux états précédents.

Je me rends compte que ce n'est pas idéal parce que vous devez avoir un certain type de flux de travail pour que cela soit utile. Mais cela fonctionne assez bien. Et du côté positif, nous ne changeons pas le fonctionnement de vim et ne nous appuyons pas sur quoi que ce soit à l'extérieur.

J'espère que vous trouvez ça utile. J'ai adapté cette solution il y a quelque temps à partir d'extraits trouvés sur Internet, y compris vim Wikia. C'est donc là que tout crédit est dû.

giveen
la source
3

Il me semble que la réponse simple à cela est d'appuyer sur ujusqu'à ce que vous annuliez une modification que vous vouliez conserver, puis d'appuyer sur Ctrl-R.

superjer
la source
0

Comme @superjer, je continue d'appuyer ujusqu'à ce que le [+]marqueur rouge de ma ligne d'état disparaisse.

set statusline=%f\ %#Error#%m%##
joeytwiddle
la source
Il serait peut-être bien d'avoir une clé pour revenir automatiquement au dernier état non modifié. Mais :e!c'est aussi une bonne solution; ces jours-ci, Vim conservera même vos modifications "rejetées" dans l'historique d'annulation.
joeytwiddle
5
Cette commande est :earlier 1f. Les 1fmoyens « 1 état enregistré précédent », il va revenir à la précédente vous avez enregistré le fichier. Si le tampon est modifié, cela annule toutes les modifications. Si le tampon n'est pas modifié (c'est-à-dire qu'il est actuellement dans un état enregistré), il reviendra à l'heure précédente où vous avez enregistré le fichier.
jamessan