我经常不得不使用vim编辑各种XML文件,这些文件的大小千差万别-从包含几行斜线的配置文件到最大2GB的生产数据文件。在处理大型文件时,启用语法高亮当然是一个非常糟糕的主意,因此,如果文件大于阈值,我想禁用它。禁用语法突出显示,因为从外壳启动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/…

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

l4mpi,这很公平,我也没有发现文件类型。只是在这里部分测试新Beta的功能!点了。我将撤回重复的投票。

#1 楼

derobert的注释使我想到了解决方案:

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


这似乎只能可靠地禁用一个缓冲区中的语法突出显示。一点红鲱鱼。 autocmd BufReadPresyntax off上下文中有效,但在BufReadPre上下文中无效(当然,全局禁用语法);而Filetypesetlocal syntax=OFF上下文中不起作用,但在BufReadPre上下文中起作用。

#2 楼

这是您需要的autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endif

评论


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

–l4mpi
15年2月4日在13:54

我想您想改为设置语法= OFF。 (还是应该将其设置为local?)

–德罗伯特
2015年2月4日15:22



您可能想尝试清除语法,然后呢?

–德鲁瓦·萨加尔(Dhruva Sagar)
15年2月4日在15:24

@derobert setlocal语法= OFF可以工作,尽管不能与BufReadPre一起使用*-为此,我不得不将自动命令改回Filetype xml。似乎哪些命令在自动命令上下文中起作用并不重要...

–l4mpi
2015年2月5日在8:34