Ist es möglich, benutzerdefinierte "Set" -Befehle in meiner RC-Datei zu erstellen und diese von einer Modeline aus aufzurufen?

10

Ich habe kürzlich eine Frage gestellt, in der ich erfahren habe, dass es :setin 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?

Caleb
quelle
Dies würde die Definition Ihrer eigenen Option für erfordern set; AFAIK, das ist in Vim nicht möglich ...
Martin Tournoij
@Carpetsmoker Bedeutet das, dass die Antwort auf diese Frage lautet, dass Vimscript integrierte Funktionen nicht umschließen oder auf andere Weise erweitern kann?
Caleb

Antworten:

10

Sie haben einige Möglichkeiten.

  1. 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.

  2. 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 .vimrcoder einem (Autoload?) Plugin haben und dann Ihre Dateien enthalten:

    # VIM: let b:codestyle='psr-2' b:ModeLine_CallBack='CodeStyle'
    

    Aber wenn Ihr Bedarf so genau ist und Sie wirklich keine Plugins wie local_vimrc wollen , dann schreiben Sie Ihren eigenen modellartigen Decoder.

  3. 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. Mit phpdem weltweit üblichen Dateityp (da bin ich mir nicht sicher) und psr2dem 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).

Luc Hermitte
quelle
6
Upvoted für Option 3. Ich denke, dies ist der semantisch angemessenste und Vim-geeignetste Ansatz.
Tommcdo