Vim的LLVM-IR语法折叠

时间:2014-01-08 04:15:41

标签: vim syntax folding llvm-ir

我正在处理由clang -emit-llvm生成的LLVM-IR代码,并希望让代码折叠工作。

到目前为止,我正在使用foldmethod=exprfoldexpr=LLVMFold()。 我想使用llvm存储库中的语法文件来使用基于语法的折叠(即foldmethod=syntax)。 Available here

请注意,第一个正则表达式来自标签的语法文件。

function! LLVMFolds()
    let thisline = getline(v:lnum)
    if match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0
        return ">2"
    elseif match(thisline, '^\}$') >= 0
        return "<1"
    elseif match(thisline, '{$') >= 0
        return ">1"
    else
        return "="
    endif
endfunction

将关闭的括号吞入2级。

同时尝试过foldmethod=indentfoldmethod=marker没有折叠,foldmark="{,}" define i32 @main() nounwind { entry: %retval = alloca i32, align 4 for.cond: ; preds = %entry %4 = load i32* %i, align 4 %cmp1 = icmp slt i32 %4, 10 br i1 %cmp1, label %for.body, label %for.end } 理想情况下,此示例不完整的LLVM-IR代码:

{

我希望折叠从define }entry:以及每个标记的部分,即从{{1}}到清晰的线。 / p>

2 个答案:

答案 0 :(得分:1)

我不认为

:set foldmethod=syntax

将帮助您链接中的语法文件,因为该文件未定义任何fold参数。

您的LLVMFolds()函数似乎几乎可以执行您想要的操作,但(如果我理解正确的话)您不希望折叠包含}行。也许你想要的是让前一行结束,如下所示:

function! Foo(lnum)
    let thisline = getline(v:lnum)
    let nextline = getline(v:lnum + 1)
    if match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0
        return ">2"
    elseif match(nextline, '^\}$') >= 0
        return "<1"
    elseif match(thisline, '{$') >= 0
        return ">1"
    else
        return "="
    endif
endfunction

如果{}之间没有任何行,则可能会也可能不会执行此操作。出于测试目的,请尝试

:set fdm=expr foldexpr=LLVMFolds() fdc=5

参考文献:

:help fold-syntax
:help :syn-fold
:help fold-expr

答案 1 :(得分:0)

我现在使用了这个功能

function! LLVMFolds()
    let thisline = getline(v:lnum)
    let nextline = getline(v:lnum + 1)
    " match start of global var block
    if match(thisline, '^@') == 0 && foldlevel(v:lnum - 1) <= 0
        return ">1"
    " match start of global struct block
    elseif match(thisline, '^%') == 0 && foldlevel(v:lnum - 1) <= 0
        return ">1"
    " matches lables
    elseif match(thisline, '^[-a-zA-Z$._][-a-zA-Z$._0-9]*:') >= 0
        return ">2"
    " keep closing brace outside  l2 fold
    elseif match(nextline, '^\}$') >= 0
        return "<2"
    " keep closing brace in l1 fold
    elseif match(thisline, '^\}$') >= 0
        return "<1"
    " open new l1 fold for open brace
    elseif match(thisline, '{$') >= 0
        return ">1"
    " for the next line being empty, close the fold for the var and struct blocks
    elseif match(nextline, '^$') >= 0
        if match(thisline, '^@') == 0 && foldlevel(v:lnum - 1) == 1
            return "<1"
        elseif match(thisline, '^%') >= 0 && foldlevel(v:lnum - 1) == 1
            return "<1"
        else
            return "="
        endif
    else
        return "="
    endif
endfunction

从2级折叠中排除右括号,并折叠全局结构和变量的初始列表。