Autocompletado en Vim

257

En pocas palabras, estoy en busca de un trabajo función de autocompletar para el editor Vim. He argumentado antes que Vim reemplaza por completo un IDE en Linux y, aunque eso es cierto, carece de una característica importante: autocompletar.

Sé acerca de Ctrl+ N, integración de Cubetas Exuberantes , Taglist , cppcomplete y OmniCppComplete . Lamentablemente, ninguno de estos se ajusta a mi descripción de "autocompletado de trabajo":

  • Ctrl+N funciona bien (solo) si has olvidado cómo deletrear class, o while. Oh bien.
  • Ctags te da los rudimentos, pero tiene muchos inconvenientes.
  • Taglist es solo un contenedor de Ctags y, como tal, hereda la mayoría de sus inconvenientes (aunque funciona bien para enumerar declaraciones).
  • cppcomplete simplemente no funciona como se prometió, y no puedo entender qué hice mal, o si está "funcionando" correctamente y las limitaciones son por diseño.
  • OmniCppComplete parece tener los mismos problemas que cppcomplete, es decir, la finalización automática no funciona correctamente. Además, el tagsarchivo una vez más debe actualizarse manualmente.

Soy consciente del hecho de que ni siquiera los IDE modernos y completos ofrecen una buena terminación del código C ++. Es por eso que he aceptado la falta de Vim en esta área hasta ahora. Pero creo que un nivel fundamental de finalización de código no es demasiado pedir, y de hecho es necesario para un uso productivo. Así que estoy buscando algo que pueda lograr al menos las siguientes cosas.

  • Conciencia de sintaxis . cppcomplete promete (pero no cumple para mí), la finalización automática correcta y consciente del alcance de lo siguiente:

    variableName.abc
    variableName->abc
    typeName::abc

    Y realmente, cualquier otra cosa es completamente inútil.

  • Configurabilidad . Necesito especificar (fácilmente) dónde están los archivos de origen y, por lo tanto, de dónde obtiene el script su información de autocompletado. De hecho, tengo un Makefile en mi directorio que especifica las rutas de inclusión requeridas. Eclipse puede interpretar la información que se encuentra allí, ¿por qué no también un script Vim?

  • Actualidad . Tan pronto como cambie algo en mi archivo, quiero que la finalización automática refleje esto. Yo no quiero gatillo manualmente ctags(o algo similar). Además, los cambios deben ser incrementales , es decir, cuando he cambiado un solo archivo que es completamente inaceptable para los ctagsque re-analizar todo el árbol de directorios (que puede ser enorme).

¿Olvidé algo? Siéntase libre de actualizar.

Me siento cómodo con mucha configuración y / o retoques, pero no quiero programar una solución desde cero, y no soy bueno para depurar los scripts de Vim.

Una nota final, realmente me gustaría algo similar para Java y C #, pero supongo que es demasiado esperar: ctagssolo analiza los archivos de código y tanto Java como C # tienen marcos enormes y precompilados que tendrían que indexarse. Desafortunadamente, desarrollar .NET sin un IDE es aún más PITA que C ++.

Konrad Rudolph
fuente
44
Ha pasado mucho tiempo desde que hiciste esta pregunta, ¿finalmente has encontrado una buena? Pregunto porque no veo ninguna respuesta aceptada. Personalmente, aunque tengo que admitir que recurrí a prefijar mis variables / funciones. Por ejemplo, todos comienzan con sh(lo que significa que está en mi biblioteca) y seguidos de la abreviatura de mi clase. Por ejemplo shPpara la Parserclase. Entonces todo lo que necesita hacer es escribir shPy presionar CTRL + p (o CTRL + n si lo desea) y obtener los miembros de la clase del último uso al primero (o primero al último si CTRL + n)
Shahbaz
44
@Shahbaz De hecho, estoy convencido de que no hay una solución lo suficientemente buena en este momento. clang_completees técnicamente el más sólido pero prohibitivamente lento debido a la falta de almacenamiento en caché de los resultados y la compilación parcial. Tengo que admitir que no he probado todas las respuestas porque algunas requieren una configuración complicada y lenta. Aguantaré la respiración por un complemento utilizable ahora que el sonido metálico finalmente permite a los desarrolladores crear AST a partir de fuentes de C ++ (hasta ahora, no había buenos analizadores gratuitos para C ++ disponibles).
Konrad Rudolph
2
¿Has probado clang_completerecientemente? Se puede usar libclangcon el almacenamiento en caché ahora y, por lo tanto, debería ser más rápido.
Jan Larres
@ Jan Gracias por la información. La última vez que lo probé, el soporte de libclang todavía era incompleto. Probablemente debería intentarlo nuevamente una vez que tenga tiempo.
Konrad Rudolph
(Motivo de la reversión de edición: los nombres de los productos no son código, no pertenecen formatted like this).
Konrad Rudolph

