omnicppcomplete не поддерживает все формы const
У меня есть omnicppcomplete, работающий нормально, за исключением того, что время от времени он не завершает некоторые переменные методы / члены. Я, наконец, достаточно раздражен, чтобы разобраться в причинах, и я считаю, что причина в том, что omnicppcomplete поддерживает синтаксис "Foo const & foo" в аргументах функции.
Например, если у меня есть функция, определенная как:
int foo( Bar const & b ){
}
Я не смогу получить информацию о завершении, когда наберу позже "b". Однако, если я изменю подпись на:
int foo( const Bar & b ){
}
Я смогу получить информацию о завершении, когда наберу "б". Кажется, это только в списках аргументов функции, потому что я попытался просто определить переменную внутри функции с помощью сигнатуры "Bar const & bref", и мне удалось получить информацию о завершении для bref.
Я был бы удивлен, если это фактическое ограничение omnicppcomplete; у кого-нибудь есть мысли о том, является ли это ошибкой и / или есть ли обходной путь для этого? Изменение стиля кодирования не кажется разумным решением.
2 ответа
Похоже на ограничение в omnicppcomplete, но я поднял отладчик vim и нашел его.
Откройте файл autoload/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(['*', '&'], token.value)<0 "This is line 518
break
endif
И измените эту строку на:
elseif token.value != 'const' && index(['*', '&'], token.value)<0
Или вот команды vim, чтобы сделать это =):
/index(\['\*', '&'],<CR>itoken.value != 'const' &&<ESC>:w
Я попытаюсь отправить это сопровождающему omnicppcomplete, но это довольно хакерски, не знаю, попадет ли он. Возможно, мне удалось проверить, есть ли token.kind == 'cppKeyword', но я решил, что ошибусь на стороне изменения наименьшего.
Испытав проблемы с omnicppcomplete, я искал альтернативу и обнаружил, что clang завершен, который использует вывод метаданных clang (который предназначен для таких целей). Я работаю очень хорошо, и если ваш код компилируется, он все поймет.