在vim中折叠bash函数的问题

时间:2009-01-05 12:50:27

标签: bash vim folding

我有一个以函数定义开头的bash脚本文件,如下所示:

#!/bin/bash
# .....
# .....
function test {
...
...
}
...
...

我使用vim 7.2,并设置了g:sh_fold_enabled=1,以便使用bash启用折叠。问题是功能测试的折叠没有正确结束,即它持续到文件结束。它看起来像这样:

#!/bin/bash
# .....
# .....
+-- 550 lines: function test {----------------------------------------
~
~

这个函数本身只有大约40行,我想要的东西看起来像这样(“图像”说的不仅仅是一个thousend的话,他们说......):

#!/bin/bash
# .....
# .....
+-- 40 lines: function test {----------------------------------------
...
...
...
~
~

有没有人知道这个问题的好方法?

3 个答案:

答案 0 :(得分:1)

我做了一些研究,找到了解决问题的方法:为了阻止vim从折叠函数直到文件结束,我必须在shExpr的语法区域添加一个skip-statement(in文件sh.vim,通常位于/usr/share/vim/vim70/syntax/)之类的地方:

syn region shExpr ... start="{" skip="^function.*\_s\={" end="}" ...

此更改会阻止语法文件认为{}属于shExpr组,当它们实际属于该功能组时。或者这就是我对它的理解,无论如何。

注意:此修复程序仅适用于以下语法:

function test
{
....
}

而不是这个:

function test {
....
}

对最后一个错误进行快速而又脏的修复是从@shFunctionList集群中删除shExpr。

答案 1 :(得分:0)

它应该可以工作,但语法文件中似乎有一个错误。折叠区域实际上从单词“function”开始并尝试继续关闭'}',但是'{...}'区域的突出显示接管结束'}'并且折叠继续搜索另一个一。如果你添加另一个'}',你可以看到这个:

function test {
    ...
}
}

答案 2 :(得分:0)

使用 vim 8.2+,以下对我有用:

    syntax enable
    let g:sh_fold_enabled=5
    let g:is_sh=1
    set filetype=on
    set foldmethod=syntax
    " :filteype plugin indent on
    foldnestmax=3 "i use 3, change it to whatever you like.

我把它放在 vimrc 的什么地方并不重要。

这会为所有已安装的文件类型打开语法折叠和文件类型插件。