É 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?


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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.