【问题标题】:A problem with folding bash functions in vim在 vim 中折叠 bash 函数的问题
【发布时间】:2010-09-29 14:33:04
【问题描述】:

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

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

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

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

函数本身只有大约 40 行,我想要一些看起来像这样的东西(“图像”说的比千字多,他们说...):

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

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

【问题讨论】:

    标签: bash vim folding


    【解决方案1】:

    使用 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 中的哪个位置并不重要。

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

    【讨论】:

      【解决方案2】:

      Reddit 上似乎有一个更简单的解决方案。

      在帖子中引用作者的话:

      我使用的选项是:

      syntax=enable
      
      filetype=sh
      
      foldmethod=syntax
      
      let g:sh_fold_enabled=3
      
      g:is_sh=1
      

      编辑:解决方法

      vim -u NONE -c 'let g:sh_fold_enabled=7' -c ':set fdm=syntax' -c 'sy on'file.sh

      g:sh_fold_enabled=4 似乎是讨论中商定的折叠级别。这个解决方案对我来说非常有效。我不必编辑语法文件。

      编辑: g:sh_fold_enabled=5 实际上是正确的。不是4。 此外,正如 Reddit 上的海报所示,这些命令必须位于 vimrc 中的任何其他设置之前,插件除外。

      【讨论】:

        【解决方案3】:

        我做了一些研究,找到了解决问题的方法:为了阻止 vim 折叠函数直到文件结束,我必须在 shExpr 的语法区域中添加一个跳过语句(在文件中sh.vim,通常放在像/usr/share/vim/vim70/syntax/这样的地方:

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

        此更改阻止语法文件认为{} 属于 shExpr 组,而它们实际上属于函数组。反正我是这么理解的。

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

        function test
        {
        ....
        }
        

        不是为了这个:

        function test {
        ....
        }
        

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

        【讨论】:

          【解决方案4】:

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

          function test {
              ...
          }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-01
            • 2010-12-17
            • 1970-01-01
            • 2012-06-13
            • 2013-01-16
            • 2011-01-22
            相关资源
            最近更新 更多