Usando Emacs como un IDE C / C ++ con todas las funciones

50

Llevo más de un año intentando usar Emacs como IDE de C / C ++. Hasta ahora solo he tenido un éxito marginal, pero me he topado con algunas paredes de ladrillo en el camino. Actualmente estoy tratando de usar CEDET, pero me está costando entender cómo usarlo de manera efectiva.

Las características que busco en un IDE son las siguientes:

  1. Gestión de "proyectos" de software. Quiero que mi IDE tenga una idea de todos los archivos que componen mi proyecto actual para que pueda realizar funciones como buscar y reemplazar dentro de mi proyecto. (Sería bueno si también pudiera lograr esto sin ensuciar mi árbol fuente con muchos archivos de soporte. ¿Por qué necesito más de un archivo de proyecto centralizado por proyecto?)
  2. La capacidad de construir el proyecto actual desde el IDE, independientemente del búfer que estoy visitando actualmente. Necesito poder vincular una clave que construirá el proyecto actual.
  3. Error al reportar. No quiero tener que leer más de 500 líneas de salida para encontrar los errores que informaron las herramientas de compilación. Preferiblemente, los errores aparecen en su propio búfer con una línea por error.
  4. Una conciencia de los símbolos dentro del proyecto y dónde se definen. Quiero saltar a una definición de símbolo, ya sea que viva en mis archivos de proyecto o en los archivos de inclusión del sistema.
  5. Depuración visual Quiero tener una lista de observación de variables locales que se actualizan automáticamente a medida que paso por el código. Quiero poder establecer puntos de interrupción en el código, ver qué línea de código se ejecutará a continuación.

Sé que cada una de estas características existe porque he tenido cada una de ellas trabajando en un momento u otro usando EDE, Semantic, GDB, etc. El problema es que nunca he podido tener todas estas funciones funcionando al mismo tiempo , porque cada pieza generalmente debe configurarse por sí misma, y ​​generalmente es demasiado trabajo descubrir cómo configurarlas todas a la vez y hacer que funcionen juntas.

¿Qué soluciones existen para convertir Emacs en un IDE C / C ++ con todas las funciones? ¿Siempre tiene que configurar todo poco a poco o hay una manera de configurar todas las funciones a la vez?

EDITAR: Una buena respuesta a esta pregunta no tiene que cumplir exactamente con los cinco criterios dados. Simplemente proporcioné la lista para dar una idea más concreta del tipo de características que quiero ver antes de considerar un IDE como "con todas las funciones". Es muy posible que CEDET cumpla con los requisitos, pero todavía tengo que encontrar un tutorial paso a paso que funcione sobre cómo configurarlo desde cero.

nispio
fuente
66
Esta pregunta podría estar mejor dividida en varias. Puede terminar teniendo un montón de respuestas parciales, donde ninguno de los elementos recibe la atención que merece.
Malabarba
2
Además, el elemento 1 podría ser un duplicado de emacs.stackexchange.com/questions/448/…
Malabarba
66
@Malabarba: Si estuviera haciendo cinco preguntas separadas, podría ser un duplicado. El punto central de esta pregunta es que puede haber cinco paquetes diferentes que logren los cinco objetivos diferentes, pero configurar los cinco para jugar bien entre ellos parece casi imposible. Si la respuesta regresa como "Emacs no puede funcionar como un IDE con todas las funciones porque requiere una cantidad de tiempo imposible de configurar". entonces que así sea.
nispio
44
Cada uno de los puntos podría ser su propia pregunta (potencialmente duplicada), ponerlos todos juntos en una pregunta a veces puede dar lugar a respuestas diferentes debido a la interacción del paquete.
Jonathan Leech-Pepin
Relacionado: emacs.stackexchange.com/q/3359/2264
Sean Allred

Respuestas:

27

Existen diferentes niveles de "IDE-ness" para diferentes idiomas, y desafortunadamente nunca obtendrá características IDE completas sin alguna configuración (si no le gusta configurar las cosas, probablemente no debería usar Emacs). CEDET pretende ser una solución completa que cubra todas sus necesidades de idiomas compatibles, pero personalmente nunca he conseguido que funcione correctamente; en cambio, uso algunos paquetes en conjunto para cubrir mis bases IDE. Revisaré sus puntos en orden, con algunas soluciones para diferentes idiomas que conozco:

  1. El proyectil es el paquete más cercano para proporcionar una verdadera experiencia IDE. Proporciona una tonelada de funcionalidades útiles por proyecto. Probablemente también desee algún tipo de gestión de ventana / espacio de trabajo; Utilizo mi propia solución llamada wacspace , pero otras buenas soluciones incluyen perspectiva , grupos de trabajo y elscreen .
  2. Los diferentes lenguajes tienen diferentes ideas sobre lo que es una "compilación", pero M-x compilepueden adaptarse a casi cualquier cosa y facilitan la paginación de errores (solo usar next-error). Puede personalizar fácilmente por proyecto utilizando variables de directorio para establecer compile-command. Puedes correr compilecon proyectil usando projectile-compile-project( C-c p c).
  3. M-x compiletambién lo cubre aquí: los errores generalmente terminan uno por línea en el *compilation*búfer, con paginación fácil next-error.
  4. Saltar a un símbolo implica "comprender su código", y aquí es donde el soporte varía enormemente entre los idiomas. Para Elisp, puede usar el excelente elisp-slime-nav y luego M-.saltar a la definición. Aquí hay algunos paquetes que brindan soporte similar para otros idiomas: CIDER (para Clojure); SLIME (para Common Lisp); bata (para Ruby); etiquetas semánticas o clang para C / C ++ (descargo de responsabilidad: nunca he usado tampoco, así que no tengo idea de si funcionan bien). Si todo lo demás falla, también puede usar las instalaciones TAGS integradas de Emacs usando algo como etiquetas exuberantes , pero nunca he tenido resultados cerca aceptables con TAGS.
  5. Emacs tiene un soporte muy disperso para depuradores. GDB con GUD es su mejor apuesta para lenguajes tipo C; de lo contrario, es prácticamente por idioma. (No creo que la depuración visual en varios idiomas sea realmente un objetivo realista).
shosti
fuente
44
Como un nodo lateral projectilepuede integrarse directamente con la perspectivecreación perspective-per-projectautomática de un interruptor de proyecto.
Jonathan Leech-Pepin
Agregaría notas sobre el n semantic. ° 4, la semántica es un gran paquete, comprende su código y puede hacer muchas cosas útiles con esa información.
Jordon Biondo
Realmente nunca lo he usado semantic, y creo recordar que tiene soporte C ++ incompleto, pero lo he agregado a la respuesta.
shosti
15

Usé esta guía para comenzar a usar Emacs como un IDE de C ++. Presenta Helm and Projectile que ayudan a responder una serie de preguntas. Esto es,

  1. Proyectil gestiona proyectos. Busca en el árbol del directorio un Makefile, SConstruct, un repositorio Git, un repositorio SVN y quizás algún otro sistema de compilación o archivos de control de versiones para aprender automáticamente qué archivos están asociados con el proyecto actual. Como ejemplo, se C-c p hejecuta helm-projectiley usa Helm para encontrar un archivo en el proyecto actual.

  2. Proyectil puede construir sus proyectos. C-c p cejecuta projectile-compile-projectque intenta ejecutar Make / SCons / CMake en función de los archivos disponibles. Nunca he tenido que configurar esto; Siempre ha sabido qué hacer.

  3. Los errores aparecen en su propio búfer cuando lo ejecutas, projectile-compile-projectpero no estoy seguro de que sea tan bonito como te gustaría.

  4. Puede usar el paquete helm-gtagsque interactúa con el gtagsprograma (que debería tener disponible en su sistema). Tenga en cuenta que gtags es un proyecto GNU y, por lo tanto, es poco probable que funcione de inmediato en Windows.

    Una vez configurado, Helm se da cuenta de los símbolos en el proyecto y puede navegar a las definiciones y usar ubicaciones. Por ejemplo, helm-gtags-dwimpuede saltar a cualquier uso de una variable o función, y cuando se ejecuta en un archivo de encabezado abre ese archivo de encabezado.

  5. Aún no he probado esto.

