2016-06-29 4 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

Чтобы получить аргументы. Я в конечном итоге, создав функцию 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 
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 Это простая функция, которая действительно на самом деле то, что я хочу в данный момент, но ее нужно улучшить! –

Смежные вопросы