Как позволить 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']
таким образом я получаю весь прототип в коде, а не имя функции, а затем подставляю параметры один за другим.