Можно ли удалить запись из истории отмен?

10

У меня есть эти строки в моем .vimrc, чтобы помочь с отступом:

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

Тем не менее, они создают много шума в истории отмены. Поскольку они, по сути, ничего не делают с точки зрения пользователя, я хотел бы удалить их из истории или, по крайней мере, как-то раздавить их (возможно, они будут отменены, если раздавлены вместе?). Есть ли способ сделать это?


источник
Я пытался сделать что-то подобное некоторое время назад, но это не так просто - мой вопрос Как я могу отфильтровать буфер для внешней команды при сохранении, не вызывая побочных эффектов? очень похоже. Мой вывод заключается в том, что это не совсем возможно.
Мартин Турной

Ответы:

5

Для тех, кто имеет эту проблему и интересуется, как ее обойти, не заставляя замолчать все ошибки, вот как я это сделал в своей статье .vimrc:

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

Кредит идет к Кристиану Брабандту и этому ответу от Рэнди Морриса

Kjir
источник
Вероятно, следует отметить, что этот Neoformatбит необходим, только если вы используете плагин neoformat , и будет вызывать проблемы, если у вас его нет.
8bittree
Ну да, команда зависит от вас, спасибо за указание на это!
Кджир
не должна ли 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
Отмена присоединения не допускается после выполнения отмены. Вы не можете изменить эти записи отмены тогда. Поэтому вы видите ошибку. Насколько я знаю, там вы не можете проверить это условие, поэтому вы можете включить это в try|catchпункт для E790 или просто использовать, :sil!чтобы отключить предупреждение.
Кристиан Брабандт
@ChristianBrabandt Есть ли разница между этими двумя методами?
да, один из них заставляет замолчать
частичную