Vim PHP Omni-Vervollständigung

Lesezeit: 5 Minuten

Benutzer-Avatar
Karl

Ich versuche, die automatische Vervollständigung von PHP in Vim richtig zu machen. Gerade jetzt, wenn ich a mache $blog = new Blog(); $blog-> und dann schlagen CTRL+X CTRL+O Ich würde erwarten, dass Omnicompletion alle Funktionen in der Klasse zurückgibt Blog.

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

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

  • Ich habe mit Eclimd gearbeitet, was eine gute Alternative zu sein scheint, um die automatische Vervollständigung von Eclipse-PHP zu Vim hinzuzufügen. eclim.sourceforge.net/index.html

    – Karl

    4. August 2009 um 9:22 Uhr

  • Ich schaudere bei dem Gedanken, ein ganz anderes Stück Software und einen laufenden Daemon einzubringen, nur um etwas zum Funktionieren zu bringen, das bereits nativ als Vim-Skript verfügbar ist.

    – Jess Telford

    30. Juni 2011 um 2:15 Uhr

Benutzer-Avatar
Jess Telford

Die Antwort von catchmeifyoutry weist auf eine Problemumgehung hin, indem ein Kommentar wie hinzugefügt wird /* @var $myVar myClass */ unmittelbar vor der Zeile, in der Sie omnicomplete verwenden, dies ist jedoch umständlich und für die Zeit, die zum Schreiben des Kommentars benötigt wird, können Sie den Funktionsnamen genauso gut selbst geschrieben haben.

Lösung: phpComplete

Es ist ein Vim-Skript: phpComplete

Sie benötigen immer noch eine für Ihre Klassen generierte Tag-Datei, aber Sie können dann omni complete in der Datei verwenden, wie so (geändert von der Beschreibung auf der Seite des Skripts);

Dieser Patch ermöglicht die Überprü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-Instanziierungen:

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

  • Ich verstehe es nicht. Ich verwende ctags und phpcomplete und erhalte immer noch zig Millionen Optionen, wenn ich die Codevervollständigung verwende.

    – Wirbel147

    12. Oktober 2012 um 19:45 Uhr

  • Leider ist die Omnicompletion-Unterstützung im Allgemeinen in Vim einfach schlecht, insbesondere für interpretierte Sprachen wie PHP. Am besten verbessern Sie den Support selbst, entweder durch Programmieren oder durch Sensibilisierung.

    – Quinn Strahl

    9. April 2013 um 16:13 Uhr

" 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)

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

Einfache Lösung

Im Allgemeinen bedeutet dies, dass Sie müssen die Tags speichern und (neu) generieren Datei nach das class Blog { ... } und $blog = new Blog(); Teile, aber Vor versuchen $blog-> <C-X><C-O>. Dies liegt daran, dass die PHP-Omni-Complete-Funktion nach der Klassendeklaration von sucht $blog Variable in der Tags-Datei.

(Übrigens, wenn Sie die Tags-Datei in einem Puffer geöffnet haben, laden Sie sie neu, nachdem Sie sie neu generiert haben.)

Alternative

Die vim-Dokumentation (:help ft-php-omni) definiert auch einen Weg, bei dem die Variable nicht in der Tags-Datei indexiert werden muss, sondern stattdessen ein spezifischer Kommentar in der vorangehenden Zeile verwendet wird:

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

Allerdings ist die Klassendefinition immer noch tut müssen 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 generieren und Omni-Complete zu erlauben, sie auch zu verwenden? Ich bin aber kein großer Vim-Hacker …

  • Das easytags-Plugin (github.com/xolox/vim-easytags) hilft dabei: Es erlaubt eine zusätzliche Tag-Datei und kann sie lokal aus der aktuellen Datei aktualisieren.

    – blauäugig

    11. September 2012 um 12:35 Uhr

Dieser funktioniert wie erwartet:

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

Mir fehlen nur die Funktionsparameter im pveview!

Folgendes funktioniert besser. Genommen von http://weierohinney.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/' \

Auch mit den oben genannten scheint es einige Probleme zu geben. zB scheint phpcomplete keine Methoden von Instanzvariablen zu unterstützen.

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

Jedoch,

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

Nachdem ich in den letzten Stunden versucht habe, phpcomplete zum Laufen zu bringen, rate ich jedem, der es auch versucht, STOPPEN. Es funktioniert nicht gut und ist die Mühe nicht wert.

  • Das liegt lediglich daran, dass die ctags-Unterstützung für PHP sehr begrenzt ist. Es gibt einen ctags-Fork für PHP github.com/b4n/ctags/tree/better-php-parser

    – Antoine ‘hashar’ Musso

    17. Januar 2014 um 12:56 Uhr

Benutzer-Avatar
Kaleb Pederson

In C++ führe ich Folgendes aus, um eine bessere Kontextsensitivität zu erhalten:

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

Es ist nicht perfekt, aber nachdem ctags die zusätzlichen Informationen zur Tags-Datei hinzugefügt hat, wie durch den obigen Befehl angegeben, handhabt vim die Vervollständigung besser.

  • Das liegt lediglich daran, dass die ctags-Unterstützung für PHP sehr begrenzt ist. Es gibt einen ctags-Fork für PHP github.com/b4n/ctags/tree/better-php-parser

    – Antoine ‘hashar’ Musso

    17. Januar 2014 um 12:56 Uhr

Benutzer-Avatar
Matthias

Sie können eine ziemlich mächtige Combo verwenden:

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

Falls Sie interessiert sind, habe ich auch einen Artikel geschrieben, wie man a macht PHP-IDE mit Vim.

  • schöner Artikel Mattieu, ich bin auch verliebt in Phpactor

    – javier_domenech

    3. Oktober 2018 um 14:34 Uhr

1185750cookie-checkVim PHP Omni-Vervollständigung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy