是否可以从撤消历史记录中删除条目?


10

我的.vimrc中有以下几行可以帮助缩进:

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

但是,它们会在撤消历史中产生大量噪音。由于从用户的角度来看,它们基本上什么也不做,因此我想从历史记录中删除它们,或者至少以某种方式挤压它们(如果一起挤压,它们可能会取消?)。有办法吗?


我曾经尝试做类似的事情,但这并不是那么容易–我的问题是如何在保存时过滤缓冲区到外部命令而不会引起任何副作用?非常相似。我的结论是,这实际上是不可能的。
马丁·图尔诺伊

Answers:


5

对于那些有此问题并想知道如何解决而又不消除所有错误的人,以下是我在我的系统中的处理方法.vimrc

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

归功于克里斯汀·布拉班德Christian Brabandt)兰迪·莫里斯(Randy Morris)的回答


可能应该注意的Neoformat是,只有当您使用neoformat插件时,该位才是必需的,否则,将导致问题。
8bittree

好吧,命令由您决定,谢谢您指出!
Kjir

Neoformat命令不应该在末尾(或者成finally块地)吗?否则,如果:undojoin引发错误,它将不会执行。
克里斯蒂安·布拉班德

4

使用undojoin实际上效果很好:

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

但是,如果:w在撤消操作后立即执行,则会收到错误消息:

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

可以使用注释中silent!提到的方法使此错误消失,但是可能会有一些意外的副作用:

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
撤消完成后,不允许执行undojoin。然后,您不能更改这些撤消条目。因此,您会看到错误。据我所知,您无法在此处检查此条件,因此您可能希望将此条件包装到try|catchE790 的子句中,或仅用于:sil!使警告静音。
Christian Brabandt

@ChristianBrabandt两种技术之间有区别吗?

是的,一个确实使微粒错误
消失
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.