Comment puis-je supprimer mon historique d'annulation dans vim?

23

Annuler est agréable à avoir dans Vim. Mais parfois, à un bon moment connu, je veux effacer mon historique d'annulation - pour pouvoir l'utiliser upour annuler des modifications individuelles, mais seulement à un certain point. (Par exemple, cela pourrait être la dernière fois que je me suis engagé.)

Une façon d'y parvenir serait de fermer et de rouvrir le fichier - l'historique d'annulation commence à ce point. Mais c'est un problème.

Dans le passé, j'ai accompli cela avec :edit!. Mais dans Vim 7.3, cela ne supprime pas l'historique d'annulation.

Existe-t-il une autre façon de procéder, à part fermer le fichier?

Nathan Long
la source
vous voulez donc simplement restaurer l'état du fichier tel qu'il était lors de votre dernier commit? vous voulez essentiellement remapper la touche «u» à quelque chose comme git checkout -f fileou hg rollback file?
akira
@akira - non, je veux pouvoir utiliser upour annuler des modifications individuelles, mais pas au-delà du point où je me suis engagé pour la dernière fois. Exactement comme si, chaque fois que je m'engageais, je fermais le fichier et le rouvrais. C'est ce :edit!que l'on faisait - c'était comme fermer le fichier et le rouvrir. Cela n'a PAS à être lié à un point de validation, c'est juste le moment où je le veux le plus souvent.
Nathan Long
ah, cela rend le problème beaucoup plus clair. vous devriez changer un peu votre question.
akira

Réponses:

11
:set undoreload=0 | edit

devrait faire ce que vous demandez.

Steven
la source
1
Ha! Il suffit de désactiver cette fonctionnalité, hein? :) Je ne sais pas pourquoi il m'a fallu si longtemps pour le remarquer.
Nathan Long
7

L'ancien: éditez! comportement dans une ligne:

:exe "set ul=-1 | e! | set ul=" . &ul
Aldrik
la source
Ça marche. Pourriez-vous l'expliquer?
Nathan Long
Concatène la valeur du paramètre undolevels à la fin de la chaîne de commandes (afin qu'il puisse être restauré) et les exécute. Pour plus d' informations consultez la documentation: :h :exe, :h :bar, :h :set-args, :h 'ul'et :h :edit!.
Aldrik
6

La fonction de Benoit n'a pas fonctionné pour moi, mais j'ai trouvé quelque chose de similaire dans le manuel de vim, ici:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

Je l'ai giflé dans une fonction, ajoutée à mon vimrc et cela semble bien fonctionner sur vim 7.3:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

Cela peut être utilisé avec :ClearUndo.

Nycto
la source
1
Fonctionnant normalement avec le plugin Gundo et le rechargement du fichier d'annulation, cette chose est vraiment pratique pour moi. Cependant, j'ai changé deux choses: au lieu de la commande d'édition normale (qui laisse elle-même un historique d'édition sur 7.4 semble-t-il), j'utilise simplement une édition! (et écrivez toujours avant d'effacer l'historique d'annulation). Il semble que certaines listes internes ne soient pas correctement mises à jour, donc si vous souhaitez l'utiliser avec le plugin Gundo, faites une modification supplémentaire! à la fin des fonctions l'empêchera de commettre des erreurs plus tard.
PlasmaHH
@PlasmaHH Pourriez-vous s'il vous plaît publier la fonction pour effacer l'historique d'annulation, parce que je ne comprenais pas ce que vous avez changé ... (vous pourriez peut-être le poster comme réponse pour ceux d'entre nous qui utilisent gundu). Merci
Ben
5

Probablement:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

( 'ul'est alias pour 'undolevels').

Benoit
la source
Cela marche! Maintenant, j'essaie de faire une seule commande pour cela - de préférence :edit!. Pour commencer, j'ai créé une fonction appelée ClearUndos () avec les commandes que vous avez répertoriées, mais l'appeler ne semble rien faire, alors que faire les commandes individuellement le fait ...
Nathan Long
3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit
est-ce censé être le contenu de la fonction? Ça ne marche pas pour moi, mais j'ai peut-être mal compris. Aussi - peut-être déplacer cela vers sa propre réponse?
Nathan Long
Peut-être que vous ne pouvez pas mettre brut |dans un contenu de commande. Créez ensuite une fonction qui fait ce que j'ai dit dans ma réponse et définissez la commande sur call thefunction().
Benoit
3

"Effacer l'historique des annulations (: w pour effacer le fichier d'annulation s'il est présenté)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Lorsque vous définissez «undolevels» sur -1, les informations d'annulation ne sont pas immédiatement effacées, cela se produit lors du prochain changement, c'est m-1-à- dire qui ne change pas réellement votre texte.
  • Lorsque 'undofile'est activé, :wpour effacer le fichier d'annulation ou une chaîne similaire UndoClear|w.
Bohr
la source
1

Dans un script:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

Utilisez ensuite :Resetpour l'appeler.

Benoit
la source
Votre ligne de définition de fonction a besoin de () à la fin.
Nathan Long
C'est étrange - l'exécution de ces commandes individuellement fonctionne bien, et l'écho des valeurs dans toute la fonction montre qu'elles sont définies et désactivées de manière appropriée. Mais l'exécution de la fonction ne réinitialise pas mon historique d'annulation - après, je peux toujours annuler plusieurs fois. Peut-être que la set ul=commande affecte uniquement une variable locale jusqu'à la fin du script, et puisque nous la modifions avant la fin du script, elle n'affecte jamais l'environnement? Avez-vous testé cette fonction et l'avez-elle fonctionnée - ce qui signifie, y a-t-il quelque chose d'étrange dans ma configuration?
Nathan Long