2010-03-17 9 views
7

Ho un programma che può inviare del testo a qualsiasi altro programma per ulteriori analisi (ad es. Sed, grep, ecc.). Mi piacerebbe che mandasse i dati a Emacs e faccia l'analisi lì. Come potrei farlo? EmacsClient prende un nome di file per impostazione predefinita, questa è una stringa di dati non un file e io davvero non voglio creare ed eliminare file solo per inviare dati ad Emacs.Creazione di un nuovo buffer con testo utilizzando EmacsClient

EmacsClient ha un'opzione di riga di comando "eval" che consente di eseguire codice Lisp anziché file aperti. C'è una semplice funzione lisp che aprirà un nuovo buffer con il testo specificato?

Edit: Sto cercando qualcosa di simile:

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

E un nuovo buffer sembrerebbe automaticamente con la parola "ciao mondo". Non sono sicuro di come verrà impostato il nome del buffer. Spero che qualcosa sia numerato automaticamente.

risposta

6

Questo non fa quello che chiedi:

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)) 

Ovviamente è possibile personalizzare open-buffer-with a fare quello che vuoi.

C'è una domanda simile che potresti voler dare un'occhiata: How do I get basic App<->Emacs integration?.

+1

Se qualcun altro ha problemi a far funzionare questo in EmacsW32, ho dovuto scambiare le virgolette singole per virgolette e sfuggire alle doppie virgolette all'interno del comando: emacsclient -e "(open-buffer- con \ "ciao, mondo \") " –

+0

@OtherMichael quello che hai messo funziona bene per me in Windows, comunque sto scappando da una shell cygwin. Non so come personalizzare le cose per funzionare da un prompt generale di DOS - quando provo dal prompt di DOS ottengo un errore "emacsclient.exe: nessun socket o editor alternativo" (ovviamente ho avviato Emacs dal cygwin shell, che può causare quello). –

+0

Dalla shell cygwin, stai avviando EmacsW32 o cygwin emacs? –

2

Come su questo approccio?

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

Ho inserito newline per suddividere questa linea molto lunga per scopi di visualizzazione.

Quando eseguo questo da una finestra di terminale, un nuovo buffer denominato Piped si apre nella mia finestra di Emacs, contenente il testo "Hello, World!" (completo di virgolette). Quando lo eseguo nuovamente, si apre un altro buffer denominato Piped<2> con lo stesso testo.

L'esagono-fuga (che può probabilmente essere altrettanto facilmente realizzato con qualsiasi altro linguaggio di alto livello, non solo Perl) è per sfuggire citazioni che altrimenti terminare la stringa costante di essere alimentati (insert).

Questo approccio alimenta il testo in Emacs tramite Emacsclient sulla riga di comando, quindi un testo di input molto lungo potrebbe dargli un problema. Una soluzione più generale potrebbe essere in grado di suddividere i dati di input lunghi e inviarli ad Emacs attraverso diverse chiamate di Emacsclient.

Problemi correlati