2011-12-21 4 views

Respuesta

6

Solo puede usar M-! - Ejecutará el comando dentro del mismo componente secundario que el almacenamiento intermedio de la consola, y enviará los resultados a un buffer *Shell Command Output*.

Tenga en cuenta que si los resultados son breves, ese búfer no se levantará y la salida se copiará en el área de eco; sin embargo, el buffer es todavía usado y disponible. Chfshell-commandRET tiene detalles de lo que constituye una "breve" de salida:

Si la salida es lo suficientemente corto como para que aparezca en el área de eco (determinado por la variable max-mini-window-height si resize-mini-windows es no -nil), se muestra allí. De lo contrario, se muestra el búfer que contiene la salida.

+3

¡También puede usar C-u M-! para poner la salida en el búfer actual. – Daimrod

+1

@Daimrod: Eso es exactamente lo que el OP * no * desea hacer. Está dentro de una eshell y quiere que la salida de un comando vaya a un nuevo búfer. – Thomas

+0

Esto es brillante, gracias. La única pieza que falta es poner el nuevo buffer en el modo correcto. Por ejemplo, si envío los resultados de 'git diff' a un nuevo buffer, me gustaría que el buffer esté en modo diff. –

8

Si usa eshell puede redirigir la salida a un búfer, p.

print foo > #<buffer bar> 

que crea un nuevo buffer bar con el contenido 'foo'. Para obtener más información, consulte Emacswiki en http://www.emacswiki.org/emacs/EshellRedirection.

+1

Gracias. Eso funciona para Eshell. Sin embargo, estoy usando el shell normal (es decir, el shell M-x). –

+1

Si eshell no es una opción para usted, puede canalizar su salida a emacsclient. Necesitarás un script o función de shell para esto. Como punto de partida, consulte http://www.emacswiki.org/emacs/EmacsClient#toc43. –

+0

Esto es realmente útil cuando se usa TRAMP, ej. "foo/ssh: usuario @ máquina:/some/remote/file> # " – Warbo

3

Desafortunadamente emacsclient no lee su entrada estándar, por lo que necesita algún tipo de envoltorio. He aquí una función de intérprete de comandos que funciona para mí:

tempbuffer() { 
    perl -MFile::Temp -MFile::Copy -e \ 
    'copy *STDIN, $file = File::Temp->new; system "emacsclient", $file'; 
} 
+0

Gracias por tu comentario. Lo siento, estoy siendo un poco estúpido. He puesto esta función en mi archivo bash y puedo invocarla desde la consola. Sin embargo, no entiendo cómo pasar el comando que realmente quiero ejecutar (es decir, 'git diff'). –

+0

Al igual que en su publicación original, es decir. 'git diff | tempbuffer'. – Sean

+0

Ah lo tengo. Muchas gracias. –

0

Hice un paquete (e-sink) utilizando información de la wiki emacs como punto de partida. Funciona como lo describió y "ralentiza" la salida en lugar de esperar hasta que el proceso termine de mostrar todo.

0

Mi preferencia personal es algo que se puede escribir en Bash sin tener que gestionar todos los archivos:

git diff | (f=$(mktemp); cat > $f; emacsclient $f; rm -v $f) 

emacsclient espera a que se termine con el tampón antes del golpe elimina el archivo temporal.

¡Utilizaría M-! (respuesta de phils) si comencé el comando de shell desde cero y el anterior (que es similar a la respuesta de Sean) si estaba 'en el medio de algo' en el shell y luego decidí 'Quiero conectar esto a Emacs'.

Cuestiones relacionadas