Preenchimento automático no Vim

257

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, ou while. 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 tagsarquivo 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 para ctagsa 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: ctagsapenas 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 ++.

Konrad Rudolph
fonte
4
Faz muito tempo desde que você fez essa pergunta, você finalmente encontrou uma boa? Estou perguntando porque não vejo respostas aceitas. Pessoalmente, embora eu deva admitir que recorri ao prefixo de minhas variáveis ​​/ funções. Por exemplo, todos eles começam com sh(significando que está na minha biblioteca) e seguidos pela abreviação de minha classe. Por exemplo shPpara Parserclasse. Então tudo que você precisa fazer é escrever shPe 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)
Shahbaz
4
@ Shahbaz Na verdade, estou convencido de que não há solução boa o suficiente no momento. 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).
Konrad Rudolph
2
Você já tentou clang_completerecentemente? Ele pode ser usado libclangcom o cache agora e, portanto, deve ser mais rápido.
Jan Larres
@ Jan Obrigado pela informação. Quando eu tentei pela última vez, o suporte à libclang ainda era superficial. Provavelmente eu deveria tentar novamente quando tiver tempo.
Konrad Rudolph
(Motivo para editar reversão: nomes de produtos não são de código, eles não pertencem formatted like this.)
Konrad Rudolph

Respostas:

171

Experimente o YouCompleteMe . Ele usa Clang através da interface libclang, oferecendo conclusão semântica de C / C ++ / Objective-C. É muito parecido com clang_complete, mas substancialmente mais rápido e com correspondência difusa.

Além do acima, o YCM também fornece conclusão semântica para C #, Python, Go, TypeScript etc. Também fornece conclusão não semântica, baseada em identificador, para idiomas para os quais não possui suporte semântico.

Valloric
fonte
69
Na verdade, eu vou aceitar esta solução. Finalmente, um plugin que oferece. Eu tenho usado por vários dias agora. Foram necessários apenas quatro anos para responder a essa pergunta. ;-)
Konrad Rudolph
5
trabalho incrível com o YouCompletMe valloric! parabéns
statquant 15/07/2013
5
Pena que o YouCompleteMe é um PITA completo para instalação no Windows :(
xx
2
@DrTwox Do leia-me: "O YCM não tem suporte oficial para o Windows , mas isso não significa que você não pode fazê-lo funcionar lá. Consulte a página wiki do Guia de Instalação do Windows. Sinta-se à vontade para adicionar a ele."
user456584
7
Este post deve mencionar que você é o autor, pois é uma autopromoção limítrofe (embora eu não discuta que ele responde à pergunta, você deve incluir um aviso de isenção de responsabilidade).
precisa
36

Também há clang_complete, que usa o clangcompilador para fornecer a conclusão de código para projetos em C ++. Há outra pergunta com dicas de solução de problemas para este plug-in.

O plug-in parece funcionar razoavelmente, desde que o projeto seja compilado, mas é proibitivamente lento para projetos grandes (já que ele tenta uma compilação completa para gerar a lista de tags).

Konrad Rudolph
fonte
O clang_completeplug-in funciona bem no Cygwin e no Windows. Não posso dizer nada sobre grandes projetos, porque não tenho nenhum. :)
Lumi
Parece que clang_complete usando libclang tem cache agora. Essa deve ser a resposta aceita. Você já tentou clang_complete no kernel do Linux? a melhor indexação que eu vi no kernel é usar o Eclipse CDT; se clang_complete puder manipular o kernel, ele poderá concluir qualquer coisa.
Dashesy
clang_complete é simplesmente o melhor plugin do Vim que eu uso.
Cromulent
1
@ Ah Ah, confira YouCompleteMe, é muito melhor.
precisa
@KonradRudolph Thanks. Vou dar uma olhada.
Cromulent
6

Acabei de encontrar o projeto Eclim vinculado em outra pergunta . Isso parece bastante promissor, pelo menos para a integração Java.

Konrad Rudolph
fonte
Você já testou? Parece interessante.
Pacane
@Pane: não. Eu não precisava usar Java há meses e não tinha tempo livre para experimentar.
Konrad Rudolph
1
Eclim parece ser uma grande solução para Java, embora Eclipse continua a ser uma besta de carga, mesmo em uma configuração sem cabeça
Drupad Panchal
2
Para Java, você pode usar o Vrapper . Acho que geralmente está tudo bem com excelente preenchimento automático. Para a edição ocasional de texto pesado, posso iniciar o Vim real como uma ferramenta externa.
kizzx2
2

é o que você está procurando algo como intellisense?

O insevim parece abordar o problema.

link para capturas de tela aqui

Ric Tokyo
fonte
2
É isso que estou procurando, sim. Infelizmente, ele roda apenas no Windows (estou usando o OS X). Além disso, a última atualização parece ter sido feita por volta de 2003. :-(
Konrad Rudolph
bem, você pode obter o código-fonte :) se não, a única coisa que consigo pensar é na omnicompletion .. ou dê uma olhada nisto: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop para o material .net, pelo menos ..
Ric Tóquio
Ric, por favor, forneça seu comentário como duas respostas separadas, são inestimáveis ​​e eu gostaria de honrá-las adequadamente! Dito isto, o MonoDevelop não pode ser usado no OS X a partir de agora, e atualmente estou analisando o OmniCppComplete.
319 Konrad Rudolph
Lol isso é apenas o Windows! :( Por que u deve querer isso em janelas onde u têm VS .. Eu estou procurando uma solução em Linux.
Nils
Nils: nem todos têm acesso ao Visual Studio, também muitas pessoas têm habilidades vi que desejam aplicar no ambiente Windows. Havia uma porta para o Linux, mas atualmente está inoperante. De qualquer forma, o que você está tentando alcançar? tem certeza de que não precisa apenas das funções padrão de preenchimento automático? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo