¿Cómo obtener autocompletado inteligente en C ++?


43

Emacs no puede competir con otro IDE si no tiene una función de autocompletar. Autocompletar simplemente me convierte en un programador más eficiente. Sé de la extensión del modo Autocompletar , pero no funciona con C ++.

autocompletar

¿Cómo puedo lograr un autocompletado inteligente y eficiente para C ++?


Esta pregunta fue originalmente hecha por Malabarba sobre la propuesta del Área 51: ¿Cómo obtener una autocompletación inteligente en C ++?


1
Sería bueno ampliar un poco esta cuestión. Tiene mucho valor potencial, pero en este momento la pregunta es solo el título.
Malabarba

El modo ironía parece ser el camino a seguir en este momento.
Sevki

Respuestas:


45

Descargo de responsabilidad: soy el autor de irony-mode

captura de pantalla de ironía de la compañía

Si solo desea la finalización automática inteligente, puedo recomendar el modo ironía con la ironía de la compañía .

  • el modo ironía es fácil de instalar gracias a MELPA
  • la finalización es muy precisa y el rendimiento bastante decente gracias a libclang
  • con ironía de la compañía, tiene un backend de finalización asincrónico que no se interpondrá en su camino si la finalización lleva algún tiempo
  • company-irony admite funciones sobrecargadas y si tiene instalado Yasnippet, los argumentos de la función se insertan como marcadores de posición para completar
  • Si su proyecto utiliza Doxygen, la breve documentación del candidato de finalización se muestra en el minibúfer (ver captura de pantalla)
  • La instalación del servidor en modo ironía en un sistema similar a Unix (Linux, OS X) debería ser fácil. Windows, por otro lado, requiere algunos ajustes, pero está documentado en la wiki.

Otra herramienta que aún no se ha citado es emacs-ycmd .


2
Muchas gracias! Ojalá descubriera antesirony-mode
Luke

@GuillaumePapin ¡Gracias por escribir ironía! ¿Tendría alguna referencia de tiempo disponible? Me di cuenta de que las llamadas clang_codeCompleteAtcon una TU analizada (pero los cambios no guardados) demoran de 3 a 5 segundos. ¿Es irony-modemás rápido que esto?
Pradhan

1
Irony usa libclang / clang_codeCompleteAt, por lo que no obtendrá mejores tiempos que eso. 3-5 segundos pueden ser demasiado dependiendo del contexto (por ejemplo, las finalizaciones en ámbitos globales requieren mucho más tiempo que otros ámbitos). Puedes echar un vistazo a algunos horarios que hice recientemente: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008803
Guillaume Papin

Relacionado, para futuros lectores: github.com/Sarcasm/irony-mode/issues/140
Sean Allred

¿Cómo se comparan los roles de irony-mode y emacs-ycmd? ¿Son alternativas entre sí? ¿Alguna vez tendría sentido usar ambos?
Praxeolítico

23

Mira mi guía . Enumera varios métodos para la finalización automática en C / C ++.

Esas opciones son:

  • Usando ironía . Muy recomendable, ya que utiliza Clang y es fácil de configurar en comparación con otras soluciones.

  • Usando el analizador incorporado de Emacs. Es el mejor autocompletado que puede obtener desde el analizador de Emacs, Semantic, pero sería lento en proyectos grandes como el kernel de Linux.

  • Usando el company-modepaquete con company-clang. Proporciona un código de finalización correcto para las rutas de inclusión del sistema, ya que puede obtener automáticamente las rutas de Clang, pero tiene que hacer alguna configuración para el proyecto local.

  • Utilizando company-modecon company-gtags. Utiliza la base de datos de etiquetas generada a partir de GNU Global como finalización. Puede usar esto para proporcionar código completo localmente a su proyecto. No es exactamente inteligente, ya que arroja todo dentro de la base de datos generada.

  • rtagsva más allá al proporcionar un servidor para análisis en vivo. Pero es complicado configurarlo en comparación con la solución pura de Elisp.


No estaría de acuerdo en que configurar rtags es más complicado que una solución pura de emacs lisp. La solución pura emacs lisp generalmente no considera los archivos cmake / build y apenas puede encontrar ningún encabezado. Rtags es bastante fácil de configurar en comparación. Todavía es un poco joven como proyecto, con una cobertura de prueba no muy buena.
baol

Buena adición a la guía de Tuhdo
Victor

9

He tenido un gran éxito con RTags + Company .

RTags necesita un demonio rdmque se ejecute por separado y que utilice el sonido metálico para completar el código, navegar por el código y refactorizar. rdmTambién funciona como una base de datos de símbolos, lo que significa que el autocompletado es mucho más rápido que cualquier solución que solo llame directamente clang_codeCompleteAt.

Rdm necesita información de las banderas de compilación para sus proyectos que pueden ser una molestia, pero si usted sigue el consejo del RTags página y enlace simbólico gcc-rtags-wrapper.sha gcc, g++, ccy c++rdm automáticamente se actualiza con las nuevas banderas de compilación de recompilación.


Acabo de pasar del modo ironía a rtags. El modo ironía se desmorona constantemente y deja de funcionar después de unos 15 minutos más o menos. Rtags parece bastante bueno hasta ahora, y tiene una integración más limpia con yasnippet.
nenchev

6

Solución 1: modo empresa + clang

El único problema es que necesita decirle al modo empresa dónde buscar los archivos de encabezado c / c ++ de su proyecto.

Si usa cmake, puede dejar que https://github.com/redguardtoo/cpputils-cmake haga la configuración por usted (SUGERENCIA: Soy el autor de cpputils-cmake).

O

Solución 2: company-mode + gnu global

Nada más que decir, necesita construir las etiquetas con la herramienta global cli de gnu, como otros mencionaron.


1

He estado usando cmake-ide para configurar rtags, flycheck, ironía y company-clang.

¡Ahora puede configurar su sistema de compilación y sus complementos favoritos de análisis estático emacs al mismo tiempo!

EDITAR: Tenga en cuenta que el clang de la compañía proporciona autocompletados, que era la característica que estaba buscando. cmake-ide también puede configurar flycheck y rtags, lo que agrega varias características similares a IDE.


1
Explique cómo responde esto a la pregunta de cómo obtener la autocompletación de C ++.
Dibujó

@Drew company-clang proporciona terminaciones
AnimatedRNG

Por favor, póngalo en su respuesta. Gracias.
Dibujó

0

Mx modo semántico

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

&&

Tablas de etiquetas

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

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

etags , ctags - genera un archivo de etiqueta para Emacs, vi

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

CMi (o M-TAB) finalización en el punto. Si el modo semántico está habilitado, intenta usar los datos del analizador semántico. Si el modo Semántico está deshabilitado o falla, intenta completar usando la tabla de etiquetas seleccionadas (ver Etiquetas)

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

METRO-. (find-tag) solicita el nombre de la etiqueta && salta a la definición

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.