Как позволить omnicppcomplete автоматически закрывать пустые списки аргументов? - PullRequest
2 голосов
/ 29 ноября 2009

Можно ли позволить omnicppcomplete Vim автоматически закрывать списки аргументов для функций или методов, которые не принимают никаких аргументов?

Например, если предположить, что v - это вектор STL, то при автоматическом завершении v.clear() мы получим:

v.clear(

Было бы хорошо, если бы закрывающая скобка была добавлена ​​автоматически. Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 30 ноября 2009

Похоже, это должно быть возможно: я не уверен, есть ли у меня последняя версия сценария omnicppcomplete, но в моем autoload/omni/cpp/complete.vim есть функция с именем s:ExtendTagItemToPopupItem. В этой функции есть:

" Formating information for the preview window
if index(['f', 'p'], tagItem.kind[0])>=0
    let szItemWord .= '('
    if g:OmniCpp_ShowPrototypeInAbbr && has_key(tagItem, 'signature')
        let szAbbr .= tagItem.signature
    else
        let szAbbr .= '('
    endif
endif

После строки (# 165 в моей версии) let szItemWord .= '(' добавить:

    if (has_key(tagItem, 'signature') == 0) || (tagItem['signature'] =~ '()')
        let szItemWord .= ')'
    endif

То, что должно сделать свое дело (хотя я не слишком много использую C ++, поэтому я не тестировал его всесторонне). Он в основном проверяет, содержит ли «подпись» функции «()», в отличие (например) от «(int *major, int *minor)». Если скобки пусты, добавляется закрывающая скобка.

Вероятно, это можно улучшить, изменив '()' на '(\s*\(void\)\?\s*)' для полноты: здесь будут проверены "()", "( )", "(void)", "( void )" и т. Д.

1 голос
/ 24 мая 2011

Я просто подставляю строку 165:

let szItemWord .= '('

с

let szItemWord .= tagItem['signature']

таким образом я получаю весь прототип в коде вместо имени функции, а затем подставляю параметры один за другим.

...