it-swarm.com.de

Vim PHP Omni Fertigstellung

Ich versuche, PHP in Vim automatisch zu vervollständigen. Wenn ich jetzt eine $blog = new Blog(); $blog-> mache und dann CTRL+X CTRL+O drücke, würde ich erwarten, dass omnicompletion alle Funktionen in der Klasse Blog zurückgibt. 

Stattdessen werden alle Funktionen für das gesamte Projekt zurückgegeben. Ich habe ctags für mein Projekt so gebaut: ctags -R *

Gibt es eine Möglichkeit, die Autovervollständigung kontextsensitiv zu gestalten?

33
Karl

catchmeifyoutry's answer weist auf eine Problemumgehung hin, indem Sie einen Kommentar wie /* @var $myVar myClass */ unmittelbar vor der Zeile, in der Sie omnicomplete verwenden, hinzufügen. Dies ist jedoch umständlich und für die Zeit, die Sie zum Schreiben des Kommentars benötigen, haben Sie möglicherweise auch geschrieben die Funktion nennen Sie sich.

Lösung: phpComplete

Es ist ein Vim-Skript: phpComplete

Sie benötigen immer noch eine Tag-Datei, die für Ihre Klassen generiert wurde. Sie können dann omni complete innerhalb der Datei verwenden (wie in der Beschreibung auf der Seite des Skripts geändert).

Dieser Patch ermöglicht die Prüfung in der Datei, sodass Sie den Kommentar nicht benötigen. 

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

Es ermöglicht auch die Unterstützung von Singleton-Instantiierungen: 

$instance = Class::getInstance(); 
$instance->completeMe(); // sweet completion
17
Jess Telford
" Assuming Vim 7 (full version) is installed,
"   adding the following to your ~/.vimrc should work.

filetype plugin on
au FileType php set omnifunc=phpcomplete#CompletePHP

" You might also find this useful
" PHP Generated Code Highlights (HTML & SQL)                                              

let php_sql_query=1                                                                                        
let php_htmlInStrings=1

" Hope this helps!

(über http://www.linuxquestions.org/questions/linux-software-2/vim-omin-completion-for-php-621940/#post3155311 )

9
ax.

Omnicompletion funktioniert nur, wenn die Tag-Datei sowohl die Klassendefinition als auch und die Variablendeklaration enthält. 

Einfache Lösung

Im Allgemeinen bedeutet dies, dass Sie speichern und (neu) die Tags file nach den class Blog { ... }- und $blog = new Blog();-Teilen erzeugen müssen, aber vor versucht, $blog-><C-X><C-O>. Dies ist weil die omni-complete-Funktion PHP nach der Klassendeklaration der Variable $blog in der Tag-Datei sucht.

(Übrigens, wenn Sie die Tags-Datei in einem Puffer geöffnet haben, laden Sie sie nach dem erneuten Generieren neu.)

Alternative

Die vim-Dokumentation (:help ft-php-omni) definiert auch eine Methode, bei der die Variable nicht in der Tag-Datei indiziert werden muss, sondern stattdessen einen bestimmten Kommentar in der vorhergehenden Zeile verwendet:

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

Die Klassendefinition do muss jedoch in der Tag-Datei enthalten sein und der Kommentar wird jedes Mal benötigt, wenn Sie omni-complete verwenden möchten. Wenn Sie also eine neue PHP -Datei eingeben, erhalten Sie immer noch keine schöne omni-Vervollständigung :(

Nur ein Gedanke

Vielleicht ist es möglich, eine temporäre Tag-Datei (wie das Taglist-Plugin) nur aus dem nicht gespeicherten Puffer zu erstellen und omni-complete die Verwendung dieser Option zu erlauben. Ich bin zwar kein großartiger Hacker ...

7
catchmeifyoutry

Dieser arbeitet wie erwartet:

https://github.com/shawncplus/phpcomplete.vim

Ich vermisse gerade die Funktionsparameter im pveview!

5
Andi

Folgendes funktioniert besser. Aus 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/' \

Trotz der oben genannten Probleme scheint es einige Probleme zu geben. z.B. phpcomplete scheint keine Methoden von Instanzvars zu unterstützen. 

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

Jedoch, 

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

Nachdem ich versucht habe, in den letzten Stunden phpcomplete arbeiten zu lassen, ist mein Rat an alle, die es auch versuchen, aufzuhören. Es funktioniert nicht gut und ist die Mühe nicht wert.

3
Thanh Nguyen

Sie können eine ziemlich starke Kombination verwenden:

Ich habe viel probiert: PHPComplete, Padawan und so weiter. Das ist das Beste, was ich finden konnte.

Für den Fall, dass Sie interessiert sind, habe ich auch einen Artikel geschrieben, wie man ein PHP IDE mit Vim ausführt.

1
Matthieu

In C++ führe ich Folgendes aus, um die Kontextsensitivität zu verbessern:

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

Es ist nicht perfekt, aber nachdem ctags die Zusatzinformationen zur Tags-Datei hinzugefügt hat, wie im obigen Befehl angegeben, wird die Fertigstellung durch vim besser erledigt.

1
Kaleb Pederson

versuchen

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

starten Sie dann Ihren nvim neu. Möglicherweise erhalten Sie Code-Vervollständigung und weitere Definitionsfunktionen.

* Derzeit nur für Neovim verfügbar

0
Xiaohui Lam

Ich habe ein vim Plugin für meinen padawan.php Abschlussserver erstellt. Checkout dieses Video um zu sehen, wie es funktioniert.

0
Aleh Kashnikau