2010-03-17 10 views
7

Tengo un programa que puede enviar texto a cualquier otro programa para su posterior análisis (por ejemplo, sed, grep, etc.). Me gustaría que envíe los datos a Emacs y haga el análisis allí. ¿Como podría hacerlo? EmacsClient toma un nombre de archivo por defecto, esta es una cadena de datos, no un archivo, y realmente no quiero crear y eliminar archivos solo para enviar datos a Emacs.Crear un nuevo búfer con texto usando EmacsClient

EmacsClient tiene una opción de línea de comando "eval" que le permite ejecutar código lisp en lugar de abrir archivos. ¿Hay una función simple de lisp que abrirá un nuevo buffer con el texto dado?

Editar: Estoy buscando algo como:

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

Y un nuevo buffer aparecería automáticamente con la palabra "hola mundo". No estoy seguro de cómo se establecería el nombre del búfer. Ojalá algo auto numerado.

Respuesta

6

Esto hace lo que pide:

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

Obviamente se puede personalizar open-buffer-with a hacer lo que quiera.

Hay una pregunta similar que quizás quiera consultar: How do I get basic App<->Emacs integration?.

+1

Si alguien más tiene problemas para hacer que esto funcione en EmacsW32, tuve que cambiar las comillas simples por comillas dobles, y escapar de las comillas dobles dentro del comando: emacsclient -e "(open-buffer- con \ "hola, mundo \") " –

+0

@OtherMichael lo que pones funciona muy bien para mí en Windows, sin embargo estoy ejecutando desde un shell cygwin. No sé cómo personalizar las cosas para que funcionen desde un indicador general de DOS: cuando lo intento desde el indicador de DOS, aparece el error "emacsclient.exe: sin conector o editor alternativo" (por supuesto, inicié Emacs desde el cygwin shell, que puede causar eso). –

+0

Desde cygwin shell, ¿está iniciando EmacsW32 o cygwin emacs? –

2

¿Qué tal este enfoque?

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

He insertado líneas nuevas para romper esta línea tan larga para fines de visualización.

Cuando ejecuto esto desde una ventana de terminal, se abre un nuevo buffer llamado Piped en mi ventana de Emacs, que contiene el texto "Hello, World!" (completo con comillas). Cuando lo ejecuto nuevamente, se abre otro buffer llamado Piped<2>, con el mismo texto.

El escape hexadecimal (que probablemente se puede realizar fácilmente con cualquier otro lenguaje de alto nivel, no solo Perl) es para escapar de las comillas que de lo contrario terminarían la constante de cadena alimentada a (insert).

Este enfoque alimenta el texto a Emacs a través de Emacsclient en la línea de comandos, por lo que el texto de entrada muy largo puede darle un problema. Una solución más general podría ser capaz de dividir los datos de entrada largos y alimentarlos a Emacs en varias invocaciones de Emacsclient.

Cuestiones relacionadas