Vim 在特定文本块处折叠

Vim Fold at a specific Text Block

我对 Vim 折叠很陌生。但它看起来很有趣。我有一个这样的评论区。 (分号是注释操作符)。

; START ANALYSIS
;
; Check for validity of data file
; ....
; Text 
; Text...etc
;
; END ANALYSIS

这个怎么折?什么 foldmethod 最适合它?

我已经尝试了 indentexpr 中的 foldmethod,但都没有成功。 syntax foldmethod 看起来很吓人。

有人能帮忙吗? (顺便说一句,文件类型是 idlang)。

由于没有语法或缩进,您不能在您的评论中使用这些折叠方法。相反,您可以使用 marker

; START ANALYSIS {{{
;
; Check for validity of data file
; ....
; Text 
; Text...etc
;
; END ANALYSIS }}}

其中 {{{}}} 将是您的标记。然后就可以set foldmethod=marker了。

使用 :help marker 获取更多信息。

只需 select 使用鼠标 selection 或普通 selection 折叠您想要折叠的线条,然后输入 zf 折叠 select ed 行和 zo 展开相同。

只要这是您要折叠的唯一块,这很容易。

选项A

一种方法是重新定义折叠标记(默认为 {{{ / }}})以使用您的块中的文本:

setlocal foldmethod=marker foldmarker=START\ ANALYSIS,END\ ANALYSIS

选项B

您也可以使用折叠表达式,然后进行字符串(或正则表达式)比较:

setlocal foldmethod=expr foldexpr=getline(v:lnum)==';\ START\ ANALYSIS'?'>1':getline(v:lnum)==';\ END\ ANALYSIS'?'<1':'='

那个条件看起来很难,还因为它是内嵌的。作为扩展函数,它看起来像:

function! FoldAnalysis( line )
    if a:line == '; START ANALYSIS'
        " A level 1 fold starts here; cp :help fold-expr
        return '>1'
    elseif a:line == '; END ANALYSIS'
        " A level 1 fold ends here
        return '<1'
    else
        " Use fold level from previous line
        return '='
    endif
endfunction
setlocal foldmethod=expr foldexpr=FoldAnalysis(getline(v:lnum))

选项C

如果想要在原始文件类型的折叠之上折叠,您必须遵循文件类型定义的内容(通常基于语法),并对其进行扩展。

正在安装

要使这些持久化,请将命令放入 ~/.vim/after/ftplugin/idlang.vim