Usando o Emacs como um IDE C / C ++ completo


50

Há mais de um ano, eu uso o Emacs como um IDE C / C ++. Até agora, tive apenas um sucesso marginal, mas encontrei algumas paredes de tijolos ao longo do caminho. Atualmente, estou tentando usar o CEDET, mas estou tendo dificuldades para entender como usá-lo de forma eficaz.

Os recursos que estou procurando em um IDE são os seguintes:

  1. Gerenciamento de "projetos" de software. Quero que meu IDE tenha uma noção de todos os arquivos que compõem meu projeto atual, para que eu possa executar funções como pesquisar e substituir dentro do meu projeto. (Seria bom se eu também pudesse conseguir isso sem encher minha árvore de origem com muitos arquivos de suporte. Por que preciso de mais de um arquivo de projeto centralizado por projeto?)
  2. A capacidade de criar o projeto atual a partir do IDE, independentemente do buffer que estou visitando no momento. Eu preciso ser capaz de vincular uma chave que criará o projeto atual.
  3. Relatório de erros. Não quero ter que ler mais de 500 linhas de saída para encontrar os erros que foram relatados pelas ferramentas de compilação. De preferência, os erros aparecem em seu próprio buffer com uma linha por erro.
  4. Uma conscientização dos símbolos dentro do projeto e onde eles são definidos. Quero pular para uma definição de símbolo, esteja ele nos meus arquivos de projeto ou nos arquivos de inclusão do sistema.
  5. Depuração visual. Quero ter uma lista de observação de variáveis ​​locais que são atualizadas automaticamente à medida que passo no código. Eu quero poder definir pontos de interrupção no código, ver qual linha de código será executada a seguir.

Sei que cada um desses recursos existe porque já trabalhei cada um deles usando EDE, Semântica, GDB, etc. O problema é que nunca consegui ter todos esses recursos funcionando ao mesmo tempo. , porque cada peça geralmente precisa ser configurada sozinha e geralmente é muito trabalho descobrir como configurar todas elas de uma vez e fazê-las trabalhar juntas.

Quais soluções existem para transformar o Emacs em um IDE C / C ++ completo? Você sempre precisa configurar tudo aos poucos ou existe uma maneira de configurar todos os recursos de cada vez?

EDIT: uma boa resposta a esta pergunta não precisa atender exatamente todos os cinco dos critérios fornecidos. Simplesmente forneci a lista para fornecer uma idéia mais concreta do tipo de recursos que gostaria de ver antes de considerar um IDE "completo". É bem possível que o CEDET se encaixe na conta, mas ainda preciso encontrar um tutorial passo a passo sobre como configurá-lo do zero.


6
Essa pergunta pode ser melhor dividida em várias. Você pode acabar tendo várias respostas parciais, em que nenhum dos itens recebe a atenção que merece.
Malabarba 29/09

2
Além disso, o item 1 pode ser uma duplicata de emacs.stackexchange.com/questions/448/…
Malabarba

6
@ Malabarba: Se eu estivesse fazendo cinco perguntas separadas, pode ser uma duplicata. O ponto principal desta questão é que pode haver cinco pacotes diferentes que atingem os cinco objetivos diferentes, mas configurar os cinco para que eles se saiam bem parece quase impossível. Se a resposta voltar como "O Emacs não pode funcionar como um IDE completo, pois leva muito tempo para configurar". então, que seja.
Nispio 29/09/14

4
Cada um dos pontos pode ser sua própria pergunta (potencialmente duplicada), reuni-los todos em uma pergunta às vezes pode levar a respostas diferentes devido à interação do pacote.
Jonathan Leech-Pepin

Respostas:


27

Existem diferentes níveis de "IDE-ness" para diferentes idiomas e, infelizmente, você nunca obterá recursos completos do IDE sem alguma configuração (se você não gosta de configurar as coisas, provavelmente não deve usar o Emacs). O CEDET pretende ser uma solução completa que cubra todas as suas necessidades de idiomas suportados, mas pessoalmente nunca o fiz funcionar corretamente; em vez disso, uso alguns pacotes em conjunto para cobrir minhas bases de IDE. Analisarei seus pontos em ordem, com algumas soluções para diferentes idiomas que eu conheço:

  1. O projétil é o pacote mais próximo de fornecer uma experiência real semelhante ao IDE. Ele fornece uma tonelada de funcionalidades úteis por projeto. Você provavelmente também desejará algum tipo de gerenciamento de janela / espaço de trabalho; Eu uso minha própria solução chamada wacspace , mas outras boas soluções incluem perspectiva , grupos de trabalho e elscreen .
  2. Idiomas diferentes têm idéias diferentes sobre o que é uma "compilação", mas M-x compilepodem acomodar praticamente qualquer coisa e facilita a paginação através de erros (basta usar next-error). Você pode personalizar facilmente por projeto usando variáveis ​​de diretório para definir compile-command. Você pode executar compilecom projétil usando projectile-compile-project( C-c p c).
  3. M-x compilevocê também abordou aqui - os erros geralmente terminam um por linha no *compilation*buffer, com paginação fácil com next-error.
  4. Pular para um símbolo envolve "entender seu código", e é aí que o suporte varia tremendamente entre os idiomas. Para o Elisp, você pode usar o excelente elisp-slime-nav e depois M-.pular para a definição. Aqui estão alguns pacotes que fornecem suporte semelhante para outros idiomas: CIDER (para Clojure); SLIME (para Common Lisp); roupão (para Ruby); tags semânticas ou clang para C / C ++ (exoneração de responsabilidade: eu também nunca usei, por isso não faço ideia se elas funcionam bem). Se tudo mais falhar, você também pode usar as instalações TAGS integradas do Emacs usando algo como ctags exuberantes , mas nunca tive resultados próximos nem aceitáveis ​​com o TAGS.
  5. O Emacs tem um suporte muito disperso para depuradores. GDB com GUD é sua melhor aposta para idiomas do tipo C; caso contrário, é basicamente inteiramente por idioma. (Não acho que a depuração visual em vários idiomas seja realmente uma meta realista.)

4
Como um nó lateral projectilepode ser integrado diretamente com a perspectivecriação de um perspective-per-projectswitch automaticamente no projeto.
Jonathan Leech-Pepin

Eu acrescentaria notas sobre o semantic# 4, a semântica é um ótimo pacote, ele entende o seu código e pode fazer muitas coisas úteis com essas informações.
Jordon Biondo

Eu realmente nunca usei semantice acho que me lembro que ele tem suporte incompleto ao C ++, mas o adicionei à resposta.
shosti

15

Usei este guia para começar a usar o Emacs como um IDE C ++. Ele apresenta o Helm and Projectile, que ajuda a responder várias perguntas. A saber,

  1. Projétil gerencia projetos. Ele procura na árvore de diretórios um Makefile, SConstruct, Git repo, SVN repo e talvez outros sistemas de compilação ou arquivos de controle de versão para aprender automaticamente quais arquivos estão associados ao projeto atual. Como exemplo, C-c p hé executado o helm-projectileque usa o Helm para encontrar um arquivo no projeto atual.

  2. Projétil pode construir seus projetos. C-c p cexecuções projectile-compile-projectque tentam executar Make / SCons / CMake com base nos arquivos disponíveis. Eu nunca tive que configurar isso; sempre soube o que fazer.

  3. Os erros aparecem em seu próprio buffer quando você executa, projectile-compile-projectmas não tenho certeza se é tão bonito quanto você gostaria.

  4. Você pode usar o pacote helm-gtagsque faz interface com o gtagsprograma (que você deve ter disponível no seu sistema). Observe que o gtags é um projeto GNU e, portanto, é improvável que funcione imediatamente no Windows.

    Uma vez configurado, o Helm reconhece os símbolos no projeto e pode navegar para definições e usar locais. Por exemplo, helm-gtags-dwimpode pular para qualquer uso de uma variável ou função e, quando executado em um arquivo de cabeçalho, abre esse arquivo de cabeçalho.

  5. Ainda não tentei isso.

O guia listado fornece informações de configuração muito explícitas sobre como começar.


Também tropecei nesse guia e o apliquei. IMHO é de alguma forma pesado e muda muito a interação básica do emacs. Desabilitei várias configurações relacionadas ao leme porque elas interferiam nos atalhos comuns (como abrir facilmente o diretório atual em um buffer ou abrir o arquivo em um sub-diretório com algumas teclas pressionadas). Vale uma olhada, no entanto, mas provavelmente deve ser tentada passo a passo, não como um todo.
Stéphane Gourichon

9

Como você está solicitando um IDE C / C ++ com todos os recursos agora, posso estar qualificado.

Eu usei todos os MS IDEs do vc4 para o Visual Studio 2010, então entendo perfeitamente o que você deseja.

A boa notícia é que o Emacs pode ser 95% tão bom quanto o Visual Studio e pode fazer muito mais. mas você pode não estar interessado na parte "mais". Então, vou me concentrar apenas nas suas perguntas.

Agora, o ponto principal, você DEVE USAR o CMake , até mesmo seu aplicativo C ++ é apenas para Windows! Fim da história. Não tenho outra escolha, eu sei do que estou falando. Se você não usa o CMake, não faz sentido continuar.

Resposta à pergunta 1 : Você não precisa configurar nada, instale o cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ) que configura outros plugins. É ainda mais conveniente que o Visual Studio. Portanto, por configuração do projeto não é necessário. Para a busca substituir coisa, eu combino o poder do bash / perl / git e percol ( https://github.com/mooz/percol ), que é muito melhor do que qualquer IDE. verifique meu blog ( http://blog.binchen.org/categories/emacs.html ) e meu ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ). Por exemplo, posso procurar substituir os arquivos em determinadas confirmações.

Resposta à pergunta 2 : Já está configurado pelo cpputils-cmake, você só precisa M-x compilecomo de costume.

Resposta à pergunta 3 : igual à pergunta 2. Não sei por que isso é um problema. é exatamente o mesmo comportamento do VS, com melhores combinações de teclas.

Resposta à pergunta 4 : Agora, a maioria das pessoas usa o Gnu Global, que pode ser combinado com o cpputils-cmake. Entendo que o problema real é detectar os diretórios que contêm todos os cabeçalhos C ++ incluídos automaticamente . Isso pode ser feito com cpputils-cmake, tudo o resto é fácil. Por favor, man globalno shell e leia o manual sobre a variável de ambiente GTAGSLIBPATH. Existem muitos plugins para fornecer um bom UX baseado em Global para navegação de código, eu recomendo o ggtags.el

Resposta à pergunta 5 : Depuração visual, muitas pessoas recomendaram M-x gdb-many-window, eu tentei, mas não funcionou. É simplesmente porque minha versão do gdb está desatualizada (Dica, estou usando o OSX 10.7.3) e tenho preguiça de atualizar o meu sistema operacional. Mas o GUD está bem. Eu crio uma tecla curta para imprimir a variável para mim na janela do editor. todo o material de depuração é utilizável. Ele não possui o layout da tabela UX como VS. mas para ser sincero com você. O depurador UX da Microsoft também não é o melhor do mundo. O melhor depurador amigável é o DDD ( http://www.gnu.org/software/ddd/) Gud e VS são péssimos nessa questão. Atualmente, apenas insiro o código de log com o yasnippet, que é outro plug-in do Emacs. Para esclarecer, conheço todos os truques avançados sobre pontos de interrupção, é apenas porque tenho preguiça de aplicar esses truques. Inserir código de registro no Emacs é muito mais fácil.

Há muito mais coisas sobre o IDE: conclusão de código? use o modo empresa, sem necessidade de configuração. verificação de sintaxe em tempo real? use cpputils-cmake, então(flymake-mode 1)

O melhor é que você precisa fazer menos configurações que o VS se usar minha configuração em ( https://github.com/redguardtoo/emacs.d ) Essa configuração possui o título "configuração do emacs do purcell mais suporte para C / C ++" .

Agora há algo que eu preciso enfatizar: o Emacs oferece total liberdade . Você pode escolher qualquer maneira de começar. maneira difícil ou fácil.

A maneira mais fácil é apenas copiar minha configuração (ou a configuração de qualquer pessoa no github, conte as estrelas primeiro), em 5 minutos você terá um IDE C ++ totalmente funcional. O VS não terminou a inicialização nesses 5 minutos.

A maneira mais difícil é ajustar a configuração do zero. Se você escolher o caminho mais difícil, não reclame o Emacs . É a sua escolha.

BTW, a longo prazo, um pouco de conhecimento do Emacs Lisp pode ser útil. Eu acho que é trivial para um desenvolvedor profissional de C ++ comparar o tempo que perdi no MS sh * t. Muitos anos atrás, a MS atualizou silenciosamente o tempo de execução do VC em algumas atualizações do Windows. Isso fez meu produto funcionar bem nas máquinas da empresa, mas travou nos computadores dos clientes .

Após esse incidente, comecei a entender Richard Stallman.


11
Interessante. "VOCÊ DEVE USAR O CMake" -> Então, você está dizendo que, ao trabalhar em um pacote aleatório de software livre que usa autoconf ou script pessoal, deve-se escrever um wrapper CMakeLists.txt?
Stéphane Gourichon

11
Em vez disso, você pode usar o GNU Global, não tão perfeito quanto a solução cmake. Mas mais flexível, consulte blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin

5

Para o número 4, recomendo exuberant-ctags e o suporte a tags interno, que eu uso há anos. Como alternativa, recentemente mudei para o GNU Global e o pacote ggtags e os achei um pouco superiores; embora, eles funcionem quase de forma idêntica. Ambos trabalham com quase nenhuma configuração. Para outros recursos do IDE, também gosto do pacote de preenchimento automático. Da mesma forma, uso M-x compileextensivamente e vinculo chaves globais ao erro seguinte e anterior. Para pesquisar em "projetos", geralmente apenas uso M-x find-grep. Observe que ele usará as mesmas ligações de teclas para o erro seguinte e anterior.


4

Gerenciamento de "projetos" de software. Quero que meu IDE tenha uma noção de todos os arquivos que compõem meu projeto atual, para que eu possa executar funções como pesquisar e substituir dentro do meu projeto. (Seria bom se eu também conseguisse isso sem encher minha árvore de origem com muitos arquivos de suporte. Por que preciso de mais de um arquivo de projeto centralizado por projeto?)

O projétil parece ser a melhor opção para gerenciamento de projetos no emacs. É extremamente leve, você não precisa adicionar nenhum arquivo extra ao seu projeto. Ele tentará detectar automaticamente projetos para você com base na presença de determinados arquivos especiais. Por exemplo - se você estiver trabalhando em um repositório git, o projétil o tratará como um projeto (todos os arquivos rastreados pelo git serão tratados como parte do projeto), então você poderá usar comandos como projectile-find-fileabrir qualquer arquivo do projeto. Ele tem vários outros comandos que operam com base no projeto.

Relatório de erros. Não quero ter que ler mais de 500 linhas de saída para encontrar os erros que foram relatados pelas ferramentas de compilação. De preferência, os erros aparecem em seu próprio buffer com uma linha por erro.

O Flycheck tem suporte para verificar a sintaxe usando o clang / gcc.

Uma conscientização dos símbolos dentro do projeto e onde eles são definidos. Quero pular para uma definição de símbolo, esteja ele nos meus arquivos de projeto ou no sistema inclua arquivos

Eu recomendaria que você desse uma olhada nas rtags . Ele usa o clang como um back-end e um bom trabalho de ir para a definição e conclusão. Também pode ajudá-lo com o número 3, pois também se integra ao flymake para exibir erros e avisos usando o clang. Além disso, possui algum suporte limitado para refatoração. Outra opção para o preenchimento automático inteligente é o modo ironia


2

A versão CEDET atualmente fornecida com o Emacs é difícil de configurar, mas a que você pode acessar no site oficial é mais fácil de configurar e pode responder às suas necessidades # 2 e # 4.

O EDE do CEDET permite gerenciar, por exemplo, makefile e automatizar projetos, adicionando destinos a ele e associando arquivos a destinos. Você pode então compilar seu projeto usando os comandos EDE. Como ele usa o modo de compilação interno do Emacs, sua necessidade nº 3 também é satisfeita.

A Semântica do CEDET possui analisadores para vários idiomas, incluindo C ++. Ele pode recuperar as tags definidas em um arquivo, como exuberant-ctags e GNU Global, mas também possui recursos precisos de preenchimento automático e salto. Se você tem dois métodos chamados "foo", o salto de Semantic é inteligente o suficiente para levá-lo ao caminho certo.

Para o número 1, eu pessoalmente uso projétil e usei com êxito o GDB para o número 5 algumas vezes atrás.

Dica para o 3: se o EDE é um exagero para você, o Emacs tem o comando M-x recompilepara iniciar seu último comando de compilação, para que você possa executar sua compilação pela primeira vez e usá-lo recompileem qualquer buffer.


1

Para a # 4, parece ser um novo projeto chamado YouCompleteme , e o cliente Emacs correspondente, que parece ser a próxima coisa interessante. Por usar clang, ele tem uma visão melhor do código do que tags ou global.


11
Obrigado pela sugestão, mas como estou procurando coisas que se integram bem, não tenho certeza de que tentar obter um dos recursos usando um plug-in Vim com um protótipo de cliente Emacs é o melhor ponto de partida.
Nispio 3/10

3
Tente github.com/abingham/emacs-ycmd para o cliente emacs (observe que ele usa github.com/Valloric/ycmd , não github.com/Valloric/YouCompleteMe ). Funciona com o modo de empresa (recomendado por outras respostas aqui), por isso se integra bem ao restante do Emacs. Você pode instalar o ycmd e o company-ycmd do MELPA ( sprunge.us/LXGY é minha configuração); e siga as instruções de construção para o ycmd. O único desafio é que você precisa colocar seus sinalizadores de compilação em um arquivo como github.com/Valloric/ycmd/blob/master/examples/…
unhammer

1

Fiquei feliz com o CEDET de seu repositório de origem + BCE + gtags + cscope. Dito isto, há muitas sugestões neste post que tentarei.


11
Você poderia explicar o que precisava fazer para que todas essas ferramentas funcionassem juntas?
Nispio 8/10

4
No momento, isso quase parece um comentário equivocado. :-) Se você é gentil, por favor elabore um pouco.
Malabarba

Desculpe por ser concisa. O aplicativo StackExchange leva o domo a se acostumar. Esta solução responde no 4, lidando com a navegação de símbolos e a análise da fonte. O CEDET, é claro, contém semântica. O BCE é o Emacs Code Browser e usa o CEDET para listar métodos e relatar informações de símbolos. O Gtags e o Cscope criam tabelas de informações de símbolos a partir da base de origem (o helm também faz isso) e se integram ao Emacs para permitir a navegação por tags ou símbolos.
9608 Clayton Haapala

1

Como foi mencionado nas partes acima, o projétil (opcionalmente com leme) é uma solução brilhante para o gerenciamento de projetos.

O Ycmd é ótimo para conclusão de código e alguma navegação, e o melhor cliente para ele é o emacs-ycmd (divulgação completa: escrevi para o cliente emacs).

Para "tags" e indexação, a melhor solução geral que encontrei é a pesquisa de código (mais divulgação: também escrevi esta). É bastante estúpido o fato de realmente fazer pesquisa regex, mas é extremamente rápido e geralmente tudo o que você precisa , e funciona bem em vários idiomas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.