Buffer de tubulação para comando externo no Vim

92

Eu sou meio que um novato em Vim. Gostaria de enviar o conteúdo do buffer atual para stdin de comando externo (digamos e-mail). Meu objetivo final é definir um atalho para enviar e-mails rapidamente do buffer atual do Vim. Estou supondo que isso deve ser uma coisa trivial, mas não consegui encontrar uma maneira de enviar o buffer do Vim para um comando externo. Desde já, obrigado.

Yasar
fonte
Perguntas relacionadas para fornecer texto selecionado como STDINcomandos de shell: Pipe para shell e receba saída na linha de informação e Substituindo o texto original selecionado pela saída
user1129682

Respostas:

130

Você pode usar :w !cmdpara gravar o buffer atual no stdin de um comando externo. De :help :w_c:

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

Execute {cmd}com [range]linhas como entrada padrão (observe o espaço na frente do '!'). {cmd}é executado como com ":!{cmd}", any '!'é substituído pelo comando anterior |:!|.

Um comando relacionado :%!cmdfaz a mesma coisa e então substitui o buffer atual pela saída do comando. Portanto, :%!sortchamaria o comando de classificação externa para classificar o buffer atual no local.

John Kugelman
fonte
6
Isso é útil para formatar json como: :'<,'>!python -mjson.toolou:%!python -mjson.tool
TrinitronX
1
Para formatar, use :%!gofmtsem o último %, pois isso faria com que ele usasse a versão salva (que pode ser diferente do buffer atual)
thomasrutter
Existe alguma maneira de substituir o buffer atual pela saída do comando apenas em caso de sucesso? Se o comando retornar diferente de zero, não substituir o buffer?
thomasrutter
@thomasrutter se o buffer for substituído por uma mensagem de erro em vez da saída pretendida, você pode simplesmente pressionar upara desfazer
törzsmókus
1

Aqui está um exemplo de como enviar o buffer atual para stdin externo a partir da linha de comando:

vim -es +"w >> /dev/stdout" -cq! /etc/hosts

É útil para fins de script.

Para mais truques de linha de comando, verifique:

Kenorb
fonte