¿Es posible eliminar una entrada del historial de deshacer?

10

Tengo estas líneas en mi .vimrc para ayudar con la sangría:

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

Sin embargo, crean mucho ruido en la historia de deshacer. Dado que esencialmente no hacen nada desde la perspectiva del usuario, me gustaría eliminarlos del historial o, al menos, aplastarlos de alguna manera (¿tal vez se cancelen si se aplastan juntos?). ¿Hay una manera de hacerlo?


fuente
Intenté hacer algo como esto hace un tiempo, pero no es tan fácil: mi pregunta ¿Cómo puedo filtrar un búfer a un comando externo al guardar sin causar ningún efecto secundario? Es muy similar. Mi conclusión es que no es realmente posible.
Martin Tournoij

Respuestas:

5

Para aquellos que tienen este problema y se preguntan cómo solucionarlo sin silenciar todos los errores, así es como lo hice en mi .vimrc:

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

El crédito es para Christian Brabandt y para esta respuesta de Randy Morris

Kjir
fuente
Probablemente debería tenerse en cuenta que el Neoformatbit solo es necesario si está utilizando el complemento neoformat , y causará problemas si no lo tiene.
8bittree
Bueno, sí, el comando depende de ti, ¡gracias por señalarlo!
Kjir
¿No debería el Neoformatcomando llegar al final (o más bien en un finallybloque)? De lo contrario, no se ejecutaría si :undojoinarroja un error.
Christian Brabandt
4

Usar undojoinrealmente funciona bastante bien:

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

Sin embargo, si ejecuta :winmediatamente después de deshacer una acción, obtendrá un error:

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 error puede silenciarse usando silent!como se menciona en los comentarios , pero puede tener algunos efectos secundarios no intencionales:

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

fuente
2
No se permite deshacer la unión después de que se haya realizado un deshacer. No puede cambiar esas entradas de deshacer entonces. Por lo tanto, ves el error. Hasta donde sé, no puede verificar esta condición, por lo que es posible que desee envolver esto en una try|catchcláusula para E790 o simplemente usar :sil!para silenciar la advertencia.
Christian Brabandt
@ChristianBrabandt ¿Hay alguna diferencia entre las dos técnicas?
sí, uno silencia un error particular, el otro silencia cada error
Christian Brabandt