plugin plugged plug minimalist manager junegunn instalar php vim autocomplete

php - plugged - vim plug in manager



Vim PHP omni completado (9)

En C ++, ejecuto lo siguiente para obtener una mejor sensibilidad de contexto:

ctags ''--c++-kinds=+p'' ''--fields=+iaS'' ''--extra=+q''

No es perfecto, pero después de ctags agrega la información adicional al archivo de etiquetas como se especifica en el comando anterior vim maneja mejor la finalización.

Estoy tratando de obtener autocompletado de PHP en Vim. Ahora mismo cuando hago un $blog = new Blog(); $blog-> $blog = new Blog(); $blog-> y luego presione CTRL+X CTRL+O Espero que omnicompletion devuelva todas las funciones en la clase Blog .

En cambio, devuelve todas las funciones para todo el proyecto. He creado ctags para mi proyecto de la siguiente manera: ctags -R *

¿Hay alguna forma de hacer que el autocompletado tenga en cuenta el contexto?



Lo siguiente funciona mejor Tomado de http://weierophinney.net/matthew/archives/134-exuberant-ctags-with-PHP-in-Vim.html

ctags / -f ~/.vim/tags / -h ".php" -R / --exclude="/.svn" / --totals=yes / --tag-relative=yes / --PHP-kinds=+ivcf / --regex-PHP=''/(abstract)?/s+class/s+([^ ]+)//2/c/'' / --regex-PHP=''/(static|abstract|public|protected|private)/s+function/s+(/&/s+)?([^ (]+)//3/f/'' / --regex-PHP=''/interface/s+([^ ]+)//1/i/'' / --regex-PHP=''//$([a-zA-Z_][a-zA-Z0-9_]*)//1/v/'' /

Incluso con lo anterior, parece haber algunos problemas. por ejemplo, phpcomplete no parece ser compatible con los métodos de instancia vars.

$this->objA = new SomeClass(); $this->objA-><do_autocomplete> #fails

Sin embargo,

$objA = new SomeClass(); $objA-><do_autocomplete> #works

Después de intentar obtener phpcomplete trabajando durante las últimas horas, mi consejo para cualquiera que también lo intente es DETENERSE. No funciona bien y no vale la pena.


Omnicompletion solo funcionará si el archivo de etiqueta contiene tanto la definición de clase como la declaración de variable.

Solución directa

En general, eso significa que deberá guardar y (re) generar el archivo de etiquetas después de la class Blog { ... } y $blog = new Blog(); partes, pero antes de intentar $blog-> <CX><CO> . Esto se debe a que la función PHP omni-complete buscará la declaración de clase de la variable $blog en el archivo de etiquetas.

(Por cierto, si ha abierto el archivo de etiquetas en un búfer, vuelva a cargarlo después de regenerarlo).

Alternativa

La documentación de vim ( :help ft-php-omni ) también define una forma que no requiere que la variable se indexe en el archivo de etiquetas, sino que utiliza un comentario específico en la línea anterior:

/* @var $myVar myClass */ $myVar->

Sin embargo, la definición de clase todavía necesita estar en el archivo de etiqueta, y el comentario es necesario cada vez que quiera usar omni-completo. Así que teclear lejos en un nuevo archivo PHP todavía no te dará una buena omni-terminación :(

Solo un pensamiento

¿Tal vez sea posible generar sobre la marcha un archivo de etiquetas temporales (como el plugin de taglist) del búfer no guardado y permitir que omni-complete lo use también? Aunque no soy un gran hacker vim ...


Puedes usar un combo bastante poderoso:

Intenté muchas cosas: PHPComplete, Padawan, etc. Esto es lo mejor que pude encontrar.

En caso de que estés interesado, escribí también un artículo sobre cómo hacer un IDE de PHP con Vim .


tratar

curl -L -s https://git.io/ide | sh

luego reinicia tu nvim. Es posible que haya completado el código y vaya a las funciones de definición.

* Actualmente, solo está disponible para neovim


La respuesta de catchmeifyoutry señala una /* @var $myVar myClass */ al agregar un comentario como /* @var $myVar myClass */ inmediatamente antes de la línea en la que usa omnicompleto, sin embargo, esto es engorroso y por el tiempo que lleva escribir el comentario, puede también ha escrito el nombre de la función usted mismo.

Solución: phpComplete

Es un script de Vim: phpComplete

Aún necesitará un archivo de etiquetas generado para sus clases, pero puede usar omni completo dentro del archivo, como ese (modificado a partir de la descripción en la página del script);

Este parche permite la verificación en el archivo por lo que no necesita el comentario.

$blog = new Blog; ... $blog->Blah(); // <-- complete without comment

También permite el soporte para instancias singleton:

$instance = Class::getInstance(); $instance->completeMe(); // sweet completion