Как позволить omnicppcomplete автоматически закрывать пустые списки аргументов?

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

Например, предполагая v является вектором STL при автозаполнении v.clear()в итоге мы получаем:

v.clear(

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

2 ответа

Решение

Похоже, это должно быть возможно: я не уверен, есть ли у меня последняя версия сценария 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)Msgstr "Если скобки пусты, добавляется закрывающая скобка.

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

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

let szItemWord .= '('

с

let szItemWord .= tagItem['signature']

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

Другие вопросы по тегам