La guía enumerada proporciona información de configuración muy explícita sobre cómo comenzar.

Patrick Steele
fuente
También me topé con esa guía y la apliqué. En mi humilde opinión, es de alguna manera pesado y cambia demasiada interacción básica de emacs demasiado. He desactivado una serie de configuraciones relacionadas con el timón porque interfieren con los accesos directos habituales (como abrir fácilmente el directorio actual en un búfer o abrir un archivo en un subdirectorio secundario con unas pocas teclas). Sin embargo, vale la pena echarle un vistazo, pero probablemente debería probarse paso a paso, no como un todo.
Stéphane Gourichon
9

Dado que ahora está solicitando un IDE C / C ++ con todas las funciones, podría estar calificado.

Utilicé todos los IDEs de MS desde vc4 hasta Visual Studio 2010, así que entiendo completamente lo que quieres.

La buena noticia es que Emacs podría ser un 95% tan bueno como Visual Studio, y puede hacer mucho más. pero es posible que no le interese la parte "más". Así que me enfocaré solo en tus preguntas.

Ahora el punto clave, DEBE USAR CMake , ¡incluso su aplicación C ++ es solo para Windows! Fin de la historia. No hay otra opción, sé de lo que estoy hablando. Si no usa CMake, entonces no tiene sentido continuar.

