Apakah mungkin untuk menghapus entri dari undo history?

10

Saya memiliki baris-baris ini di .vimrc untuk membantu indentasi:

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

Namun, mereka membuat banyak suara dalam sejarah undo. Karena mereka pada dasarnya tidak melakukan apa pun dari sudut pandang pengguna, saya ingin menghapusnya dari sejarah atau setidaknya memencetnya entah bagaimana (mungkin mereka membatalkan jika terjepit bersama?). Apakah ada cara untuk melakukannya?


sumber
Saya mencoba melakukan sesuatu seperti ini beberapa waktu yang lalu, tetapi tidak begitu mudah - pertanyaan saya Bagaimana saya bisa memfilter buffer ke perintah eksternal pada save tanpa menyebabkan efek samping? sangat mirip. Kesimpulan saya adalah itu tidak benar-benar mungkin.
Martin Tournoij

Jawaban:

5

Bagi mereka yang memiliki masalah ini dan bertanya-tanya bagaimana cara mengatasinya tanpa membungkam semua kesalahan, berikut adalah bagaimana saya melakukannya di .vimrc:

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

Penghargaan untuk Christian Brabandt dan jawaban ini dari Randy Morris

Kjir
sumber
Mungkin perlu dicatat bahwa Neoformatbit hanya diperlukan jika Anda menggunakan plugin neoformat , dan akan menyebabkan masalah jika Anda tidak memilikinya.
8bittree
Baiklah ya, perintahnya terserah Anda, terima kasih sudah menunjukkannya!
Kjir
bukankah seharusnya Neoformatperintah datang di akhir (atau lebih tepatnya di finallyblok)? Kalau tidak, itu tidak akan dieksekusi jika :undojoinmelempar kesalahan.
Christian Brabandt
4

Penggunaan undojoinsebenarnya bekerja cukup baik:

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

Namun, jika Anda mengeksekusi :wtepat setelah membatalkan suatu tindakan, Anda akan mendapatkan kesalahan:

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

Kesalahan ini dapat dibungkam menggunakan silent!seperti yang disebutkan dalam komentar , tetapi mungkin memiliki beberapa efek samping yang tidak disengaja:

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

sumber
2
undojoin tidak diizinkan setelah undo selesai. Anda tidak dapat mengubah entri yang dibatalkan itu. Karena itu Anda melihat kesalahan. Sejauh yang saya tahu, di sana Anda tidak dapat memeriksa kondisi ini, jadi Anda mungkin ingin membungkus ini menjadi try|catchklausa untuk E790 atau cukup gunakan :sil!untuk membungkam peringatan.
Christian Brabandt
@ChristianBrabandt Apakah ada perbedaan antara kedua teknik?
ya, yang satu membungkam kesalahan partikel, yang lain membungkam setiap kesalahan
Christian Brabandt