ปิดใช้งานการเน้นไวยากรณ์ขึ้นอยู่กับขนาดไฟล์และประเภท


16

ฉันมักจะต้องแก้ไขไฟล์ XML ต่าง ๆ ด้วย vim ซึ่งมีขนาดแตกต่างกันมาก - จากไฟล์การกำหนดค่าที่มีบรรทัด hunded สองสามบรรทัดไปยังไฟล์ข้อมูลการผลิตที่มีขนาดสูงสุด 2GB แน่นอนว่าการเปิดใช้งานการเน้นไวยากรณ์เป็นความคิดที่แย่มากเมื่อจัดการกับไฟล์ขนาดใหญ่ดังนั้นฉันจึงต้องการปิดใช้งานหากไฟล์มีขนาดใหญ่กว่าเกณฑ์

ฉันไม่สามารถใช้งานautocommandได้โดยตรงเพื่อปิดใช้งานการเน้นไวยากรณ์เนื่องจากคำสั่งถูกเรียกใช้ก่อนที่จะเปิดใช้งานไวยากรณ์เมื่อเริ่มต้น vim จากเชลล์:

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

ฉันพบวิธีแก้ปัญหาในการที่ฉันสามารถปิดใช้งานการเน้นไวยากรณ์ทั่วโลกจากนั้นเปิดอีกครั้งสำหรับไฟล์ประเภทอื่นทั้งหมดกว่า xml และเปิดใช้งานสำหรับ filetype xml หากไฟล์ไม่ใหญ่กว่าเกณฑ์:

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

ดูเหมือนว่าจะใช้งานได้ แต่รู้สึกผิดและจะไม่สามารถจัดการได้เมื่อฉันต้องการทำสิ่งนี้สำหรับประเภทไฟล์และเงื่อนไขเพิ่มเติม นอกจากนี้ยังมีผลต่อบัฟเฟอร์ทั้งหมด วิธีที่เหมาะสมในการปิดใช้งานการเน้นไวยากรณ์ในบัฟเฟอร์หนึ่งภายใต้เงื่อนไขที่เฉพาะเจาะจงคืออะไร?



แม้ว่าคำถามนี้เขียนได้ดี แต่ก็ดูเหมือนจะครอบคลุมในวงกว้างเดียวกัน (ในความเป็นจริงชุดย่อย) ของอันนี้: vi.stackexchange.com/questions/149/…
Andrew Ferrier

4
@AndrewFerrier ฉันจะเถียงกับมัน คำถามอื่น ๆ เกี่ยวกับเคล็ดลับทั่วไปสำหรับการจัดการไฟล์ขนาดใหญ่ Mine เป็นเรื่องเกี่ยวกับการใช้จิ๊กซอว์ชิ้นหนึ่งที่ค่อนข้างเฉพาะเจาะจงภายใต้ข้อ จำกัด ที่กำหนด เพียงเปรียบเทียบคำตอบ - คำตอบสำหรับคำถามอื่นจะบอกให้ฉันปิดไวยากรณ์ แต่ไม่ใช่วิธีการทำเช่นนั้นในบัฟเฟอร์เดียวสำหรับไฟล์ประเภทเดียว ดังนั้นมันจะไม่แก้ปัญหาเฉพาะเจาะจงของฉัน พวกเขาเกี่ยวข้องกัน แต่ไม่ซ้ำซ้อนเนื่องจากพวกเขาขอสิ่งต่าง ๆ และนำไปสู่การตอบกลับที่แตกต่างกัน
l4mpi

l4mpi นั่นคือจุดที่เป็นธรรมฉันไม่ได้เห็นสิ่งต่าง ๆ เช่นกัน เพียงทดสอบน่านน้ำของเบต้าใหม่ที่นี่บางส่วน! จุดที่ถ่าย ฉันจะถอนการลงคะแนนซ้ำ
Andrew Ferrier

คำตอบ:


11

ความคิดเห็นนี้โดยDerobertทำให้ฉันได้แก้ปัญหา:

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

ดูเหมือนว่าจะปิดใช้งานการเน้นไวยากรณ์อย่างน่าเชื่อถือในบัฟเฟอร์เดียวเท่านั้น

autocmd BufReadPreเป็นบิตของปลาชนิดหนึ่งสีแดง syntax off ทำงานในBufReadPreบริบท แต่ไม่ได้อยู่ในFiletypeบริบท (และแน่นอนว่าจะปิดใช้งานไวยากรณ์ทั่วโลก) ในขณะที่setlocal syntax=OFFไม่ได้ทำงานในBufReadPreบริบท แต่ทำงานในFiletypeบริบท


1

นี่autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifคือสิ่งที่คุณต้องการ


2
อืมนี่เป็นการปิดการใช้งานการเน้นไวยากรณ์ แต่ในบัฟเฟอร์ทั้งหมดไม่ใช่เฉพาะไฟล์ที่มีไฟล์ขนาดใหญ่เท่านั้น นอกจากนี้&ftดูเหมือนว่าจะไม่ได้รับการตั้งค่าในบริบทนี้ดังนั้นฉันไม่ทราบวิธี จำกัด เฉพาะไฟล์ xml เท่านั้น ความคิดใด ๆ
l4mpi

ฉันคิดว่าคุณต้องการset syntax=OFFแทน (หรือว่าควรจะ setlocal?)
derobert

คุณอาจต้องการลองsyntax clearบางที
Dhruva Sagar

@derobert ใช้setlocal syntax=OFFงานได้แม้ว่าจะไม่ใช่BufReadPre *- ฉันต้องเปลี่ยนค่าอัตโนมัติและกลับไปFiletype xmlใช้ค่านี้ ดูเหมือนว่ามันเป็นเรื่องไม่สำคัญซึ่งคำสั่งทำงานในบริบทอัตโนมัติ ...
l4mpi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.