Por ejemplo, quiero ser capaz de escribir algo como:emacs tuberías de concha de salida a un nuevo buffer
$ git diff | tempbuffer
y tienen el diff abierto en una nueva memoria intermedia, no guardado.
Por ejemplo, quiero ser capaz de escribir algo como:emacs tuberías de concha de salida a un nuevo buffer
$ git diff | tempbuffer
y tienen el diff abierto en una nueva memoria intermedia, no guardado.
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-command
RET 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
siresize-mini-windows
es no -nil), se muestra allí. De lo contrario, se muestra el búfer que contiene la salida.
¡También puede usar C-u M-! para poner la salida en el búfer actual. – Daimrod
@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
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. –
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.
Gracias. Eso funciona para Eshell. Sin embargo, estoy usando el shell normal (es decir, el shell M-x). –
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. –
Esto es realmente útil cuando se usa TRAMP, ej. "foo/ssh: usuario @ máquina:/some/remote/file> #
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';
}
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'). –
Al igual que en su publicación original, es decir. 'git diff | tempbuffer'. – Sean
Ah lo tengo. Muchas gracias. –
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.
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'.
Si te sugiero, prueba magit. es posible que no haga exactamente lo que quiere. pero veo que se ajusta a sus necesidades https://github.com/magit/magit – kindahero