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:
- 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?)
- 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.
- 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.
- 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.
- 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.
Respuestas:
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:
M-x compile
pueden adaptarse a casi cualquier cosa y facilitan la paginación de errores (solo usarnext-error
). Puede personalizar fácilmente por proyecto utilizando variables de directorio para establecercompile-command
. Puedes corrercompile
con proyectil usandoprojectile-compile-project
(C-c p c
).M-x compile
también lo cubre aquí: los errores generalmente terminan uno por línea en el*compilation*
búfer, con paginación fácilnext-error
.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.fuente
projectile
puede integrarse directamente con laperspective
creaciónperspective-per-project
automática de un interruptor de proyecto.semantic
. ° 4, la semántica es un gran paquete, comprende su código y puede hacer muchas cosas útiles con esa información.semantic
, y creo recordar que tiene soporte C ++ incompleto, pero lo he agregado a la respuesta.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,
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 h
ejecutahelm-projectile
y usa Helm para encontrar un archivo en el proyecto actual.Proyectil puede construir sus proyectos.
C-c p c
ejecutaprojectile-compile-project
que intenta ejecutar Make / SCons / CMake en función de los archivos disponibles. Nunca he tenido que configurar esto; Siempre ha sabido qué hacer.Los errores aparecen en su propio búfer cuando lo ejecutas,
projectile-compile-project
pero no estoy seguro de que sea tan bonito como te gustaría.Puede usar el paquete
helm-gtags
que interactúa con elgtags
programa (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-dwim
puede saltar a cualquier uso de una variable o función, y cuando se ejecuta en un archivo de encabezado abre ese archivo de encabezado.Aún no he probado esto.
La guía enumerada proporciona información de configuración muy explícita sobre cómo comenzar.
fuente
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 compile
como 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 global
con 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.elRespuesta 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.
fuente
CMakeLists.txt
?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 compile
ampliamente y asocio claves globales al siguiente error y al anterior. Para buscar dentro de "proyectos", generalmente solo usoM-x find-grep
. Tenga en cuenta que utilizará las mismas combinaciones de teclas para el siguiente error y el anterior.fuente
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-file
abrir cualquier archivo del proyecto. Tiene un montón de otros comandos que operan por proyecto.Flycheck tiene soporte para verificar la sintaxis usando clang / gcc.
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
fuente
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 recompile
para iniciar su último comando de compilación, por lo que puede ejecutar su compilación por primera vez y luego usarlarecompile
en cualquier búfer.fuente
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.
fuente
He estado contento con CEDET desde su fuente repo + ECB + gtags + cscope. Dicho esto, hay muchas sugerencias en esta publicación que intentaré.
fuente
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.
fuente