2014-01-14 3 views
21

Wie erhalte ich Text von stdin in Sublimetext-Editor? Mit vim funktioniert es wie folgt aus:Wie pipe Eingabe in Sublimetext auf Linux?

echo "potato potato potato" | vim - 

Die gleiche Sache mit gedit arbeitet, um ein neues Dokument mit dem Inhalt zu erstellen.

Sublimetext scheint gerade mit der Bearbeitung einer Datei namens "-" in einem neuen Tab zu beginnen. Gibt es einen anderen Shell-Trick, der funktionieren könnte?

+0

Ich habe versucht, diese auf dem Mac: echo "hey" | Erhabene - habe ich eine neue Datei ‚subl stdin ICgUXZ.txt‘ mit dem Inhalt namens ‚hey‘. Scheint für mich zu arbeiten. – Siddhartha

+3

@Siddharta: Von http: // sublimentext.userecho.com/topic/87972-allow-editing-stdin-on-linux/: "Die 'subl' Kommandozeile unter OS X erlaubt das Editieren oder Anzeigen von stdin, aber der Kommandozeilenaufruf unter Linux scheint nur existierende Dateisystemdateien zu unterstützen. " –

+0

Bitte klären und markieren Sie das Betriebssystem, an dem Sie arbeiten - klingt wie Linux. – mklement0

Antwort

9

Ich weiß nicht, Sublime Text, aber Ihr Problem sollte generisch sein, dass es für jedes Programm gilt, die einen Dateinamen als Argument akzeptiert, weigert sich aber, von stdin zu lesen.

Zum Glück erlaubt Bash Ihnen, stdout aus einem Prozess in eine Art von temporären Datei pipe, dann übergeben Sie den Namen dieser Datei an einen anderen Prozess.

Von man bash:

Prozess Substitution auf Systeme unterstützt, Named Pipes (FIFOs) oder/dev/fd Methode des Benennens offene Dateien. Es hat die Form < (Liste) oder> (Liste). Die Prozessliste wird mit ihrem Eingang oder Ausgang ausgeführt, der mit einem FIFO oder einer Datei in/dev/fd verbunden ist. Der Name dieser Datei wird als Argument an den aktuellen Befehl als Ergebnis der Erweiterung übergeben. Wenn das Formular> (Liste) verwendet wird, liefert das Schreiben in die Datei eine Eingabe für die Liste. Wenn das Formular < (Liste) verwendet wird, sollte die als Argument übergebene Datei gelesen werden, um die Ausgabe der Liste zu erhalten.

Unter der Annahme, SomeProcess erzeugt eine Ausgabe, die Sie in Ihrem Editor erfassen möchten:

sublimetext <(SomeProcess) 

oder:

SomeProcess | sublimetext <(cat) 

Wenn Sie denken, dass Sie dies von Hand ein in sein eingeben viel, dann können Sie sublimetext <(cat) in ein Shell-Skript oder Alias ​​setzen.

Gerade falls Ihr Betriebssystem nicht verarbeitet Substitution nicht unterstützt, dann können Sie immer eine temporäre Datei selbst natürlich angeben:

SomeProcess > /tmp/myoutput 
sublimetext /tmp/myoutput 
+0

Das ist seltsam, 'subl <(echo" Kartoffel ")' funktioniert, aber 'subl <(Geschichte)' und 'subl <(ls)' nicht – wim

+0

Eigentlich funktioniert 'subl <(echo)' auch jetzt nicht zuverlässig. Irgendetwas puffern hier vielleicht ... – wim

+0

'subl <(Geschichte)' irgendwie funktioniert einmal, und dann verschwand der Text innerhalb des Editors nur nach ein paar Sekunden! oh! – wim

11

Die einfachste Lösung, wenn Ihre erhabene Installation nicht aktuelle Öffnungs STDIN (zB unterstützt Version unter Linux) ist die Ausgabe in eine temporäre Datei zu speichern, öffnen Sie die Datei in erhaben, und löschen Sie die Datei. Ich habe ein Skript tosubl in meinem Verzeichnis bin wie folgt aufgerufen:

#!/bin/bash 

TMPDIR=${TMPDIR:-/tmp} # default to /tmp if TMPDIR isn't set 
F=$(mktemp $TMPDIR/tosubl-XXXXXXXX) 
cat >| $F # use >| instead of > if you set noclobber in bash 
subl $F 
sleep .3 # give subl a little time to open the file 
rm -f $F # file will be deleted as soon as subl closes it 

Dann sind Sie so etwas wie es, indem Sie diese verwenden können:

$ ifconfig | tosubl 
+1

Der erste Satz deutet darauf hin, dass es * Versionen von ST gibt, die STDIN unterstützen. : \ – Oli