Code Completion in VIM?

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich versuche gerade vim (genauer VIM) eine Code-Completion für Django zu entlocken. Es will mir allerdings nicht gelingen. Weiß jemand, ob und wie das geht?

Bei "import re; re." und ^X^O geht's, aber wenn ich "import django; django." versuche, geht's nicht mehr. In "python" funktioniert der Import. Ich habe gesehen, dass MacVim offenbar ein Python 2.3 enthält und das wahrscheinlich auf ein anderes site-packages als das normale Python 2.5.1 verweist. Doch kann das ein Problem sein? Ich will doch meinen Code nicht mit dem in vim eingebauten Python ausführen... was, wenn da ein sys.exit() o.ä. drin steht? Ich hätte vermutet, dort wird mein normales Python benutzt. Ich verstehe allerdings nicht wirklich, wie pythoncomplete.vim funktioniert.

Stefan

PS: Aktivieren kann man's mit ":set omnifunc=pythoncomplete#Complete"
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hast du denn mal ctags auf deine Django-Installation angewendet?

Persönlich nutze ich solche umfassende Autocompletion gar nicht, d.h. also nur die Completion in den aktuell geöffneten Dateien.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Nö, kein ctags - muss ich das? Beim "re"-Modul geht's doch auch so. Aber "xml.etree" wiederum geht nicht. Irgendwie ist diese OmniCompletion recht simpel gestricht und ziemlich unbrauchbar. Vielleicht ist vim als Python-IDE doch keine so gute Idee ;)

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sma hat geschrieben:Nö, kein ctags - muss ich das? Beim "re"-Modul geht's doch auch so. Aber "xml.etree" wiederum geht nicht. Irgendwie ist diese OmniCompletion recht simpel gestricht und ziemlich unbrauchbar. Vielleicht ist vim als Python-IDE doch keine so gute Idee ;)
vim ist keine IDE und wird es auch nie sein, was auch mit der Grund ist warum ich es nutze. Die OmniCompletion funktioniert bei mir Ausreichend Gut(TM).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich hätte nicht IDE schreiben sollen, sondern einfach ein Editor, der mir das Schreiben von Python-Code einfacher macht. Ein Punkt ist da, mir zu zeigen, welche Attribute ein Modul hat - auch wenn das prinzipbedingt nur unzuverlässig funktionieren kann.

Beim Emacs (Aquamacs) habe ich es tatsächlich hinbekommen, auch in Django-Modulen zu komplettieren, nachdem ich in dem eingebetteten Python-Prozess, manuell den PATH auf mein Projekt und eine Shell-Variable auf 'settings' gesetzt hatte. Das ist eine Besonderheit von Django, dass man einige Module wie z.B. django.db.models nicht laden kann, wenn er keine settings.py findet. Dafür kann ich beim Aquamacs keine eckigen oder geschweiften Klammern eingeben und von der Zwischenablage des Betriebssystems hat er auch noch nie etwas gehört. Wie unglaublich schlecht ist das denn?

Bei (Mac)Vim müsste ich wohl auch irgendwie den Pfad und die Umgebungsvariable beeinflussen, habe das da aber nicht geschafft, weil ich den Editor nicht aus einer Shell heraus starte und nicht an den eingebetteten Python-Prozess herankomme.

Inzwischen habe ich auch gefunden, wie Vim es macht: Er hat einen eigenen vereinfachten Python-Parser, der auf dem tokenize-Modul aufbaut und der u.U. alle import-Anweisungen findet. Aus diesen baut er (recht ineffizient) ein kleines Programm, welches dann der interne Python-Prozess mit `exec` ausführt. Dabei auftretende Fehler werden verschluckt.

Das Problem, was ich sehe ist, dass a) eine viel zu alte Python-Version benutzt wird und b) eben die Shell-Variable für settings.py fehlt. Grummel. Mit ":py showdbg()" kann man sich anzeigen lassen, was die Completion für Debug-Ausgaben gemacht hat, wo auch die Exception drin steht. Bei mir ist das natürlich ein "ImportError".

Kann ich aus einem Python 2.3 ein Python 2.5 aufrufen? Müsste doch eigentlich gehen... mal probieren...

Stefan
Antworten