我在语法文件中有(等同于)以下内容:
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
后缀(也会产生相同结果)更好的方法来突出显示/折叠多部分区域。
答案 0 :(得分:1)
您尝试表达interface
部分在implementation
行之前结束一行的事实。当有明确的区域开始和区域结束标记(如begin
和end
)时,语法区域(显然特别是折叠)效果最佳。
我试图通过在模式中添加\n
来使您的示例正常工作,但这也不起作用。我想要获得可靠的折叠,你需要从语法折叠切换到'foldexpr'
,如下所示:
:setlocal foldmethod=expr foldexpr=getline(v:lnum)=='interface'\|\|getline(v:lnum)=='implementation'?'>1':'='