2010-03-17 7 views
7

Ich habe ein Programm, das Text an andere Programme zur weiteren Analyse senden kann (zB sed, grep, etc). Ich möchte, dass es die Daten an Emacs sendet und dort analysiert. Wie würde ich das tun? EmacsClient verwendet standardmäßig einen Dateinamen, das ist eine Datenfolge, keine Datei und ich möchte wirklich keine Dateien erstellen und löschen, nur um Daten an Emacs zu senden.Erstellen eines neuen Puffers mit Text unter Verwendung von EmacsClient

EmacsClient verfügt über eine Befehlszeilenoption "eval", mit der Sie Lisp-Code statt geöffneter Dateien ausführen können. Gibt es eine einfache Lisp-Funktion, die einen neuen Puffer mit dem angegebenen Text öffnet?

Edit: Ich bin auf der Suche nach so etwas wie:

emacsclientw.exe -eval (open-new-buffer 'hello world')

Und ein neuer Puffer mit dem Wort automatisch „Hallo Welt“ erscheinen würde. Ich bin mir nicht sicher, wie der Name des Puffers eingestellt werden würde. Hoffentlich etwas selbst nummeriert.

Antwort

6

Das tut, was man sich wünschen:

emacsclient -e '(open-buffer-with "some\nstuff\nhere")' 

(defun open-buffer-with (txt) 
    "create a new buffer, insert txt" 
    (pop-to-buffer (get-buffer-create (generate-new-buffer-name "something"))) 
    (insert txt)) 

Natürlich können Sie open-buffer-with anpassen zu tun, was Sie wollen.

Es gibt eine ähnliche Frage, die Sie sich vielleicht ansehen möchten: How do I get basic App<->Emacs integration?.

+1

Wenn jemand anderes Schwierigkeiten damit hat, dies in EmacsW32 zu erledigen, musste ich die einfachen Anführungszeichen gegen doppelte Anführungszeichen tauschen und die doppelten Anführungszeichen innerhalb des Befehls: emacsclient -e "(open-buffer-) mit \ "Hallo, world \") " –

+0

@OtherMichael, was Sie in Arbeit funktioniert gut für mich in Windows, aber ich laufe von einer Cygwin-Shell. Ich weiß nicht, wie man Dinge an einer allgemeinen DOS-Eingabeaufforderung anpassen kann - wenn ich es von der DOS-Eingabeaufforderung aus versuche, erhalte ich den Fehler "emacsclient.exe: Kein Socket oder alternativer Editor" (natürlich habe ich die Emacs von Cygwin gestartet Shell, die das verursachen kann). –

+0

Von der Cygwin-Shell starten Sie EmacsW32 oder Cygwin Emacs? –

2

Wie wäre es mit diesem Ansatz?

emacsclient -e ' 
    (progn 
    (pop-to-buffer (generate-new-buffer "Piped")) 
    (insert (decode-hex-string " 
    '$(perl -e 'print unpack "H*", qq("Hello, World!")' 
    )'"))) 
' 

Ich habe Zeilenumbrüche eingefügt, um diese sehr lange Zeile für Anzeigezwecke aufzubrechen.

Wenn ich dies aus einem Terminal-Fenster ausführen, wird ein neuer Puffer namens Piped in meinem Emacs-Fenster geöffnet, der den Text "Hello, World!" (mit Anführungszeichen) enthält. Wenn ich es erneut ausführe, öffnet sich ein weiterer Puffer namens Piped<2> mit demselben Text.

Das Hex-Escaping (das wahrscheinlich genauso leicht mit jeder anderen Hochsprache, nicht nur mit Perl, ausgeführt werden kann) ist das Entkommen von Anführungszeichen, die andernfalls die String-Konstante (insert) beenden würden.

Bei diesem Ansatz wird Emacs über Emacsclient in der Befehlszeile mit Text versorgt, sodass ein sehr langer Eingabetext ein Problem verursachen kann. Eine allgemeinere Lösung könnte in der Lage sein, lange Eingabedaten zu trennen und sie über mehrere Emacsclient-Aufrufe an Emacs zu übermitteln.

Verwandte Themen