¿Hay algún complemento de autocompletado para vim?

11

¿Existe un complemento de autocompletado para vim? ¿Cuáles son mis opciones aquí?

En este momento estoy usando AutoComplPop , pero tiene una mala integración con snipMate que uso y muy lenta en archivos Ruby (incluso <100 líneas).

He visto un par de otros complementos, pero están muertos desde hace al menos más de un año. Entonces, ¿alguna idea?

naquad
fuente
1
ACP funciona muy bien aquí y no tengo ningún problema con SnipMate. Hay una configuración ( let g:acp_behaviorSnipmateLength=-1ver :help autocomplpop) que se supone que debes agregar a tu .vimrc, ¿la agregaste?
romainl

Respuestas:

15

Esta es una vieja pregunta, pero sigo volviendo a ella de vez en cuando con un destello de esperanza que se desvanece, pensando que algún día encontraré la combinación correcta de complementos para darme un autocompletado perfecto en Vim. La búsqueda continúa, pero esta es toda la investigación que he realizado en el transcurso de varios años.

Antes que nada, debes entender que Vim es un editor de texto, no un editor de código. Los editores de código, IDES, son herramientas como el conjunto de herramientas Jetbrains, Visual Studio Code, Eclipse, etc.

Vim fundamentalmente no puede "autocompletar" el código con precisión. El autocompletado requiere la introspección de su código fuente y analizar el AST. Tenga en cuenta que Vim no pudo realizar operaciones asincrónicas hasta que se lanzó Vim 8 en 2016, por lo que tratar de ejecutar cualquier tipo de software de introspección de código en un complemento de Vim sería una pesadilla. Está integrado en la historia del ecosistema de Vim para no hacer esto. Y todos los que intentan hacer esto, como Tern For Vim, son realmente pesadillas para usar.

Lo mejor que puede hacer un editor de texto es fragmentos y completar las mismas palabras / líneas / etc. Si está buscando autocompletar código, debe usar un editor de código, no un editor de texto.

Estas son sus opciones, de las cuales he probado todas:

  • Dos atajos de teclado útiles son Ctrl- n, que autocompletar una palabra basándose únicamente en las memorias intermedias de corriente que tiene abiertas (sin código de la introspección), y Ctrl- xCtrl- lque autocompletar una línea completa de código si desea duplicar uno. Probablemente sepa Ctrl- xCtrl- f, que completará automáticamente un nombre de archivo, incluida la ruta, en relación con el actual :pwd. El complemento de patrón completo puede ser ligeramente útil si no busca con /\v.

  • Construido en Vim " Omnicompletion " activado por Ctrl- x, Ctrl- o(eso es lo que los autores de Vim quieren que escriba siempre) junto con un montón de complementos específicos de idioma , si existen. Puede :echo &omnifuncen un archivo para ver si ya tiene Vimompletion configurado por Vim en su archivo de elección.

  • AutoComplPop para abrir automáticamente el menú Omnicompletion anterior al escribir.

  • SuperTab, que le permite presionar Tabpara activar la finalización integrada de Vim.

  • NeoComplCache, que es la finalización de palabras clave (no se especifica cómo se diferencia de la finalización integrada de Vim), una .vimrcconfiguración compleja y NeoSnippet para la finalización del fragmento.

  • Una combinación monstruosa de exuberant-ctagsy DoctorJS(un proyecto de Mozilla que ha estado muerto durante un año), TagBar y una cosita de cosecha propia para extraer la finalización de los archivos de etiquetas.

  • SnipMate , un complemento básico de finalización de etiquetas, junto con fragmentos , y descubra por su cuenta cómo agregar fragmentos, ya que es un poco complicado.

  • UltiSnips junto con UltiSnips-Snippets que son diferentes a los fragmentos anteriores.

  • Tern para Vim , una biblioteca prometedora que realiza una introspección de código real para obtener el autocompletado correcto. Sin embargo, es defectuoso, muy lento, tiene pérdidas de memoria que bloquean a Vim, y posiblemente es abandonware.

  • YouCompleteMe , una finalización difusa a medida que escribe que ejecuta un servidor en segundo plano, junto con una función interna para la finalización de fragmentos.

  • Eclim : un noble intento de ejecutar un servidor Eclipse en segundo plano y decirle a Vim los autocompletados que introspectivamente sobre la marcha. Funciona tan bien como Tern.

  • Por último, Closetag o delimitMate o autoclose o un bananagram-cosecha propia para el cierre automático de las etiquetas y el paréntesis automáticamente en escribir.

Casi todos los complementos de esta lista entrarán en conflicto con casi todos los demás complementos de esta lista.

