2016-06-29 40 views
1

是否有任何的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 *)"] 

问题是与最后一个参数。

回答

0

为了获得参数。我结束了通过创建分裂的论点,并把它们在变量b:list功能GetArguments()

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 
3

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

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。如果要将文本添加到缓冲区,请使用:put=GetArguments()

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

我是argumentative.vim插件的作者,它的作用是帮助参数/参数操作。议论文规定如下:

  • 新的文本对象,i,a,
  • 通过>,<,移参数。
  • 通过],移动到下一个/前一个参数的边界和[,分别为

我相信有一些做类似的事情其他插件在那里。

+0

我最终通过使我自己的功能终于来了! +1 –

+0

@Meninx,您可能希望在帖子中分享您的功能,以帮助其他人也遇到类似问题 –

+0

@Rincker这是一个简单的功能,它实际上做了我目前想要的,但需要改进! –