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:
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
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.
Respuestas:
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
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
fuente
:r!echo
sin alterar el búfer.Esto es lo que hago. Se menciona en los comentarios en las respuestas anteriores.
Ejemplo 1 : buscar todos los archivos de texto en
/tmp
Ejemplo 2 : está editando el archivo foo.txt y desea ejecutar
ls -la foo.txt
y obtener la salida en un búfer: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
crea una división horizontal, úsela:vnew
si desea una división vertical en su lugar y:tabnew
para una nueva pestaña.fuente
%
el siguiente búfer pero E499.funciona para mi.
fuente
Si realmente necesita almacenar el resultado en un nuevo búfer, pero necesita información del antiguo búfer actual, puede usar
system()
:o almacenar el nombre del búfer actual para más tarde :
fuente