2016-06-29 8 views
1

Gibt es einen Befehl in Vim, die die Argumente dieser Funktion aufspalten und sie in eine Liste gesetzt:Split die globalen Argumente einer Funktion?

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 *)"] 

Das Problem mit dem letzten Argument ist zu bekommen.

Antwort

0

Um die Argumente zu bekommen. Ich landete mit der Funktion GetArguments() zu schaffen, die die Argumente teilen und sie in den Variable 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 
3

Verwenden Sie argumentative.vim Sie Schleife durch jedes Argument. In jeder Schleife können Sie das Argument an ein Array anhängen und dann zur nächsten Argumentgrenze gehen.

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 

Setzen Sie einfach Ihren Cursor auf dem v in Leere im ersten Argument und führen :GetArguments. Wenn Sie den Text dem Puffer hinzufügen möchten, verwenden Sie :put=GetArguments().

Hinweis: Ich habe keinen anderen Text als Ihren Testtext getestet. Möglicherweise müssen Sie es ändern, um Ihre Bedürfnisse zu erfüllen.

Ich bin der Autor des argumentative.vim Plugins, das bei der Manipulation von Argumenten/Parametern hilft. Argumentative bietet die folgenden:

  • Neue Textobjekte, i, und a,
  • Shift-Argumente über >, und <,.
  • Zum nächsten/vorherigen Argument Grenzen über ], und [, bzw.

Ich bin sicher, dass es andere Plugins gibt, die ähnliche Dinge zu tun.

+0

ich endlich, indem ich meine eigenen Funktionen gelandet! +1 –

+0

@Meninx, Vielleicht möchten Sie Ihre Funktionen in einem Beitrag teilen, um anderen mit ähnlichen Problemen zu helfen –

+0

@Rincker Es ist eine einfache Funktion, die tatsächlich tat, was ich im Moment will, aber verbessert werden muss! –

Verwandte Themen