Lorsque nous modifions un fichier, nous effectuons généralement plusieurs annulations consécutives, disons 20 fois. Dans VIM, cela se fait généralement en appuyant u
20 fois, et cela fait remonter VIM dans la pile d'historique 20 positions. Si vous faites ensuite un certain change
, toutes ces 20 dernières commandes d'historique sont perdues et remplacées par change
. Je voudrais faire le change
sans perdre ces 20 positions. Je suppose donc que je voudrais dire à VIM d'arrêter d'enregistrer l'historique avant de le faire change
et de reprendre l'historique après (je ne veux pas change
dans l'histoire).
EDIT
Essayer d'être plus clair: j'ai une fonction FF
qui met à jour les dernières lignes d'un fichier lorsque le tampon est écrit. Donc, si je joue 20 undos + write
, le dernier write
ouvre une nouvelle branche d'annulation. J'ai essayé d'ajouter à l' undojoin
intérieur FF
(en essayant de suivre une suggestion de jlmg ci-dessous), mais une séquence écriture-annulation-écriture donne une erreur: undojoint non autorisé après l'annulation . Je pourrais plutôt en faire sed ....
après avoir quitté à la vim
place, mais comme j'utilise ceci via, SSH
je préfère une solution vim uniquement (exécuter une commande après avoir déchargé le tampon n'écrit pas dans le fichier).
EDIT 2 Essayez de faire ceci dans VIM: ouvrez un fichier vierge et faites:
i1<ESC>:wa2<ESC>:wa3<ESC>:wa4<ESC>uu:w
Si maintenant vous faites un <CTRL>R
, VIM réécrira le «3», plus <CTRL>R
vous obtiendrez le 4
. Cela se produit MÊME si vous faites un :w
après chacun <CTRL>R
. Cependant, si à chaque fois que vous effectuez une :w
exécution, vous n'effectuerez pas de fuction via BufWritePre
, le <CTRL>R
ne réécrira pas 3
. Et c'est ce que je veux faire, c'est pourquoi j'ai écrit pour «suspendre l'histotrie», mais peut-être que ce que je demande n'est pas possible, en plus de travailler avec le plein undotree()
.
vi
, mais pour moi,vi
la commande d'annulation annule une fois, puis lorsque vous appuyez àu
nouveau, elle annule l'annulation ("redo"). C'est vrai vi. Donc, moi et les autres utilisateurs de ce site ne connaissons peut-être pas la réponse à votre question.vim.se
, j'aurais essayé ça. Quoi qu'il en soit, il semble que Sato sait comment aider.sed
, mais sed ne peut pas faire vos annulations, alors comment ça va marcher? Si vous pouviez "suspendre l'historique", quel comportement aimable attendriez-vous de Vim lorsque vous effectuerez une annulation par la suite? Le seul comportement que je pouvais visualiser est de regrouper ces changements (avec les annulations) dans un bloc d'annulation, d'où ma réponse. Mais si ce n'est pas ça, c'est quoi?Réponses:
Vous n'avez pas besoin de suspendre l'historique de Vim. Les données réelles forment un arbre et vous pouvez les récupérer avec la
undotree()
fonction. Il existe, bien sûr, un certain nombre de plugins qui en font quelque chose de plus convivial, fi gundo , mundo et undotree . Si vous activez également l'annulation de la persistance (cf.:h undo-persistence
), vous pouvez facilement parcourir tout l'historique des modifications d'un fichier.la source
undotree()
devrait aider?change
n'apparaisse pas du tout, nulle part, ni danshistory
, ni dans l'undo
arbre. C'est pourquoi ma question était de "suspendre l'histoire".:earlier
, qui accepte une unité de temps et traversera les branches d'annulation si nécessaire (par exemple,:earlier 1h
fait ressembler le tampon à celui qu'il y a une heure). Si vous ne pouvez pas utiliser une unité de temps (parce que les changements étaient trop proches les uns des autres?), Vous devrez utiliserg-
pour parcourir l'arbre d'annulation quelques étapes à la fois.Si je vous comprends bien, ce que vous voulez, c'est qu'après cela, une annulation soit
change
annulée et les 20 annulations.Lorsque vim exécute une fonction ou une commande, toutes les actions qu'il effectue sont annulées ensemble. Je ne sais pas si ces actions peuvent inclure des annulations. Peut-être que cette partie de la documentation peut aider:
Hélas, j'ai essayé d'utiliser
:undo 2 | undojoin | normal ohi
, mais j'ai reçu le message d'erreurE790: undojoin is not allowed after undo
.Cependant, si les actions sont effectuées dans une fonction comme celle-ci:
puis l'appeler avec
:call F()
effectue laundo
et l'autre action dans un bloc d'annulation. Notez que parce que vous utilisez l'annulation, vous créez une nouvelle branche d'annulation. Une fois l'opération terminée, vous pouvez utiliser la commande du mode normalg-
pour annulerF()
; utiliseru
sera comme avoir fait:undo 3
au début.la source
undo
, tout ce que vous faites dans votre fonctionF()
n'ouvre pas une nouvelle branche d'annulation. Dans mon cas,F()
est exécuté à chaque fois que j'écris le fichier, et si je le faisundo
, puis j'écris le fichier,F()
ouvre une nouvelle branche d'annulation. J'ai essayé avecundojoin
au début deF()
, mais une séquence d' écriture-undo-écriture donne une erreur:undojoint not allowed after undo
.:undojoin
ne fonctionnait pas pour ce que vous vouliez, en mentionnant la même erreur, et je ne proposais pas d'utiliser:undojoin
au débutF()
.F()
est censé faire ce qui:undojoin
ne pouvait pas, c'est-à-dire joindre les annulations et autres commandes dans un bloc d'annulation.g-
etg+
.