首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Vim的LLVM-IR语法折叠

用于Vim的LLVM-IR语法折叠
EN

Stack Overflow用户
提问于 2014-01-08 04:15:41
回答 2查看 799关注 0票数 2

我正在使用由clang -emit-llvm生成的LLVM代码,并希望代码折叠工作。

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

注意,第一个regex来自标签的语法文件。

代码语言:javascript
复制
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=indent,它没有折叠足够多的LLVM代码,对于这个不完整的LLVM代码来说,foldmethod=markerfoldmark="{,}"也是理想的:

代码语言:javascript
复制
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
}

我想要从{ of define},以及在每一个标有标签的部分,即从entry:到清晰的线。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-09 00:35:52

我现在已经使用了这个功能。

代码语言:javascript
复制
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折叠中排除结束大括号,并折叠全局结构和变量的初始列表。

票数 0
EN

Stack Overflow用户

发布于 2014-01-08 05:08:31

我不认为

代码语言:javascript
复制
:set foldmethod=syntax

将有助于使用链接中的语法文件,因为该文件不定义任何fold参数。

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

代码语言:javascript
复制
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

如果{}之间没有线的话,这可能会做你想做的事情,也可能不会做。为了测试目的,请尝试

代码语言:javascript
复制
:set fdm=expr foldexpr=LLVMFolds() fdc=5

参考文献:

代码语言:javascript
复制
:help fold-syntax
:help :syn-fold
:help fold-expr
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20986912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档