Em poucas palavras, eu estou procurando um trabalho recurso autocompletar para o editor Vim. Tenho argumentado antes que Vim substitui completamente um IDE no Linux e enquanto isso é certamente verdade, ela não tem uma característica importante: autocompletar.
Eu sei sobre Ctrl+ N, integração Exuberant Ctags , Taglist , cppcomplete e OmniCppComplete . Infelizmente, nada disso se encaixa na minha descrição de "preenchimento automático de trabalho:"
- Ctrl+N funciona bem (apenas) se você esqueceu como se escreve
class
, ouwhile
. Ah bem. - O Ctags fornece os rudimentos, mas tem muitas desvantagens.
- A taglist é apenas um wrapper Ctags e, como tal, herda a maioria de suas desvantagens (embora funcione bem para listar declarações).
- O cppcomplete simplesmente não funciona como prometido, e não consigo descobrir o que fiz de errado, ou se está "funcionando" corretamente e as limitações são por design.
- OmniCppComplete parece ter os mesmos problemas que cppcomplete, ou seja, o preenchimento automático não funciona corretamente. Além disso, o
tags
arquivo novamente precisa ser atualizado manualmente.
Estou ciente do fato de que nem mesmo os IDEs modernos e completos oferecem uma boa conclusão de código C ++. É por isso que aceitei a falta de Vim nesta área até agora. Mas acho que um nível fundamental de conclusão de código não é pedir demais e é de fato necessário para o uso produtivo. Então, estou procurando por algo que possa realizar pelo menos as seguintes coisas.
Consciência de sintaxe . O cppcomplete promete (mas não entrega para mim), o preenchimento automático correto e com reconhecimento de escopo do seguinte:
variableName.abc variableName->abc typeName::abc
E realmente, qualquer outra coisa é completamente inútil.
Configurabilidade . Preciso especificar (facilmente) onde estão os arquivos de origem e, portanto, de onde o script obtém suas informações de preenchimento automático. Na verdade, eu tenho um Makefile no meu diretório que especifica os caminhos de inclusão necessários. O Eclipse pode interpretar as informações encontradas nele, por que não um script do Vim também?
Atualização . Assim que alterar algo no meu arquivo, quero que o preenchimento automático reflita isso. Eu não quero acionar manualmente
ctags
(ou algo comparável). Além disso, as mudanças devem ser incrementais , ou seja, quando eu mudei apenas um arquivo é completamente inaceitável paractags
a re-analisar toda a árvore de diretórios (que pode ser enorme).
Eu esqueci alguma coisa? Sinta-se livre para atualizar.
Sinto-me à vontade com muitas configurações e / ou ajustes, mas não quero programar uma solução do zero e não sou bom em depurar scripts do Vim.
Uma observação final, eu realmente gostaria de algo semelhante para Java e C #, mas acho que isso é demais para esperar: ctags
apenas analisa arquivos de código e ambos, Java e C #, têm estruturas enormes pré-compiladas que precisariam ser indexadas. Infelizmente, o desenvolvimento do .NET sem um IDE é ainda mais PITA que C ++.
clang_complete
é tecnicamente o mais sólido, mas proibitivamente lento devido à falta de armazenamento em cache dos resultados e compilação parcial. Devo admitir que não tentei todas as respostas porque algumas exigem uma configuração complicada e demorada. Vou prender a respiração por um plug-in utilizável agora que o clang finalmente permite que os desenvolvedores criem ASTs a partir de fontes C ++ (até agora, não havia bons analisadores gratuitos para C ++ disponíveis).
clang_complete
recentemente? Ele pode ser usado libclang
com o cache agora e, portanto, deve ser mais rápido.
formatted like this
.)
sh
(significando que está na minha biblioteca) e seguidos pela abreviação de minha classe. Por exemploshP
paraParser
classe. Então tudo que você precisa fazer é escrevershP
e pressione Ctrl + p (ou CTRL + n se quiser) e obter os membros da classe do último uso para o primeiro (ou primeiro ao último, se CTRL + n)