2013-04-07 11 views
18

Ich habe vim in den letzten Jahren für die Bearbeitung von Konfigurationen und Skripten auf entfernten Servern verwendet. Vor ein paar Wochen habe ich beschlossen, den nächsten Schritt zu machen und zu versuchen, (Mac) vim als meinen regulären Editor neben Sublime Text 2 zu verwenden. Jetzt habe ich einen Punkt erreicht, an dem ich mein erstes Plugin erstellen möchte.Elegante Möglichkeit zu überprüfen, ob eine globale Plugin-Variable in einem vim-Plugin gesetzt ist

Mein Plugin definiert ~ 16 globale Variablen, die von einem Benutzer zugewiesen werden können, um bestimmte Eigenschaften des Plugins anzupassen. Ich fragte mich, was der eleganteste (vielleicht subjektive) Weg wäre, um zu überprüfen, ob ein Benutzer einer bestimmten Variablen bereits seinen eigenen Wert zugewiesen hat. Ich verschiedene andere Plugins und die „Muster“ Ich inspizierte scheint sehe bisher immer zu sein:

if !exists("g:pluginname_setting") 
    let g:pluginname_setting="default" 
endif 

Das scheint nach vorne einfach und direkt zu sein. Aber ich würde immer wieder dasselbe Stück Code wiederholen. Da vi (m) schon ziemlich lange existiert, bin ich mir ziemlich sicher, dass die Leute viele Möglichkeiten zum Schreiben von Plugins ausprobiert haben und es wurde eine Art "Best Practice" entwickelt, von der ich annehme, dass sie das "Muster" ist als Beispiel. Aber wäre es nicht eleganter, eine Funktion aufzurufen, um ein Wörterbuch zu füllen, das alle Plugin-Einstellungen enthält, und dann über das Wörterbuch zu iterieren, um die Schlüssel zu überprüfen, ob ein Benutzer seine persönlichen Präferenzen bereits definiert hat? Wäre das eine gute Idee oder sollte ich lieber einfach die Idee fallen lassen und mich an den ìf !exists() Ansatz halten?

Antwort

15

Die if exists(...) ist in der Tat die kanonische Konfiguration Idiom und der Weg zu gehen. Natürlich können Sie ein wenig Meta-Programmierung machen, um die Duplizierung zu reduzieren (so etwas wie function! s:SetDefault(varname, default)); Einige Plugins machen das.

Es ist gut, dass Sie beabsichtigen, ein hohes Maß an Anpassung zu ermöglichen, auf der anderen Seite, wenn Ihr Plugin ein sehr komplexes Problem behandelt (in einem Texteditor ?!), ist 16 Konfigurationsvariablen in der Tat am oberen Ende. Sie müssen den Aufwand in Betracht ziehen, all diese zu dokumentieren und die verschiedenen Kombinationen zu testen; Vielleicht ist es besser, zuerst mit einem einfacheren, reduzierten Ansatz zu beginnen und sich dann basierend auf dem Feedback der Benutzer zu entwickeln.

+0

Danke für Ihre Antwort. :) Das Plugin wird sich mit einigen Highlights beschäftigen. So sind 2/3 der verfügbaren Vars mit visuellen Appearance wie Farben, fg oder bg in verschiedenen Situationen verwandt. – Saucier

+0

Für Highlights ist der übliche Ansatz zu ': hi def pluginGroup guifg = ...' eine Standardhervorhebung; Dies kann dann in .vimrc überschrieben werden. –

+0

Auch wenn ich die Farben der bestehenden Hi-Gruppen überschreiben würde? – Saucier

24

Es ist eine elegante Weise:

let g:pluginname_setting = get(g:, 'pluginname_setting', "default") 

Ich bin überrascht, das nicht weit verbreitet in der Plugin-Einstellungen verwendet wird.

+0

Das liegt daran, dass das dritte Argument für die Funktion get() relativ spät hinzugefügt wurde. Um 7,3.etwas und viele Plugins sind viel älter –

+0

Das dachte ich zuerst, aber ich versuchte es mit einer vim Version 7.0 und es funktionierte. –

+0

Hm, sieht so aus als hättest du recht. Ich muss an einen anderen Patch als gedacht haben. –