Nonaktifkan penyorotan sintaks tergantung pada ukuran dan jenis file


16

Saya sering harus mengedit berbagai file XML dengan vim, yang ukurannya sangat bervariasi - dari file konfigurasi yang berisi beberapa baris hunded hingga file data produksi dengan ukuran hingga 2GB. Memiliki penyorotan sintaks yang diaktifkan tentu saja merupakan ide yang sangat buruk ketika berhadapan dengan file besar, jadi saya ingin menonaktifkannya jika file lebih besar dari ambang.

Saya tidak bisa menggunakan ini autocommandsecara langsung untuk menonaktifkan penyorotan sintaks, karena tampaknya perintah dijalankan sebelum sintaks diaktifkan ketika memulai vim dari shell:

" this autocmd has no effect except for the echo:
autocmd Filetype xml if getfsize(@%) > 1000000 | echom '!' | syntax off | endif

Saya menemukan solusi di mana saya dapat menonaktifkan penyorotan sintaksis secara global, kemudian nyalakan lagi untuk semua tipe file selain xml, dan nyalakan untuk filetype xml jika file tidak lebih besar dari ambang:

syntax off
autocmd Filetype * syntax off
autocmd Filetype * if &ft != 'xml' | syntax enable | endif
autocmd Filetype xml if getfsize(@%) < 1000000 | syntax enable | endif

Ini tampaknya berhasil, tetapi terasa salah dan akan menjadi tidak dapat dikelola setelah saya ingin melakukan ini untuk lebih banyak jenis dan kondisi. Selain itu, ini mempengaruhi semua buffer. Apa cara yang tepat untuk menonaktifkan penyorotan sintaksis dalam satu buffer dalam kondisi tertentu?



Meskipun Q ini ditulis dengan baik, tampaknya mencakup secara luas dasar yang sama (pada kenyataannya, subset) yang satu ini: vi.stackexchange.com/questions/149/…
Andrew Ferrier

4
@AndrewFerrier Saya membantah hal itu. Pertanyaan lainnya adalah tentang tips umum untuk menangani file besar. Milik saya adalah tentang menerapkan satu bagian teka-teki yang agak spesifik di bawah serangkaian batasan yang diberikan. Bandingkan saja jawaban - jawaban untuk pertanyaan lain akan memberitahu saya untuk mematikan sintaks, tetapi tidak bagaimana melakukannya secara dinamis dalam buffer tunggal untuk tipe file tunggal. Dengan demikian itu tidak akan menyelesaikan masalah saya yang jauh lebih spesifik. Mereka terkait tetapi tidak duplikat karena mereka meminta hal yang berbeda dan mengarah pada tanggapan yang berbeda.
14mpi

l4mpi, itu poin yang adil, saya belum melihat filetype juga. Hanya menguji air beta baru di sini sebagian! Poin yang diambil. Saya akan menarik suara rangkap saya.
Andrew Ferrier

Jawaban:


11

Komentar dari derobert ini membawa saya ke solusi:

autocmd Filetype xml if getfsize(@%) > 1000000 | setlocal syntax=OFF | endif

Ini tampaknya menonaktifkan penyorotan sintaksis dalam satu buffer saja.

Itu autocmd BufReadPresedikit herring merah. syntax off bekerja dalam BufReadPrekonteks tetapi tidak dalam Filetypekonteks (dan tentu saja menonaktifkan sintaksis secara global); sementara setlocal syntax=OFFtidak tidak bekerja dalam BufReadPrekonteks tetapi bekerja di Filetypekonteks.


1

Ini autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifyang kamu butuhkan.


2
Hmm, ini menonaktifkan penyorotan sintaks, tetapi di semua buffer, bukan hanya yang memiliki file besar. Terlebih lagi &ftsepertinya tidak diatur dalam konteks ini sehingga saya tidak tahu bagaimana membatasi hanya file xml. Ada ide?
l4mpi

Saya pikir Anda ingin yang set syntax=OFFsebaliknya. (Atau haruskah itu setlocal?)
derobert

Anda mungkin ingin mencoba, syntax clearmungkin?
Dhruva Sagar

@derobert setlocal syntax=OFFbekerja, walaupun tidak dengan BufReadPre *- Saya harus mengubah perintah otomatis kembali Filetype xmluntuk ini. Sepertinya itu bukan rahasia yang perintahnya berfungsi di mana konteks perintah otomatis ...
14mpi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.