Respuesta a la pregunta 1 : No necesita configurar nada, instale cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ) que configura otros complementos. Es incluso más conveniente que Visual Studio. Por lo tanto, no se necesita la configuración por proyecto. Para la búsqueda de reemplazo, combino el poder de bash / perl / git y percol ( https://github.com/mooz/percol ), que es mucho mejor que cualquier IDE. consulte mi blog ( http://blog.binchen.org/categories/emacs.html ) y mi ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ). Por ejemplo, puedo buscar reemplazar los archivos en cierta confirmación.

Respuesta a la pregunta 2 : ya está configurado por cpputils-cmake, solo necesita M-x compilecomo de costumbre.

Respuesta a la pregunta 3 : igual que la pregunta 2. No sé por qué esto es un problema. Es exactamente el mismo comportamiento que VS, con mejores combinaciones de teclas.

Respuesta a la pregunta 4 : ahora la mayoría de las personas solo usan Gnu Global, que podría combinarse con cpputils-cmake. Entiendo que el verdadero problema es detectar los directorios que contienen todos los encabezados C ++ incluidos automáticamente . Eso se puede hacer con cpputils-cmake, todo lo demás es fácil. Por favor, man globalcon cáscara y leer el manual sobre la variable de entorno GTAGSLIBPATH. Hay muchos complementos para proporcionar una buena experiencia de usuario basada en Global para la navegación de código, recomiendo ggtags.el

Respuesta a la pregunta 5 : Depuración visual, muchas personas lo recomendaron M-x gdb-many-window, lo intenté pero no funcionó. Es simplemente porque mi versión gdb está desactualizada (Sugerencia, estoy usando OSX 10.7.3) y soy demasiado vago para actualizar mi sistema operativo. Pero GUD está bien. Creo una tecla corta para imprimir variable para mí en la ventana del editor. Todas las cosas de depuración son utilizables. No tiene diseño de tabla UX como VS. pero para ser honesto contigo El depurador de Microsoft UX tampoco es el mejor del mundo. El mejor depurador fácil de usar es DDD ( http://www.gnu.org/software/ddd/) Gud y VS apestan en este tema. En estos días solo inserto el código de registro con yasnippet, que es otro complemento de Emacs. Para aclarar, conozco todos los trucos avanzados sobre puntos de interrupción, es solo porque soy demasiado vago para aplicar estos trucos. Insertar código de registro en Emacs es mucho más fácil.

Hay muchas más cosas sobre IDE: ¿finalización de código? use el modo empresa, sin necesidad de configuración. verificación de sintaxis en tiempo real? use cpputils-cmake, luego(flymake-mode 1)

Lo mejor es que necesita hacer menos configuración que VS si usa mi configuración en ( https://github.com/redguardtoo/emacs.d ) Esa configuración tiene el título "configuración emacs de purcell más soporte C / C ++" .

Ahora hay algo que necesito enfatizar, Emacs te da total libertad . Puede elegir cualquier forma de comenzar. de manera difícil o fácil.

La manera fácil es simplemente copiar mi configuración (o la configuración de cualquiera en github, contar las estrellas al principio), en 5 minutos tendrás un IDE de C ++ completamente funcional. VS no ha terminado de iniciarse en esos 5 minutos.

Lo difícil es ajustar la configuración desde cero. Si elige el camino difícil, entonces no se queje de Emacs . Es tu elección.

Por cierto, a la larga, un poco de conocimiento de Emacs Lisp podría ser útil. Creo que es trivial para un desarrollador profesional de C ++ en comparación con el tiempo que perdí en MS sh * t. Hace muchos años, MS actualizó silenciosamente su tiempo de ejecución de VC en algunas actualizaciones de Windows. Hizo que mi producto funcionara bien en las máquinas de la compañía pero se estrelló en las computadoras de los clientes .

Después de ese incidente, comencé a entender a Richard Stallman.

Chen Bin
fuente
1
Interesante. "DEBE USAR CMake" -> Entonces, ¿está diciendo que cuando trabaja en un paquete de software libre aleatorio que utiliza autoconf o script personal, uno debe escribir un contenedor CMakeLists.txt?
Stéphane Gourichon
1
En su lugar, puede usar GNU Global, no tan perfecto como la solución cmake. Pero más flexible, vea blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin
5

Para el n. ° 4, recomiendo exuberante-ctags y el soporte de etiquetas incorporado, que he usado durante años. Alternativamente, recientemente he cambiado a usar GNU Global y el paquete ggtags y he encontrado que son ligeramente superiores; aunque, funcionan casi de manera idéntica. Ambos funcionan casi sin configuración. Para otras características de IDE, también me gusta el paquete de autocompletar. Del mismo modo, uso M-x compileampliamente y asocio claves globales al siguiente error y al anterior. Para buscar dentro de "proyectos", generalmente solo uso M-x find-grep. Tenga en cuenta que utilizará las mismas combinaciones de teclas para el siguiente error y el anterior.

b4hand
fuente
4

Gestión de "proyectos" de software. Quiero que mi IDE tenga una idea de todos los archivos que componen mi proyecto actual para que pueda realizar funciones como buscar y reemplazar dentro de mi proyecto. (Sería bueno si también pudiera lograr esto sin ensuciar mi árbol fuente con muchos archivos de soporte. ¿Por qué necesito más de un archivo de proyecto centralizado por proyecto?)

Projectile parece la mejor opción para la gestión de proyectos en emacs. Es extremadamente ligero, no necesita agregar ningún archivo adicional a su proyecto. Intentará detectar automáticamente proyectos para usted en función de la presencia de ciertos archivos especiales. Por ejemplo, si está trabajando en un repositorio de git, el proyectil lo tratará como un proyecto (cualquier archivo rastreado por git será tratado como parte del proyecto), entonces podrá usar comandos como projectile-find-fileabrir cualquier archivo del proyecto. Tiene un montón de otros comandos que operan por proyecto.

Error al reportar. No quiero tener que leer más de 500 líneas de salida para encontrar los errores que informaron las herramientas de compilación. Preferiblemente, los errores aparecen en su propio búfer con una línea por error.

Flycheck tiene soporte para verificar la sintaxis usando clang / gcc.

Una conciencia de los símbolos dentro del proyecto y dónde se definen. Quiero saltar a una definición de símbolo, ya sea que viva en mis archivos de proyecto o en los archivos de sistema incluidos

Te recomendaría que eches un vistazo a rtags . Utiliza el sonido metálico como backend y un buen trabajo para saltar a la definición y la finalización. También puede ayudarlo con el n. ° 3, ya que también se integra con flymake para mostrar errores y advertencias usando clang. Además, tiene un soporte limitado para la refactorización. Otra opción para el autocompletado inteligente es el modo ironía

Iqbal Ansari
fuente
2

La versión CEDET que se envía actualmente con Emacs es difícil de configurar, pero la que puede obtener en el sitio oficial es más fácil de configurar y podría responder a sus necesidades # 2 y # 4.

EDE de CEDET le permite administrar, por ejemplo, proyectos de makefile y automake, agregando objetivos y asociando archivos a objetivos. Luego puede compilar su proyecto utilizando comandos EDE. Como utiliza el modo de compilación incorporado de Emacs, su necesidad # 3 también está satisfecha.

Semántica de CEDET tiene analizadores para varios lenguajes, incluido C ++. Puede recuperar las etiquetas definidas en un archivo, como exuberant-ctags y GNU Global, pero también tiene características precisas de autocompletado y salto. Si tiene dos métodos llamados "foo", el salto de Semantic es lo suficientemente inteligente como para llevarlo al correcto.

Para el n. ° 1, personalmente uso proyectil , y utilicé con éxito GDB para el n. ° 5 algunas veces.

Sugerencia para el n. ° 3: Si EDE es excesivo para usted, Emacs tiene el comando M-x recompilepara iniciar su último comando de compilación, por lo que puede ejecutar su compilación por primera vez y luego usarla recompileen cualquier búfer.

Steven Rémot
fuente
1

Para el n. ° 4, parece ser un nuevo proyecto llamado YouCompleteme , y el cliente de Emacs correspondiente, que parece ser la próxima novedad . Debido a que usa clang, tiene una mejor vista del código que las etiquetas o global.

rlazo
fuente
1
Gracias por la sugerencia, pero dado que estoy buscando cosas que se integren bien juntas, no estoy seguro de que intentar obtener una de las características utilizando un complemento Vim con un prototipo de cliente Emacs sea el mejor punto de partida.
nispio
3
Pruebe github.com/abingham/emacs-ycmd en su lugar para el cliente emacs (tenga en cuenta que usa github.com/Valloric/ycmd , no github.com/Valloric/YouCompleteMe ). Funciona con el modo empresa (recomendado por otras respuestas aquí), por lo que se integra bien con el resto de Emacs. Puede instalar ycmd y company-ycmd desde MELPA ( sprunge.us/LXGY es mi configuración); y siga las instrucciones de compilación para ycmd. El único desafío es que necesitas poner tus banderas de compilación en un archivo como github.com/Valloric/ycmd/blob/master/examples/…
unhammer el
1

He estado contento con CEDET desde su fuente repo + ECB + gtags + cscope. Dicho esto, hay muchas sugerencias en esta publicación que intentaré.

Clay Haapala
fuente
1
¿Podría exponer lo que tenía que hacer para que todas esas herramientas funcionaran juntas?
nispio
44
En este momento, esto casi parece un comentario fuera de lugar. :-) Si fuera amable, explique un poco.
Malabarba
Perdón por ser conciso. La aplicación StackExchange hace que el domo se acostumbre. Esta solución responde al # 4, que trata con la navegación de símbolos y el análisis de la fuente. CEDET, por supuesto, contiene semántica. ECB es el navegador de códigos Emacs, y utiliza CEDET para enumerar métodos e informar información de símbolos. Gtags y Cscope construyen tablas de información de símbolos desde la base fuente (el timón también hace esto), y se integra con Emacs para permitir la navegación por etiquetas o símbolos.
Clay Haapala
1

Como se mencionó anteriormente, el proyectil (opcionalmente con timón) es una solución brillante para la gestión de proyectos.

Ycmd es ideal para completar el código y navegar un poco, y el mejor cliente para ello es emacs-ycmd (divulgación completa: escribí el cliente emacs).

Para las "etiquetas" y la indexación, la mejor solución general que he encontrado es la búsqueda de códigos (más divulgación: también escribí esta). Es bastante tonto porque realmente solo realiza búsquedas de expresiones regulares, pero es increíblemente rápido y, en general, todo lo que necesita , y funciona bien en varios idiomas.

abingham
fuente