我使用 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
... )FOR
WHILE
- 假设
END
语句从新行开始(因此IF a<b call c() END IF
折叠到 EOF) - 它认为是声明
SELECT * FROM table \n FOR UPDATE
的开始FOR
所以我想先尝试创建一些更简单的东西。
答案1
我认为你应该定义自己的折叠函数,这样你就可以更好地控制折叠的内容。以下折叠函数不区分大小写地折叠function
,end 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
然后设置foldmethod
为expr
和foldexpr
设置为函数:
set foldmethod=expr
set foldexpr=InformixFold()
请参阅help fold-expr
更多内容。
“截屏”:
- FUNCTION
| FOR ...
| ...
| END FOR
| END FUNCTION
+ +-- 5 lines: FUNCTION------------------------------------------------------