根据文件大小和类型禁用语法高亮显示


16

我经常需要用vim编辑各种XML文件,这些文件的大小千差万别-从包含几行斜线的配置文件到最大2GB的生产数据文件。在处理大文件时,启用语法高亮当然是一个非常糟糕的主意,因此,如果文件大于阈值,我想禁用它。

我不能autocommand直接使用它来禁用语法突出显示,因为从外壳启动vim时,显然在启用语法之前执行了该命令:

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

我找到了一种解决方法,可以全局禁用语法高亮显示,然后针对除xml以外的所有其他文件类型再次将其打开,如果文件的大小不超过阈值,则针对xml文件类型将其打开:

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

这似乎可行,但感觉不对,一旦我想对更多文件类型和条件执行此操作,它将变得难以管理。此外,它影响所有缓冲区。在特定条件下,禁用一个缓冲区中的语法突出显示的正确方法是什么?



尽管该Q文字写得很好,但似乎确实涵盖了该问题的大致相同的领域(实际上是其中的一个子集):vi.stackexchange.com/questions/149/…–
Andrew Ferrier,

4
@AndrewFerrier我反对。另一个问题是有关处理大文件的一般技巧。我的目标是在给定的一组限制下实现一个相当具体的难题。只需比较答案-另一个问题的答案将告诉我关闭语法,但不能针对单个文件类型在单个缓冲区中动态地执行此操作。因此,它将无法解决我更具体的问题。它们是相关的,但并非重复,因为它们要求不同的事物并导致不同的响应。
l4mpi'2

l4mpi,这很公平,我也没有发现文件类型。只是在这里部分测试新Beta的功能!点了。我将撤回我的重复表决。
安德鲁·费里尔

Answers:


11

此评论derobert导致我的解决方案:

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

这似乎只能在一个缓冲区中可靠地禁用语法突出显示。

autocmd BufReadPre有点像鲱鱼。syntax offBufReadPre上下文中工作,但不在Filetype上下文中工作(并且当然会全局禁用语法);而setlocal syntax=OFF确实没有工作的BufReadPre情况下,但在工作Filetype环境。


1

autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endif就是你所需要的。


2
嗯,这确实禁用了语法突出显示功能,但是在所有缓冲区中,而不仅仅是带有大文件的缓冲区。此外,&ft似乎没有在这种情况下设置,因此我不知道如何仅将其限制为xml文件。有任何想法吗?
l4mpi 2015年

我想你想set syntax=OFF代替。(还是应该设置为local?)
derobert

您可能想尝试一下syntax clear吗?
Dhruva Sagar 2015年

@derobert setlocal syntax=OFF可以工作,尽管不能使用BufReadPre *- 为此,我不得不将自动命令更改Filetype xml为。似乎命令在自动命令上下文中工作并不平凡……
l4mpi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.