Przesyłanie bufora do zewnętrznego polecenia w Vimie

95

Jestem trochę nowicjuszem w Vimie. Chciałbym wysłać zawartość bieżącego bufora na stdin zewnętrznej komendy (powiedzmy mail). Moim ostatnim celem jest ustawienie skrótu do szybkiego wysyłania wiadomości e-mail z bieżącego bufora Vima. Zgaduję, że to powinno być trywialne, ale nie mogłem znaleźć sposobu na wysłanie bufora Vima do zewnętrznego polecenia. Z góry dziękuję.

yasar
źródło
Podobne pytania na dostarczanie zaznaczony tekst jako STDINdo poleceń powłoki: Rura zapłacić i otrzymać wyjście w wierszu informacyjnym i Wymiana wybrany oryginalny tekst z wyjściem
user1129682

Odpowiedzi:

136

Możesz użyć, :w !cmdaby zapisać bieżący bufor na stdin polecenia zewnętrznego. Od :help :w_c:

: [zakres] w [rite] [++ opt]! {cmd}

Wykonaj {cmd}z [range]liniami jako standardowym wejściem (zwróć uwagę na spację przed '!'). {cmd}jest wykonywane jak z ":!{cmd}", any '!'jest zastępowane przez poprzednie polecenie |:!|.

Powiązane polecenie polega na :%!cmdtym, że robi to samo, a następnie zastępuje bieżący bufor danymi wyjściowymi polecenia. Tak :%!sortby wywołać polecenie sortowania zewnętrznego sortowania bieżący bufor na miejscu.

John Kugelman
źródło
6
Jest to przydatne do formatowania json, takiego jak: :'<,'>!python -mjson.toollub:%!python -mjson.tool
TrinitronX
1
Do formatowania użyj :%!gofmtbez ostatniej %, ponieważ spowodowałoby to użycie zapisanej wersji (która może różnić się od obecnego bufora)
thomasrutter
Czy istnieje sposób, aby zastąpić bieżący bufor danymi wyjściowymi polecenia tylko w przypadku pomyślnego zakończenia ? Jeśli polecenie zwróci wartość niezerową, nie zastępuj bufora?
thomasrutter
@thomasrutter jeśli bufor otrzymuje komunikat o błędzie zamiast planowanego wyjścia, można po prostu nacisnąć udo cofania
törzsmókus