拆分函数的全局参数?

时间:2016-06-29 21:51:30

标签: regex list vim split

vim中是否有任何命令可以拆分此函数的参数并将它们放在一个列表中:

qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

获取

["void *base", "size_t nmemb", "size_t size", "int (*compar)(const void *, const void *)"]

问题在于最后一个论点。

2 个答案:

答案 0 :(得分:3)

使用argumentative.vim循环遍历每个参数。在每个循环中,您可以将参数附加到数组,然后移动到下一个参数边界。

compile fileTree

只需将光标放在第一个参数的void command! GetArguments echo GetArguments() function! GetArguments() let reg = @@ let arr = [] let view = winsaveview() while getline('.')[col('.')-1] != ')' normal yi, call add(arr, @@) normal ], endwhile let @@ = reg call winrestview(view) redraw! return string(arr) endfunction 中,然后运行v即可。如果要将文本添加到缓冲区,请使用:GetArguments

注意:我没有测试除测试文本之外的任何文本。您可能需要对其进行修改以满足您的需求。

我是argumentative.vim插件的作者,它有助于参数/参数操作。议论文提供以下内容:

  • 新文字对象,:put=GetArguments()i,
  • 通过a,>,移动参数。
  • 分别通过<,],
  • 移至下一个/上一个参数边界

我确信还有其他插件可以做类似的事情。

答案 1 :(得分:0)

为了得到论点。最后我创建了函数GetArguments(),它将参数拆分并将它们放在变量b:list中:

function! GetArguments()
                let l:str=getline(".")
                let l:str=substitute(l:str,'^\(\s\|\w\)*\("\|[\|(\|<\|{\)','','')
                let l:str=substitute(l:str,'\("\|]\|)\|>\|}\)\s*\({\|;\)*\s*$','','')
                let l:i=''
                let l:oparen=0
                let l:Arg=""
                let b:list=[]
                for l:i in split(l:str,'\zs')
                        if matchstr(l:i , '\("\|[\|(\|<\|{\)' ) != ''
                                let l:oparen+=1
                        elseif matchstr(l:i , '\("\|]\|)\|>\|}\)' ) != ''
                                let l:oparen-=1
                        endif
                        if matchstr(l:i, ',\|;') == ''
                                let l:Arg=l:Arg.l:i 
                        elseif matchstr(l:i, ',\|;') != '' && l:oparen != 0
                                let l:Arg=l:Arg.l:i
                        elseif matchstr(l:i, ',\|;') != '' && l:oparen == 0
                                if strlen(l:Arg) != 0
                                      call add(b:list,l:Arg)
                                endif
                                let l:Arg=""
                        endif
                endfor
                if strlen(l:Arg) != 0
                        call add(b:list,l:Arg)
                endif 
endfunction