omnicppcomplete не поддерживает все формы const

#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 на всех моих серверах разработки…