Perintah perintah otomatis dijalankan ketika satu peristiwa terjadi. Anda ingin perintah dieksekusi setelah urutan peristiwa telah terjadi. Salah satu cara untuk melakukannya adalah seperti ini:
autocmd FileType c,cpp,python
\ autocmd BufWritePre <buffer> call StripTrailingWhiteSpaces()
The <buffer>
Pola menyebabkan autocommand yang akan dipicu ketika buffer saat ditulis. Lihat
:help autocmd-buflocal
Memperbarui
Solusi di atas cukup sederhana dan memiliki beberapa kekurangan yang dibahas dalam Komentar. Berikut ini adalah solusi yang lebih lengkap untuk mengatasi beberapa kekurangan tersebut. Itu menempatkan autocommand dalam grup dan menghapus autocommand BufWritePre, jika ada, sebelum membuat yang baru. Itu masih membuat satu perintah otomatis per buffer, tetapi hanya satu.
augroup TrailSpace
autocmd FileType c,cpp,python
\ autocmd! TrailSpace BufWritePost <buffer> call SkipTrailingWhiteSpaces()
augroup END
Solusi lain, mirip dengan jawaban yang diposting oleh lcd047, sekarang dihapus, adalah untuk mengenali bahwa ketika peristiwa FileType terjadi, opsi 'filetype' diatur. Kemudian Anda dapat mengkondisikan respons terhadap acara BufWritePost pada nilai 'filetype', seperti dalam contoh berikut. Ini memiliki keunggulan dibandingkan solusi lain yang hanya dibuat satu autocommand.
autocmd BufWritePre * if count(['c','cpp','python'],&filetype)
\ | call SkipTrailingWhiteSpaces()
\ | endif
FileType
autocmd dalam jawabannya akan sudah mengatur autocmd kedua (BufWritePre
) untuk diaktifkan ketika Anda menyimpannya.FileType
autocmd atas kehendak api untuk setiap file yang dibuka dengan filetype benar, dan kemauan setup penyangga-lokal acara untuk setiap file-file. Jadi, jika Anda menjalankan:wa
, vim akan menjalankan aktivitas terdaftar untuk setiap buffer, sebelum menyimpan ke file.autocmd
s alih-alih satu file, semua tertulis. Kemudian jika, katakanlah, 3 file ini disembunyikan, lalu ditampilkan kembali,FileType
dipicu kembali sehingga Anda mendapatkan 3 file lagiautocmd
, juga saat ditulis. Ini luar biasa, saya heran mengapa saya tidak menemukan solusi ini. :)stripTrailingWhiteSpaces()
beberapa kali terhadap file yang sama mungkin memiliki konsekuensi yang tidak diinginkan. Juga, semakin banyakautocmd
yang Anda miliki untuk acara yang sama untuk file yang sama, semakin besar kemungkinan Anda mengalami beberapa kondisi yang benar-benar berlomba. Coba cari arsip vim_dev untuk mendapatkan ide. Kemudian lagi, apa yang saya tahu, mungkin hanya bekerja untuk Anda, bukan?Secara umum, jika Anda tidak tahu acara mana yang akan terjadi terlebih dahulu, Anda dapat menggunakan helper untuk melacak ketika masing-masing menyala dan hanya menjalankan perintah Anda ketika yang terakhir menyala:
sumber