Respuestas:

171

Prueba YouCompleteMe . Utiliza Clang a través de la interfaz libclang, que ofrece la terminación semántica de C / C ++ / Objective-C. Es muy parecido a clang_complete, pero sustancialmente más rápido y con coincidencia difusa.

Además de lo anterior, YCM también proporciona terminación semántica para C #, Python, Go, TypeScript, etc. También proporciona terminación no semántica basada en identificadores para lenguajes para los que no tiene soporte semántico.

Valloric
fuente
69
De hecho, voy a aceptar esta solución. Finalmente un complemento que ofrece. Lo he estado usando durante varios días. Solo tomó cuatro años responder esta pregunta. ;-)
Konrad Rudolph
55
¡trabajo increíble con YouCompletMe valloric! felicidades
statquant
55
Lástima que YouCompleteMe sea un PITA completo para instalar en Windows :(
xx
2
@DrTwox Del archivo Léame: "YCM no tiene soporte oficial para Windows , pero eso no significa que no pueda hacer que funcione allí. Consulte la página wiki de la Guía de instalación de Windows. Siéntase libre de agregarlo".
user456584
77
Esta publicación debe mencionar que usted es el autor, ya que esta es una autopromoción límite (aunque no argumentaré que responde a la pregunta, no obstante, debe incluir un descargo de responsabilidad).
EntangledLoops
36

También hay clang_complete que usa el clangcompilador para proporcionar la finalización del código para proyectos de C ++. Hay otra pregunta con sugerencias de solución de problemas para este complemento.

El complemento parece funcionar bastante bien siempre que el proyecto se compile, pero es prohibitivamente lento para proyectos grandes (ya que intenta una compilación completa para generar la lista de etiquetas).

Konrad Rudolph
fuente
El clang_completecomplemento funciona bien en Cygwin y Windows. No puedo decir nada sobre grandes proyectos porque no tengo ninguno. :)
Lumi
Parece que clang_complete usando libclang tiene caché ahora. Esta debería ser la respuesta aceptada. ¿Has probado clang_complete en el kernel de Linux? la mejor indexación que he visto para kernel es usar Eclipse CDT, si clang_complete puede manejar kernel, debería ser capaz de completar cualquier cosa.
guioneso
clang_complete es simplemente el mejor complemento de Vim que uso.
Cromulent
1
@Cromulent Ah, mira YouCompleteMe, es mucho mejor.
Konrad Rudolph
@KonradRudolph Gracias. Lo comprobaré.
Cromulent
6

Acabo de encontrar el proyecto Eclim vinculado en otra pregunta . Esto parece bastante prometedor, al menos para la integración de Java.

Konrad Rudolph
fuente
¿Lo has probado? Parece interesante.
Pacane
@Pacane: no. No he tenido que usar Java en meses y no tuve tiempo libre para experimentar.
Konrad Rudolph el
1
Eclim parece ser una gran solución para Java, aunque Eclipse sigue siendo una bestia para cargar incluso en una configuración sin cabeza
Drupad Panchal
2
Para Java, puede usar Vrapper . Creo que generalmente está bien con una excelente autocompletado. Para la edición ocasional de texto pesado, puedo lanzar Vim real como herramienta externa.
kizzx2
2

es lo que buscas algo como intellisense?

insevim parece abordar el problema.

enlace a capturas de pantalla aquí

Ric Tokyo
fuente
2
Esto sería lo que estoy buscando, sí. Desafortunadamente, solo se ejecuta en Windows (estoy usando OS X). Además, la última actualización parece haberse realizado alrededor de 2003. :-(
Konrad Rudolph el
bueno, puedes obtener el código fuente :) si no es eso, lo único en lo que puedo pensar es en omnicompletion ... o echa un vistazo a esto: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop para cosas de .net al menos ..
Ric Tokyo
Ric, por favor proporciona tu comentario como dos respuestas separadas, son invaluables y me gustaría honrarlas correctamente. Dicho esto, MonoDevelop es inutilizable en OS X a partir de ahora, y actualmente estoy investigando OmniCppComplete.
Konrad Rudolph el
Jaja, esto es solo Windows! :( ¿Por qué deberías querer esto en Windows donde tienes VS ... Estoy buscando una solución en Linux.
Nils
Nils: no todos tienen acceso a Visual Studio, también muchas personas tienen habilidades vi que desean aplicar en el entorno de Windows. Había un puerto para Linux, pero actualmente está inactivo. En cualquier caso, ¿qué estás tratando de lograr? ¿estás seguro de que no solo necesitas las funciones predeterminadas de autocompletar? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo