2014-03-28 11 views
6

In Vimscript kann der Skriptbereich s: verwendet werden, um Namenskonflikte zwischen Plugins zu vermeiden. Ich schreibe ein Vim-Plugin in Lua, und mir ist aufgefallen, dass Vim seinen gesamten Lua-Code in einem gemeinsamen Umfang ausführt. Das bedeutet, dass die Lua-Funktionen meines Plugins für jedes andere Plugin mit Lua sichtbar sind, und es scheint, als würde ein Namenskonflikt bevorstehen.Wie Vim Plugin-Code in Lua/Python/Ruby geschrieben kapseln?

Obwohl mein Beispiel Lua betrifft, gilt diese Frage auch bei der Entwicklung von Vim-Plugins in Python oder Ruby. Ich könnte einfach alle meine Lua-Funktionen mit dem Plug-in-Namen versehen, aber gibt es mehr eine zuverlässige/standardmäßige Möglichkeit, Vim-Plugin-Code zu kapseln, wenn Sie diese Sprachen verwenden?

+0

Ich weiß nichts über vib, aber wenn Ihr Plugin lua Chunk getrennt ist, dann können Sie einfach lokale Funktion/Variable verwenden oder separate Umgebung verwenden. – moteus

+0

Das ist eine bessere Lösung, als dem Namen des Plugins zumindest den Vorzug zu geben. –

Antwort

1

Ich habe nicht viel Erfahrung mit Lua, aber für Python Dinge sind auch ähnlich, vor allem, wenn Sie 'pyfile' verwenden (Luafile ist wahrscheinlich sehr ähnlich). Je besser, empfohlene Vorgehensweise, vor allem für Python würde wie folgt aussehen:

if !exists('g:audiobox_py_loaded') 
    python import sys, vim 
    python if vim.eval('expand("<sfile>:p:h")') not in sys.path: 
     \ sys.path.append(vim.eval('expand("<sfile>:p:h")')) 
    python import audiobox 
endif 

Auf diese Weise, auch wenn Sie Top-Level-Funktionen in der Datei audiobox.py haben, werden sie in einer Art und Weise zu ‚Audiobox‘ Namensraum erhalten und damit kann jetzt über die Audiobox zugegriffen werden. Ich bin sicher, dass ähnliche Idiome auch für Lua verfügbar sein sollten. Für mein Plugin AudioBox, das ich in meiner Freizeit nur gebaut habe, um zu lernen, wie ich mit Python interagieren könnte, habe ich das auf die nächste Ebene gebracht und meine benötigte Funktionalität in eine Klasse eingepackt und ein Objekt des Gleiches über eine setup() - Methode. Sie können sich den Code ansehen, um eine bessere Idee zu erhalten.

HINWEIS: Ich bin kein Python-Experte auf irgendeine Weise also nicht meinen Code beurteilen, das war eher ein Hobby-Projekt :).