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

35

¿Cómo puedo canalizar la salida de un comando de shell en un nuevo búfer en Vim? Lo siguiente obviamente no funcionaría, pero puedes ver a lo que me refiero:

:!echo % | :newtab
Richie Marquez
fuente
1
stackoverflow.com/questions/3826003/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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
garyjohn
fuente
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.

pensar demasiado
fuente
¿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
4
:tabnew | enew | r ! <your shell cmd>

funciona para mi.

justrajdeep
fuente
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>
Luc Hermitte
fuente
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