Como obter a conclusão automática inteligente em C ++?

43

O Emacs não pode competir com outro IDE se não tiver uma função de preenchimento automático. O preenchimento automático simplesmente me torna um programador mais eficiente. Conheço a extensão do modo de conclusão automática , mas ela não funciona com C ++.

autocompletar

Como posso obter um preenchimento automático inteligente e eficiente para C ++?


Esta pergunta foi originalmente feita por Malabarba na proposta da Área 51: Como obter a conclusão automática inteligente em C ++?

Lucas
fonte
11
Seria bom expandir um pouco essa questão. Tem muito valor potencial, mas agora a questão é apenas o título.
Malabarba 7/10
O modo ironia parece ser o caminho a seguir neste momento.
Sevki

Respostas:

45

Disclaimer: Eu sou o autor do modo ironia

captura de tela da empresa-ironia

Se você deseja apenas a conclusão automática inteligente, posso recomendar o modo ironia com a empresa ironia .

  • o modo ironia é fácil de instalar graças ao MELPA
  • a conclusão é muito precisa e o desempenho é decente, graças à libclang
  • com a ironia da empresa, você tem um back-end assíncrono de conclusão que não interferirá se a conclusão demorar algum tempo
  • company-irony suporta funções sobrecarregadas e se você tiver o Yasnippet instalado, os argumentos da função serão inseridos como espaços reservados para preencher
  • se seu projeto usa Doxygen, a breve documentação do candidato a conclusão é exibida no minibuffer (veja a captura de tela)
  • a instalação do servidor no modo ironia em um sistema semelhante ao Unix (Linux, OS X) deve ser fácil. O Windows, por outro lado, requer alguns ajustes, mas está documentado no wiki

Outra ferramenta que ainda não foi citada é o emacs-ycmd .

Guillaume Papin
fonte
2
Muito obrigado! Desejo que eu descobri mais cedo sobreirony-mode
Lucas
@GuillaumePapin Obrigado por escrever ironia! Você teria algum benchmark de tempo disponível? Percebi que as chamadas para clang_codeCompleteAtuma TU analisada (mas alterações não salvas) levam de 3 a 5 segundos. É irony-modemais rápido que isso?
Pradhan
11
O Irony usa libclang / clang_codeCompleteAt, para que você não tenha tempos melhores que isso. De 3 a 5 segundos, pode ser demais dependendo do contexto (por exemplo, conclusões em escopos globais levam muito mais tempo que outros escopos). Você pode dar uma olhada em alguns horários que eu fiz recentemente: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin
Relacionado, para futuros leitores: github.com/Sarcasm/irony-mode/issues/140
Sean Allred
Como os papéis do modo ironia e do emacs-ycmd se comparam? Eles são alternativas um para o outro? Alguma vez faria sentido usar os dois?
Praxeolitic
23

Veja meu guia . Ele lista vários métodos para preenchimento automático em C / C ++.

Essas opções são:

  • Usando Irony . Altamente recomendado, pois usa o Clang e fácil de configurar em comparação com outras soluções.

  • Usando o analisador embutido do Emacs. É o melhor preenchimento automático que você pode obter no analisador Emacs, Semantic, mas seria lento em grandes projetos como o kernel do Linux.

  • Usando company-modepacote com company-clang. Fornece excelente conclusão de código para os caminhos de inclusão do sistema, pois ele pode obter automaticamente os caminhos do Clang, mas precisa fazer alguma configuração para o local do projeto

  • Usando company-modecom company-gtags. Ele usa o banco de dados de tags gerado pelo GNU Global como conclusão. Você pode usar isso para fornecer código completo localmente para o seu projeto. Não é exatamente inteligente, pois lança tudo dentro do banco de dados gerado para você.

  • rtagsvai além, fornecendo um servidor para análise ao vivo. Mas é complicado configurar a comparação com a solução pura Elisp.

Tu Do
fonte
Eu não concordaria que configurar rtags é mais complicado do que uma solução pura emacs lisp. A solução pura emacs lisp normalmente não considera arquivos cmake / build e dificilmente consegue encontrar qualquer cabeçalho. Rtags é muito fácil de configurar em comparação. Ainda é um pouco jovem como um projeto, com uma cobertura de teste não muito boa.
baol 02/07
Boa adição ao guia de Tuhdo
Victor
9

Eu tive um grande sucesso com a RTags + Company .

O RTags precisa de um daemon em rdmexecução separado que use clang para conclusão de código, navegação de código e refatoração. rdmtambém funciona como um banco de dados de símbolos, o que significa que o preenchimento automático é muito mais rápido do que qualquer solução que está chamando diretamente clang_codeCompleteAt.

Rdm precisa de informações de sinalizadores de compilação para os seus projectos, que pode ser um incômodo, mas se você seguir o conselho do RTags página e links simbólicos gcc-rtags-wrapper.shpara gcc, g++, cce c++rdm automaticamente é atualizado com novos sinalizadores de compilação sobre recompilação.

Mattias Bengtsson
fonte
Acabei de mudar do modo ironia para rtags. O modo de ironia constantemente apaga e para de funcionar após cerca de 15 minutos ou mais. Até agora, o Rtags parece muito bom e tem uma integração mais limpa com o yasnippet.
Nenchev 28/01
6

Solução 1: modo da empresa + clang

O único problema é que você precisa informar ao modo da empresa onde procurar os arquivos de cabeçalho c / c ++ do seu projeto.

Se você usa o cmake, pode deixar https://github.com/redguardtoo/cpputils-cmake fazer a configuração para você (DICA: eu sou o autor do cpputils-cmake).

OU

Solução 2: modo empresa + gnu global

Nada mais a dizer, você precisa criar as tags com a ferramenta gnu global cli, como outros mencionaram.

Chen Bin
fonte
1

Eu tenho usado o cmake-ide para configurar rtags, flycheck, irony e company-clang.

Agora você pode configurar seu sistema de compilação e seus plugins emacs de análise estática favoritos ao mesmo tempo!

EDIT: observe que o clang da empresa fornece preenchimentos automáticos, que era o recurso que você estava procurando. O cmake-ide também pode configurar o flycheck e rtags, o que adiciona vários outros recursos semelhantes ao IDE.

AnimatedRNG
fonte
11
Explique como isso responde à pergunta de como obter o preenchimento automático de C ++.
Desenhou
O @Drew company-clang fornece conclusões
AnimatedRNG
Por favor, coloque-o na sua resposta. Valeu.
Drew
0

Mx modo semântico

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

Tabelas de Tags

encontrar . -name "*. [chCH]" -print | etags -

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags , ctags - gera um arquivo de tags para o Emacs, vi

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=en

Conclusão do CMi (ou M-TAB) no ponto. Se o modo semântico estiver ativado, tente usar os dados do analisador semântico. Se o modo semântico estiver desativado ou falhar, tente concluir usando a tabela de tags selecionadas (consulte Tags)

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

M-. (find-tag) solicita o nome da tag && pula para a definição

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

alexcham
fonte