如何为 Informix 4GL 源代码定义 vim 语法折叠?

如何为 Informix 4GL 源代码定义 vim 语法折叠?

我使用 vim 编辑 Informix 4GL 源代码,其语法如下:

功能
  为了 ...
  ...
  结束
结束函数

我希望使用 za zM 等折叠函数

这有效

  :设置折叠标记=功能,END\ 功能
  :设置折叠方法=标记

但是关键字也可以用小写,并且我理想情况下还想折叠 MAIN..END MAIN,因此标记无法做到这一点。

我试过

:syn region myFun start="FUNCTION" end="END FUNCTION" 透明折叠
:set foldmethod=语法

但它没有效果。我已经有一个语法文件,它可以进行颜色突出显示并:syn显示myFun在语法定义中。

如何配置 FUNCTION...END FUNCTION 和 MAIN..END MAIN 的大小写无关的语法折叠?


更新:我已经尝试过了http://www.vim.org/scripts/script.php?script_id=2287但它存在一些问题:

  • 它折叠的细节程度我不想要(,,,IF... )FORWHILE
  • 假设END语句从新行开始(因此IF a<b call c() END IF折叠到 EOF)
  • 它认为是声明SELECT * FROM table \n FOR UPDATE的开始FOR

所以我想先尝试创建一些更简单的东西。

答案1

我认为你应该定义自己的折叠函数,这样你就可以更好地控制折叠的内容。以下折叠函数不区分大小写地折叠functionend function并且应该很容易根据进一步的要求进行调整:

function! InformixFold()
  let line      = getline(v:lnum)
  let prev_line = getline(v:lnum-1)

  if match(line, '^\s*function\s*$') >= 0
    return 1
  elseif match(prev_line, '^\s*end\s*function\s*$') >= 0
    return 0
  else
    return "="
endfunction

然后设置foldmethodexprfoldexpr设置为函数:

set foldmethod=expr
set foldexpr=InformixFold()

请参阅help fold-expr更多内容。

“截屏”:

- FUNCTION
|   FOR ...
|   ...
|   END FOR
| END FUNCTION

+ +--  5 lines: FUNCTION------------------------------------------------------

相关内容