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 :(得分: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