Canalice la salida del comando de shell (!) En un nuevo buffer en Vim


Respuestas:


27

No puede canalizar la salida de un comando de shell en un comando que crea un nuevo buffer, pero puede crear un nuevo buffer y leer la salida de un comando de shell en ese buffer con una entrada en la línea de comando de Vim. Una versión funcional de su ejemplo sería

:tabnew | r !echo <c-r>=bufname("#")<cr>

Tenga en cuenta que el símbolo de tubería en este caso es un separador entre los comandos de Vim ex, no la tubería de la carcasa. Ver también

:help :tabnew
:help :r!
:help :bar

Eso es casi exactamente lo que necesito, al revés para poder acceder al nombre de archivo del búfer actual. Nota: se actualizó la pregunta para poder aclarar el resultado final deseado.
Richie Marquez

@ Richard Marquez: actualicé esta respuesta. la nueva pestaña ahora se abre con el nombre de archivo "antiguo", por lo que puede llamar
:!

Pero no :r!echosin alterar el búfer.
Luc Hermitte

2
@garyjohn, akira: gracias por la ayuda. La parte "<cr> = ..." hizo que Vim arrojara errores, pero pude hacerlo funcionar con ": tabnew | r! Echo #".
Richie Marquez

1
También podría ser útil tener en cuenta que si desea asignar esto a una clave en su .vimrc, deberá reemplazar el | carácter con <bar>.
Richie Marquez

16

Esto es lo que hago. Se menciona en los comentarios en las respuestas anteriores.

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

Ejemplo 1 : buscar todos los archivos de texto en/tmp

:new | r ! find /tmp -name '*.txt'

Ejemplo 2 : está editando el archivo foo.txt y desea ejecutar ls -la foo.txty obtener la salida en un búfer:

:new | r ! ls -la #

El #se reemplaza con el nombre del archivo del búfer original que está editando. Esto es particularmente útil para comandos de control de fuente ad-hoc, p. Ej.

:new | r ! hg annotate -un #

:newcrea una división horizontal, úsela :vnewsi desea una división vertical en su lugar y :tabnewpara una nueva pestaña.


¿Eres capaz de responder esta pregunta aquí también? se trata de intentar usar el búfer actual con %el siguiente búfer pero E499.
hhh


2

Si realmente necesita almacenar el resultado en un nuevo búfer, pero necesita información del antiguo búfer actual, puede usar system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

o almacenar el nombre del búfer actual para más tarde :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>

vea la otra respuesta, puede hacerlo sin almacenar el nombre en una variable. pero buena respuesta de todos modos.
akira

En efecto. No estaba seguro de que '#' dé el resultado esperado en ese caso, ya que nunca uso pestañas
Luc Hermitte
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.