Quando editamos um arquivo, normalmente fazemos muitos UNDO seguidos, digamos, 20 vezes. No VIM, isso geralmente é realizado pressionando u
20 vezes e faz com que o VIM suba na pilha de histórico 20 posições. Se você confirmar change
, todos os últimos 20 comandos do histórico serão perdidos e substituídos por change
. Eu gostaria de fazer o change
sem perder essas 20 posições. Então, acho que gostaria de dizer ao VIM para parar de gravar o histórico antes de fazê-lo change
e continuar o histórico depois (não o quero change
).
EDIT
Tentando ser mais claro: Eu tenho uma função FF
que atualiza as últimas linhas de um arquivo quando o buffer é gravado. Portanto, se eu executar 20 undos + write
, o último write
abre um novo ramo de desfazer. Tentei adicionar por undojoin
dentro FF
(tentando seguir uma sugestão do jlmg abaixo), mas uma sequência write-undo-write dá um erro: undojoint não é permitido após desfazer . Em vez disso, eu poderia fazer algumas coisas sed ....
depois de sair vim
, mas como utilizo isso SSH
, prefiro uma solução apenas para vim (execute um comando após descarregar o buffer não grava no arquivo).
EDIÇÃO 2 Tente fazer isso no VIM: abra um arquivo em branco e faça:
i1<ESC>:wa2<ESC>:wa3<ESC>:wa4<ESC>uu:w
Se agora você fizer um <CTRL>R
, o VIM escreverá o '3' de volta, mais <CTRL>R
você receberá o 4
. Isso acontece mesmo se você fizer um :w
após cada um <CTRL>R
. No entanto, se cada vez que :w
você executa uma função via BufWritePre
, o<CTRL>R
ela não escreverá o 3
verso. E é isso que eu quero fazer, é por isso que escrevi para 'suspender a historia', mas talvez o que estou pedindo não seja possível, além de trabalhar com o máximo undotree()
.
vi
, masvi
o comando desfazer para mim desfaz uma vez e, quando você pressionau
novamente, desfaz o desfazer ("refazer"). Isso é real vi. Portanto, eu e outros usuários deste site talvez não saibamos a resposta para sua pergunta.vim.se
, eu teria tentado isso. Enfim, parece que Sato sabe como ajudar.sed
, mas sed não pode desfazer suas ações, então como isso vai funcionar? Se você fosse capaz de "suspender a história", que tipo de comportamento você esperaria do vim ao desfazer uma ação depois? O único comportamento que eu pude visualizar é agrupar essas alterações (junto com as ações desfazer) em um bloco desfazer, daí a minha resposta. Mas se não é isso, o que é?Respostas:
Você não precisa suspender o histórico do Vim. Os dados reais formam uma árvore e você pode recuperá-los com a
undotree()
função Existem, é claro, vários plugins que transformam isso em algo mais amigável ao usuário, fi gundo , mundo e não- árvore . Se você também ativar desfazer persistência (cf.:h undo-persistence
), poderá navegar facilmente por todo o histórico de alterações de um arquivo.fonte
undotree()
deve ajudar?change
isso não apareça, em lugar algum, nem dentrohistory
, nem naundo
árvore. Por isso minha pergunta foi "suspender a história".:earlier
, que aceita uma unidade de tempo e, se necessário, cruzará as ramificações, se necessário (por exemplo,:earlier 1h
faz com que o buffer pareça com uma hora atrás). Se você não puder usar uma unidade de tempo (porque as alterações foram muito próximas?), Será necessário usá-log-
para percorrer a árvore de desfazer algumas etapas por vez.Se eu entendi direito, o que você quer é que, depois de desfazer, desfaça
change
e os 20 desfazer.Quando o vim executa uma função ou comando, todas as ações que ele executa são desfeitas juntas. Não tenho certeza se essas ações podem incluir desfazer. Talvez esta parte da documentação possa ajudar:
Infelizmente, tentei usar
:undo 2 | undojoin | normal ohi
, mas recebi a mensagem de erroE790: undojoin is not allowed after undo
.No entanto, se as ações forem executadas em uma função como esta:
em seguida, chamá-lo de
:call F()
executa aundo
e outra ação em um bloco de desfazer. Observe que, ao usar desfazer, você cria um novo ramo de desfazer. Após terminar, você pode usar o comando do modo normalg-
, para desfazerF()
; usaru
será como ter feito:undo 3
no começo.fonte
undo
, tudo o que você faz em sua funçãoF()
não abra um novo ramo de desfazer. No meu caso,F()
é executado toda vez que eu escrevo o arquivo e, se eu fizerundo
e depois gravar,F()
abre uma nova ramificação desfazer. Eu tentei comundojoin
no inícioF()
, mas uma seqüência write-desfazer-write dá um erro:undojoint not allowed after undo
.:undojoin
não funcionou para o que você queria, mencionando o mesmo erro, e eu não estava sugerindo o uso:undojoin
no início deF()
.F()
destina-se a fazer o:undojoin
que não podia, que é unir os desfazer e outros comandos em um bloco de desfazer.g-
eg+
.