Vimscript testen

480
So8res

Ich hacke auf ein Testframework für Vimscript (eine Übung in Vergeblichkeit, ich weiß; Humor mich). Einige vim-Plugins rufen Aufrufe an die Shell (mit der system()Funktion oder dem !Befehl). Ich möchte, dass der Testfahrer diese Anrufe abrufen und vorgebackene Daten zurückgeben kann.

Soweit ich das system()beurteilen kann, führt vim eine Abzweigung aus und führt den Befehl in einer Subshell aus. Theoretisch sollte es möglich sein, so etwas zu tun

alias ls="echo one\ntwo\nthree" 

So können wir einen Test nach den Regeln von haben:

:.!ls 

und prüfen, ob die Ausgabe ist

one two three 

In der Praxis scheint vim eine Subshell auszulagern, die keine temporären Aliase berücksichtigt. Mit anderen Worten, es erstellt eine neue, saubere Shell-Umgebung, die die Shell des Benutzers (zsh, bash oder was auch immer) verwendet, nicht jedoch die Shell-Einstellungen des Benutzers (global oder lokal).

Kennen Sie eine Möglichkeit, vim in einer Umgebung auszuführen, in der bestimmte Systemaufrufe vom Benutzer gesteuert werden?

1

1 Antwort auf die Frage

3
alexis

Nicht interaktive Shells durchlaufen nicht die gesamte Initialisierung einer interaktiven Shell. Weitere Informationen finden Sie im Abschnitt INVOCATION der bashManpage (oder der Shell, auf die Sie abzielen).

Auf der anderen Seite sucht bash nach einem Skript mit dem Namen $BASH_ENVund führt es aus, bevor eine nicht interaktive Shell gestartet wird. Verwenden Sie diese Option, um Ihre Umgebung für vim-Shell-Fluchten einzurichten. Befehlszeile Demonstration:

% bash -c 'alias' <no output> % export BASH_ENV=./special.aliases  % bash -c 'alias' this=that 

Aber Sie können tatsächlich viel besser als das: Setzen Sie die SHELLVariable vielleicht einfach auf ein Programm Ihrer Wahl /bin/echo, und vim ruft sie an, anstatt eine schwer kontrollierbare Shell zu starten. Dies funktioniert auch, wenn Ihr Befehl eine Pipeline oder andere Shell-Metazeichen enthält. Daher empfehle ich es dringend. (Sie erhalten die -cvim-Einsätze, wenn Sie die "Schale" fälschen, aber ich bin sicher, dass Sie damit umgehen können).

Genial. Eine Frage: Gibt es ein Zsh-Äquivalent? Es ist schwer zu wissen, in welcher Shell Vim es läuft, und ich weiß, dass ich nicht alle unterstützen kann, aber es wäre schön, alle großen Spieler zu treffen. So8res vor 11 Jahren 0
Sie müssen das im zsh-Handbuch selbst nachschlagen. Oder verwenden Sie die zweite Methode (definieren Sie $ SHELL neu). Die Shell, unter der vim läuft, ist irrelevant: Vim startet das, was $ SHELL ihm sagt. alexis vor 11 Jahren 0