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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.