sublimerepl getenv scheitert

7

Ich möchte das SiblimeREPL-Paket mit Sublime Text verwenden. Wenn ich versuche, eine REPL zu starten, bekomme ich

%Vor%

Dies geschieht unabhängig davon, welche REPL ich versuche zu starten. (Ich habe versucht, Ruby, Python und Clojure.) Ich versuchte Sublime Text 2 und Sublime Text 3 mit den gleichen Ergebnissen. Dies ist unter Mac OS X, wenn das wichtig ist.

Ich habe in den Paketeinstellungen nachgesehen, wo ich

sehe %Vor%

Wenn ich an einer Terminal-Eingabeaufforderung "/ bin / bash --login -c env" ausführen, wird meine Umgebung aufgelistet.

Was muss ich ändern, um einen erfolgreichen getenv_command zu erhalten?

    
Kevin Kleinfelter 11.11.2015, 02:39
quelle

7 Antworten

15

Ich hatte das gleiche Problem wie Ssgam. Die Problemlinie für mich ist in der getenv Methode. Es ruft subprocess.check_output (getenv_command) auf, was in Python 2.6, das ST2 zu verwenden scheint, nicht existiert.

Der Trick ist, dass nur subprocess.check_output () aufgerufen wird, wenn getenv_command truthy ist, und andernfalls os.environ.copy (). Um das Problem zu beheben, ohne das SublimeREPL-Paket zu ändern, klicken Sie in Einstellungen & gt; Paketeinstellungen & gt; SublimeREPL & gt; Einstellungen - Benutzer , machen Sie etwas wie folgt:

%Vor%     
Vectorjohn 01.12.2015 06:48
quelle
6

Ich habe dieses Problem ein wenig genauer untersucht und es scheint, dass SublimeText 3 ebenfalls betroffen ist. In meinem Fall hängt das Problem mit der bash-Vervollständigungsfunktion zusammen, insbesondere mit der Umgebungsvariablen COMP_WORDBREAKS.

Verwenden Sie den folgenden Befehl, um den Inhalt von COMP_WORDBREAKS anzuzeigen:

%Vor%

gibt

aus %Vor%

Sie können auch verwenden:

%Vor%

Beachten Sie jedoch, dass Sie das mit dem zweiten Befehl (ohne Anführungszeichen) nicht sehen werden Die Variable enthält außerdem ein Zeilenvorschubzeichen.

Das Problem hier ist das Zeilenvorschubzeichen, das das Ausgabe-Parsing in der Funktion getenv_command unterbricht. Wenn Sie einen Teil des Quellcodes für SublimeREPL extrahieren, können Sie eine echte Fehlermeldung vom Python-Interpreter erhalten.

%Vor%

Sie können Element # 6 mit der Position von COMP_WORDBREAKS in env-Auflistung abgleichen.

Lösung (zuerst kam mir das in den Sinn)

Ich kann im Moment nicht sagen, welche Auswirkungen die Bash-Completion-Funktion wirklich hat, nachdem die folgende Lösung angewendet wurde, und natürlich sollte SublimeREPL hoffentlich entsprechend korrigiert werden. Bitte kommentiere meine Antwort, um fehlendes Wissen auszufüllen.

Wir möchten vielleicht störende Zeichen entfernen, um den Fehler loszuwerden. Zuerst identifizieren wir diese Zeichen

%Vor%

gibt

aus %Vor%

Also haben wir drei zu entfernen. Der einfachste Weg besteht darin, zu Ihrer .bashrc folgenden Zeile hinzuzufügen:

%Vor%

Voila! Keine Fehlermeldung mehr.

Mein letzter Gedanke betrifft entfernte Charaktere. Ich bin nicht vollständig darüber, wie bash-completion funktioniert, und mir ist bewusst, dass das Ändern von COMP_WORDBREAKS sich auf andere Skripte auswirken kann, die es verwenden. Vorläufig können Sie es immer ad-hoc ändern.

Ich hoffe, das hat geholfen.

Prost

    
develucas 11.11.2015 13:11
quelle
3

Es gefunden. Behoben. SublimeREPL geht davon aus, dass das Ausführen von getenv_command SOLELY die Ausgabe von running env erzeugt und jede Zeile ein Gleichheitszeichen enthält. Aber mein .bash_profile echos einige Sachen zu Standout.

Die Lösung bestand darin, meine .bash_profile-Ausgabe in ein

umzubrechen %Vor%

erzeugt neben dem ausgeführten Befehl keine zusätzliche Ausgabe.

    
Kevin Kleinfelter 11.11.2015 03:12
quelle
2

TLDR;

Ersetzen:

%Vor%

in ~/.config/sublime-text-3/Packages/SublimeREPL/repls/subprocess_repl.py mit

%Vor%

(Danke @MichaelOhlrogge für die kürzere Syntax)

Warum das funktioniert

@ develucas 'Lösung hat mir geholfen, mein Problem zu lösen. Ich hatte nicht das Problem, das er beschrieb, aber seine Untersuchung half.

In meinem Fall hatte die Login-Shell eine Begrüßung. Also, bash --login -c env (der Befehl, der in SublimeREPL.sublime-settings file unter der Option getenv_command angegeben wurde) druckte etwas wie folgt:

%Vor%

Es stellt sich heraus, dass SublimeREPL die Ausgabe dieses Befehls verwendet, um die Umgebungsvariablen zu laden - wie im obigen Kommentar erwähnt, die Einstellung getenv_command :

%Vor%

Der Code, der diese Ausgabe parst, ist wie folgt (in der Datei ~/.config/sublime-text-3/Packages/SublimeREPL/repls/subprocess_repl.py für ST3):

%Vor%

Die Zeile env = dict(line.split('=', 1) for line in lines) verursacht ein Problem, weil die erste Zeile in der Ausgabe bash --login -c env keine = hat. Also habe ich diese Zeile geändert, um die Zeilen zu ignorieren, die kein = -Zeichen haben:

env = dict(line.split('=', 1) for line in lines if '=' in line)

Und das hat das Problem für mich gelöst. Vergessen Sie nicht, Subtle Text nach dem Ändern dieser Datei neu zu starten.

    
Parth Thakkar 26.06.2016 09:13
quelle
1

das Ändern von COMP_WORDBREAKS funktioniert nicht für mich ... Ich verwende ST2, und die Ausnahme wurde bei check_output () ausgelöst.

schlägt auch Namenskomplettierungen in der Befehlszeile fehl, nachdem COMP_WORDBREAKS geändert wurde.

In meinem Fall habe ich die Methode env () von subprocess_repl.py geändert:

%Vor%

wäre interessant herauszufinden, warum das Problem plötzlich auftrat ...

hth, Prost,

sam

    
ssgam 17.11.2015 10:17
quelle
1

Die Antwort von @develucas funktioniert meistens bei ST3 mit OSX El Capitan, außer dass ich

setzen musste

export COMP_WORDBREAKS="${COMP_WORDBREAKS#???}"

Beachten Sie den Export. Wenn ich dies tue, funktioniert Tab-Completion jedoch nicht mehr.

    
gniquil 02.12.2015 00:32
quelle
1

Ich hatte das gleiche Problem, es war meine .bash_profile , die einige Utility-Ausgaben hatte, wie eine Begrüßungsnachricht usw.

Diese Ausgaben werden von SublimeREPL analysiert, um zu versuchen, Umgebungsvariablen aus der Ausgabe des Befehls env zu extrahieren, und die fremden Textlinien, die zusammengemischt wurden, provozierten den Fehler.

(Ich möchte einen PR zu SublimeREPL machen, um zu versuchen, diese Phase robuster zu machen, sie sollte nicht von bestimmten .bash_profile Implementierungen abhängen!)

    
caesarsol 15.03.2016 14:19
quelle