Ich habe kürzlich eine Frage gestellt, in der ich erfahren habe, dass es :set
in vim modelines nicht möglich ist, etwas anderes als Parameter an vim modelines zu übergeben. Ich verstehe die Sicherheitsbedenken, frage mich aber, ob es keinen anderen Weg gibt, dies zu umgehen. Eine kürzlich zu SO gestellte Frage zum Einstellen großer Parametermengen zur Einhaltung eines Codierungsstandards brachte mich zum Nachdenken: Wäre es möglich, eine "Gruppe" von Dingen in meiner RC-Datei zu definieren, die von der Modeline aus ein- oder ausgeschaltet werden können?
Entschuldigen Sie den Pseudocode, aber gibt es eine Möglichkeit, eine Funktion zu erstellen, die von einem festgelegten Parameter ausgelöst wird?
set_function! codestyle()
if &1 == 'psr-2'
set ts=4
set sw=4
endfi
if &1 == 'drupal7'
set ts=2
set sw=2
iab D8 Drupal 8
endif
endset_function
Dies könnte dann durch eine Modeline wie z
# vim: codestyle=psr-2
Dies ähnelt in gewisser Weise dem Dateitypabgleich, ermöglicht jedoch manuelle Überschreibungen. Es würde auch die Umgebung auf andere vordefinierte Arten einrichten, um die Sicherheitsprobleme zu vermeiden, die entstehen, wenn eine Datei andere beliebige Befehle in vim ausführt, aber eine individuellere Umgebung ermöglicht. Gibt es eine Möglichkeit, dies zu tun?
set
; AFAIK, das ist in Vim nicht möglich ...Antworten:
Sie haben einige Möglichkeiten.
Erstens: Sie können Ihre eigene Art von Modeline-Decoder schreiben, dh ein Plugin. Dies ist eine sehr ähnliche Antwort wie die, die ich auf Ihre andere Frage gegeben habe.
In der Tat können wir keine neuen vim-Optionen hinzufügen (die mit festgelegt werden können
:set
), aber wir können neue Variablen hinzufügen. Und wir können die Standardmodelle nicht verwenden, um mehr als nur vim-Optionen festzulegen.Zweite Möglichkeit: let-modeline könnte über die Rückruffunktion genutzt werden , um die eine oder andere Funktion aufzurufen. Sie könnten Ihre
CodeStyle()
Funktion in Ihrem.vimrc
oder einem (Autoload?) Plugin haben und dann Ihre Dateien enthalten:Aber wenn Ihr Bedarf so genau ist und Sie wirklich keine Plugins wie local_vimrc wollen , dann schreiben Sie Ihren eigenen modellartigen Decoder.
Die dritte und IMO-bessere Wahl in diesem Fall wäre, einen neuen Dateityp zu definieren und
'ft'
diesen Datentyp in Modellreihen mit folgenden Werten festzulegen :# vim: set ft=php.psr2
. Mitphp
dem weltweit üblichen Dateityp (da bin ich mir nicht sicher) undpsr2
dem speziellen Dateityp, der Ihren Codierungsstilen entspricht. Sie müssen zwei ftplugins definieren: ftplugin / psr2.vim und ftplugin / drupal7.vim, an die Sie Ihre Anrufe senden:setlocal
(und nicht:set
).quelle