Tubería de búfer al comando externo en Vim

92

Soy una especie de novato en Vim. Me gustaría enviar el contenido del búfer actual al stdin del comando externo (digamos correo). Mi propósito final es establecer un atajo para enviar rápidamente correos electrónicos desde el búfer de Vim actual. Supongo que esto debería ser algo trivial, pero no pude encontrar una manera de enviar el búfer de Vim a un comando externo. Gracias por adelantado.

yasar
fuente
Preguntas relacionadas para proporcionar texto seleccionado como STDINcomandos de shell: Canalizar a shell y recibir salida en la línea de información y Reemplazar el texto original seleccionado con la salida
user1129682

Respuestas:

130

Puede usar :w !cmdpara escribir el búfer actual en el stdin de un comando externo. De :help :w_c:

: [rango] w [rito] [++ opt]! {cmd}

Ejecutar {cmd}con [range]líneas como entrada estándar (tenga en cuenta el espacio delante de '!'). {cmd}se ejecuta como con ":!{cmd}", any '!'se reemplaza con el comando anterior |:!|.

Un comando relacionado es el :%!cmdque hace lo mismo y luego reemplaza el búfer actual con la salida del comando. Entonces :%!sortinvocaría el comando de clasificación externo para ordenar el búfer actual en su lugar.

John Kugelman
fuente
6
Esto es útil para formatear json como: :'<,'>!python -mjson.toolo:%!python -mjson.tool
TrinitronX
1
Para formatear, use :%!gofmtsin el último %, ya que eso haría que se usara la versión guardada (que puede diferir del búfer actual)
thomasrutter
¿Hay alguna forma de que esto reemplace el búfer actual con la salida del comando solo en caso de éxito? Si el comando devuelve un valor distinto de cero, ¿no reemplaza el búfer?
thomasrutter
@thomasrutter si el búfer se reemplaza con un mensaje de error en lugar de la salida deseada, puede presionar upara deshacer
törzsmókus