YouCompleteMe parece ser el líder del paquete, pero nunca he podido hacer que funcione correctamente con la finalización de la etiqueta, y su finalización de introspección de código aún no ha demostrado ser potente.

Mi opinión personal es que el estado actual del mundo de autocompletado de Vim está en mal estado. Para proyectos pequeños, puede estar bien usando una de las soluciones anteriores. Si se trata de una API simple que puede tener principalmente en su cabeza, la finalización de la introspección sin código probablemente estará bien. Si está lidiando con un proyecto grande, o necesita el beneficio de la seguridad de tipos mientras programa, un IDE completo ( Eclipse , Visual Studio , WebStorm ) se adaptará a usted mucho mejor que Vim.

La desventaja de un IDE, por supuesto, es que ya no tendrás el poder de Vim en tus manos. No he usado un solo IDE que tenga un modo Vim aceptable.

Vim tiene un sesgo de lenguaje moderado hacia lenguajes tipo C sin tipo y, de lo contrario, espera que los usuarios agreguen características específicas del lenguaje como complementos. Desafortunadamente, esto ha llevado a un ecosistema de autocompletado fragmentado. Algunas opciones son decentes, pero nada es perfecto, y rara vez hay un líder mayoritario / mejor práctica.

Andy Ray
fuente
6

Aquí hay uno agradable: YouCompleteMe

YouCompleteMe que hace que el menú desplegable aparezca automáticamente mientras escribe, y admite la selección difusa, por lo que si tiene un identificador llamado partition_findery escribe algo como ptfmientras edita un archivo C ++, la lista de sugerencias desplegable incluirá ambos printfy partition_finderporque contienen las mismas letras en el mismo orden. Si tiene una variable llamada myBrain, puede escribir brny le sugerirá eso. YouCompleteMe también prioriza las sugerencias basadas en la frecuencia de uso anterior.

trusktr
fuente
2

Uso neocomplcache con los fragmentos snipmate + snipmate

let g:neocomplcache_snippets_dir='~/.vim/bundle/snipmate-snippets/snippets'

puedes ver mi vimrc

Juan Pablo
fuente
2

Estoy probando necomplecache con neosnippet. Supongo que tendrá una mejor integración ya que ambos son creados por la misma persona.

Forethinker
fuente
1

Creo que vim tiene uno incorporado llamado OmniComplete. En modo de inserción uso ctrl+x,ctrl+o.

De lo contrario, puede completar la palabra clave desde el modo insertar con ctrl+n. Cuando lo invoque, aparecerá un menú desplegable que muestra las posibles coincidencias de palabras encontradas en el archivo que está editando, así como también de otros archivos que haya abierto. Sigue presionando ctrl+npara recorrer las opciones. Cuando llegue a la palabra que desea, simplemente continúe escribiendo como de costumbre.

Si no puede encontrar la palabra que desea, ctrl+neventualmente saldrá de la lista y podrá seguir escribiendo, o puede presionar ESCy luego bcwir bal comienzo de la palabra ofensiva y ccolgar el word al que desea.

Conrad.Dean
fuente
El incorporado de Vim parece apestar. Cada vez que presiono <cx> <co> solo dice "Patrón no encontrado". Sin embargo, si presiono <cn>, las terminaciones aparecen en un menú desplegable justo debajo de la palabra que se está escribiendo. ¿Es eso lo mismo? ¿Hay alguna manera de hacer que el menú desplegable de autocompletar aparezca automáticamente, sin tener que presionar un atajo?
trusktr
No conozco un complemento que haga que el autocompletado aparezca sin interacción, lo siento :(. <c-x><c-o>Solo funciona para cosas que vim ha recibido instrucciones explícitas de soporte. Por defecto, creo que solo puede hacer un par de cosas menores, y otras cosas como completar CSS, pero si quieres algo como Eclipse, hay un par de complementos vim que intentan proporcionarte eso.
Conrad.Dean
1
Encontré un complemento para vim llamado YouCompleteMe que hace que el menú desplegable aparezca automáticamente a medida que escribe, y admite la selección difusa, por lo que si tengo un identificador llamado partition_findery escribo algo como ptfmientras edito un archivo C ++, el menú desplegable sugerirá tanto printfy partition_finderporque contienen las mismas letras en el mismo orden. Si tengo una variable llamada myBrain, puedo escribir brny aparecerá. YouCompleteMe también prioriza las sugerencias basadas en la frecuencia de uso anterior. Compruébalo aquí: valloric.github.io/YouCompleteMe
trusktr
1

Bifurqué un nuevo complemento SimpleAutoComplPop del AutoComplPop original. Sin embargo, no estoy familiarizado con ruby ​​o snipMate, puede intentarlo y me alegra recibir algunos comentarios :)

rox
fuente