【问题标题】:auto-fold Oracle inline views in Vim using .vimrc使用 .vimrc 在 Vim 中自动折叠 Oracle 内联视图
【发布时间】:2025-12-28 00:50:06
【问题描述】:

我之前见过神奇的 Vim 命令,您可以将其添加到 .vimrc 以在打开特定类型的文件时创建折叠。我记得有这样的代码会在打开文件时在每个 Ruby 方法和类中创建折叠。然后,通过一个命令,我可以折叠所有这些方法折叠。有谁知道如何使用 PL/SQL 中的内联视图来做到这一点?假设我有以下 SQL:

SELECT blah,
       teh_max
FROM (
       SELECT blah,
              MAX(bar) AS teh_max
       FROM (
              SELECT blah,
                     bar
              FROM foo
            )
       GROUP BY blah
     )
ORDER BY blah

我希望在 Vim 中打开它时创建折叠,以便我可以转到 FROM ( 行,在命令模式下点击 zc,然后折叠从该行开始的内联视图。用一个命令折叠所有折叠也很好。

【问题讨论】:

    标签: oracle plsql vim folding


    【解决方案1】:

    通过将foldmethod 设置为syntax 来激活基于语法的折叠:

    " for all windows
    set foldmethod=syntax
    " for the current window
    setlocal foldmethod=syntax
    

    然后必须在语法定义中指定折叠,这是通过向应该增加折叠级别的区域提供fold 参数来完成的。引用文档:

    The "fold" argument makes the fold level increase by one for this item.
    Example: 
       :syn region myFold start="{" end="}" transparent fold
       :syn sync fromstart
       :set foldmethod=syntax
    This will make each {} block form one fold.
    

    因此,您必须进入您关心的任何文件类型的语法文件,并将fold 参数添加到适当的区域,或者可能添加到您自己的区域中。在您的情况下,它看起来与 C/C++ 语法的大括号折叠非常相似,除了括号。

    默认语法文件通常保存在 Linux 上的 /usr/share/vim/vimXX/syntax 中(大概是 Windows 上的 <vim-directory>\vimXX\syntax?),其中 XX 是不带句点的版本号(例如 72)。这些可能会被/usr/share/vim/vimfiles/syntax 中的文件覆盖系统范围,或者~/.vim/syntax 中的文件覆盖每个用户。

    【讨论】:

    • 我尝试在开始和结束只是括号的地方添加折叠,但这不起作用,因为 SQL 中的许多其他内容都使用括号,例如,MAX(bar)。设置start="FROM (" 也不起作用;它无法识别那里的折叠。
    【解决方案2】:

    我建议只是避免多级 SQL 查询。你总是可以创建一个视图,一个临时表。我知道这与汤姆凯特的理论相矛盾,但是 这是 10 年的 PL/SQL 实践。把复杂的程序分成几个更简单的 部分。将复杂的 SQL 查询分解为简单的查询。

    在您的示例中,查询很容易掌握,折叠只会打扰。

    相反,对于嵌套的 PL/SQL 过程,折叠非常有用。 vim.org 上有一个 VIM 脚本。

    【讨论】: