Vim折叠与语法不同步/错误插入

时间:2014-05-04 16:13:20

标签: vim folding vim-syntax-highlighting

我在语法文件中有(等同于)以下内容:

syn sync clear
syn sync fromstart
syn region fooBlock start="\<interface\>" end="\ze\<implementation\>" fold
syn region fooBlock start="\<implementation\>" end="\%$" fold

语法高亮显示效果很好(通过添加例如matchgroup=Keyword可以看到)。折叠也基本上有效,但当我插入一个新的折叠时(通过键入例如implementation,vim比它应该晚一行开始折叠。例如:

-  interface
|  l1
|  l2
   implementation
-  l3
|  l4
|  l5

当键入此内容时,显然我希望第二个折叠更早开始一行。键入zx可以更正,以及保存和重新打开文件或键入:syn sync fromstart

在键入时,如何让vim正确插入折叠

我已查看:help fold-syntax,但如图所示,语法文件中的:syn sync fromstart无效。

也许有一种比使用\ze(或me=s-1后缀(也会产生相同结果)更好的方法来突出显示/折叠多部分区域。

1 个答案:

答案 0 :(得分:1)

您尝试表达interface部分在implementation之前结束一行的事实。当有明确的区域开始和区域结束标记(如beginend)时,语法区域(显然特别是折叠)效果最佳。

我试图通过在模式中添加\n来使您的示例正常工作,但这也不起作用。我想要获得可靠的折叠,你需要从语法折叠切换到'foldexpr',如下所示:

:setlocal foldmethod=expr foldexpr=getline(v:lnum)=='interface'\|\|getline(v:lnum)=='implementation'?'>1':'='