É possível remover uma entrada do histórico de desfazer?

10

Eu tenho estas linhas no meu .vimrc para ajudar com o recuo:

autocmd BufReadPost * set noexpandtab | retab! 4
autocmd BufWritePre * set expandtab | retab! 4
autocmd BufWritePost * set noexpandtab | retab! 4

No entanto, eles criam muito ruído na história de desfazer. Como eles essencialmente não fazem nada da perspectiva do usuário, eu gostaria de removê-los da história ou, pelo menos, esmagá-los de alguma forma (talvez eles cancelem se forem esmagados juntos?). Tem algum jeito de fazer isso?


fonte
Eu tentei fazer algo assim há um tempo atrás, mas não é tão fácil - minha pergunta Como posso filtrar um buffer para um comando externo ao salvar sem causar efeitos colaterais? é muito parecido. Minha conclusão é que não é realmente possível.
Martin Tournoij 17/11/16

Respostas:

5

Para aqueles que têm esse problema e se perguntam como contorná-lo sem silenciar todos os erros, eis como eu o fiz no meu .vimrc:

au BufWritePre * try | undojoin | Neoformat | catch /^Vim\%((\a\+)\)\=:E790/ | endtry

O crédito é para Christian Brabandt e para esta resposta de Randy Morris

Kjir
fonte
Provavelmente, deve-se notar que o Neoformatbit é necessário apenas se você estiver usando o plug-in neoformato e causará problemas se você não o tiver.
8bittree
Bem, sim, o comando é com você, obrigado por apontar!
Kjir
o Neoformatcomando não deveria vir no final (ou melhor, em um finallybloco)? Caso contrário, não seria executado se :undojoingerar um erro.
Christian Brabandt
4

Usar undojoinrealmente funciona muito bem:

autocmd BufReadPost *  undojoin | set noexpandtab | retab! 4
autocmd BufWritePre *  undojoin | set expandtab   | retab! 4
autocmd BufWritePost * undojoin | set noexpandtab | retab! 4

No entanto, se você executar :wlogo após desfazer uma ação, receberá um erro:

Error detected while processing BufWritePre Auto commands for "*":
E790: undojoin is not allowed after undo
Error detected while processing BufWritePost Auto commands for "*":
E790: undojoin is not allowed after undo

Este erro pode ser silenciado usando silent!o mencionado nos comentários , mas pode ter alguns efeitos colaterais não intencionais:

autocmd BufReadPost *  silent! undojoin | set noexpandtab | retab! 4
autocmd BufWritePre *  silent! undojoin | set expandtab   | retab! 4
autocmd BufWritePost * silent! undojoin | set noexpandtab | retab! 4

fonte
2
desfazer não é permitido depois que um desfazer foi feito. Você não pode alterar essas entradas desfazer então. Portanto, você vê o erro. Até onde eu sei, não é possível verificar essa condição; portanto, você pode incluir isso em uma try|catchcláusula para o E790 ou simplesmente usar :sil!para silenciar o aviso.
Christian Brabandt
@ChristianBrabandt Existe alguma diferença entre as duas técnicas?
sim, um silencia um erro de partícula, o outro silencia todo erro #
Christian Brabandt 19/11/16