Чи можливо видалити запис з історії скасування?


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

Кредит Крістіан Брабандт і відповідь на цю відповідь від Ренді Морріса


Напевно, слід зауважити, що 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
скасування з'єднання заборонено після того, як було скасовано скасування. Ви не можете змінити ці записи скасування. Тому ви бачите помилку. Наскільки я знаю, там ви не можете перевірити цю умову, тому, можливо, ви захочете зафіксувати це в try|catchпункті для E790 або просто використати, :sil!щоб заглушити попередження.
Крістіан Брабандт

@ChristianBrabandt Чи є різниця між двома методиками?

так, один замовчує
частинку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.