Vim 在特定文本块处折叠
Vim Fold at a specific Text Block
我对 Vim 折叠很陌生。但它看起来很有趣。我有一个这样的评论区。 (分号是注释操作符)。
; START ANALYSIS
;
; Check for validity of data file
; ....
; Text
; Text...etc
;
; END ANALYSIS
这个怎么折?什么 foldmethod
最适合它?
我已经尝试了 indent
和 expr
中的 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
我对 Vim 折叠很陌生。但它看起来很有趣。我有一个这样的评论区。 (分号是注释操作符)。
; START ANALYSIS
;
; Check for validity of data file
; ....
; Text
; Text...etc
;
; END ANALYSIS
这个怎么折?什么 foldmethod
最适合它?
我已经尝试了 indent
和 expr
中的 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