#c #vim #omnicppcomplete
#c #vim #omnicppcomplete
Вопрос:
У меня omnicppcomplete работает нормально, за исключением того, что время от времени он не завершает некоторые методы / члены переменных. Я наконец-то разозлился настолько, чтобы разобраться, почему, и я полагаю, причина в том, что omnicppcomplete поддерживает синтаксис «Foo const amp; foo» в аргументах функции.
Например, если у меня есть функция, определенная как:
int foo( Bar const amp; b ){
}
Я не смогу получить информацию о завершении, когда позже введу «b». Однако, если я изменю подпись на:
int foo( const Bar amp; b ){
}
Я смогу получить информацию о завершении, когда я наберу «b». Кажется, это только в списках аргументов функции, потому что я попытался просто определить переменную внутри функции с подписью «Bar const amp; bref», и я смог получить информацию о завершении для bref.
Я был бы удивлен, если это фактическое ограничение omnicppcomplete; у кого-нибудь есть какие-либо мысли о том, является ли это ошибкой и / или есть ли обходной путь для этого? Изменение стиля кодирования не кажется разумным решением.
Комментарии:
1. Вау, это отстой! Тем более, что первый является более последовательным синтаксисом (хотя, конечно, последний, строго говоря, не менее корректен).
Ответ №1:
Кажется, что в omnicppcomplete есть ограничение, но я запустил отладчик vim и нашел его.
Откройте автозагрузку/omni /cpp /utils.vim, перейдите к строке 518, должно выглядеть так:
for token in tokens
if state==0
if token.value=='>'
let parenGroup = token.group
let state=1
elseif token.kind == 'cppWord'
let szResult = token.value.szResult
let state=2
elseif index(['*', 'amp;'], token.value)<0 "This is line 518
break
endif
И измените эту строку на:
elseif token.value != 'const' amp;amp; index(['*', 'amp;'], token.value)<0
Или, вот команды vim для этого =):
/index(['*', 'amp;'],<CR>itoken.value != 'const' amp;amp;<ESC>:w
Я попробую отправить это сопровождающему omnicppcomplete, но это немного халтурно, не знаю, попадет ли это. Возможно, вам удалось проверить, является ли токен.kind == ‘CPPPKEYWORD’, но я подумал, что допустил бы ошибку, изменив наименьшее.
Комментарии:
1. Большое вам спасибо, я потерял надежду на то, что кто-нибудь ответит. Кстати, не побудила ли вас щедрость каким-то образом взглянуть на это? Я никогда не думал, что функция bounty полезна; это первый раз, когда это сработало. Просто еще для моего любопытства.
2. Я не думаю, что вознаграждение действительно имело для меня такое большое значение напрямую, но благодаря ему вопрос появился в списке избранных вопросов для C , где я его и видел. Тем не менее, это приятное преимущество. =) Спасибо!
Ответ №2:
Столкнувшись с проблемами с omnicppcomplete, я искал альтернативу и нашел clang complete, который использует вывод метаданных clang (который предназначен для таких целей). I работает очень хорошо, и при условии, что ваш код скомпилируется, он все поймет.
Комментарии:
1. Да, я видел clang complete, но, к сожалению, у меня нет доступа к clang на всех моих серверах разработки…