Se eu entendi corretamente o que você quer é que depois de desfazer deve desfazer o change
e os 20 undos.
Quando o vim executa uma função ou comando, todas as ações que ele faz são desfeitas juntas. Não tenho certeza se essas ações podem incluir undos. Talvez essa parte da documentação possa ajudar:
3. Undo blocks *undo-blocks*
One undo command normally undoes a typed command, no matter how many changes
that command makes. This sequence of undo-able changes forms an undo block.
Thus if the typed key(s) call a function, all the commands in the function are
undone together.
If you want to write a function or script that doesn't create a new undoable
change but joins in with the previous change use this command:
*:undoj* *:undojoin* *E790*
:undoj[oin] Join further changes with the previous undo block.
Warning: Use with care, it may prevent the user from
properly undoing changes. Don't use this after undo
or redo.
{not in Vi}
This is most useful when you need to prompt the user halfway through a change.
For example in a function that calls |getchar()|. Do make sure that there was
a related change before this that you must join with.
This doesn't work by itself, because the next key press will start a new
change again. But you can do something like this: >
:undojoin | delete
After this an "u" command will undo the delete command and the previous
change.
To do the opposite, break a change into two undo blocks, in Insert mode use
CTRL-G u. This is useful if you want an insert command to be undoable in
parts. E.g., for each sentence. |i_CTRL-G_u|
Setting the value of 'undolevels' also breaks undo. Even when the new value
is equal to the old value.
Infelizmente, tentei usar :undo 2 | undojoin | normal ohi
, mas recebi a mensagem de erro E790: undojoin is not allowed after undo
.
No entanto, se as ações forem executadas em uma função como esta:
function F()
undo 2
normal ohi
endfunction
, em seguida, chamá-lo com :call F()
realiza a undo
e outra ação em um bloco de undo. Observe que, como você está usando desfazer, está criando uma nova ramificação de desfazer. Depois disso, você pode usar o comando normal mode g-
para desfazer F()
; usar u
será como ter feito :undo 3
no começo.