Perpipaan buffer ke perintah eksternal di Vim

94

Saya jenis pemula Vim. Saya ingin mengirim isi buffer saat ini ke stdin dari perintah eksternal (katakanlah mail). Tujuan akhir saya adalah mengatur jalan pintas untuk mengirim email dengan cepat dari buffer Vim saat ini. Saya menduga ini harus menjadi hal yang sepele, tetapi saya tidak dapat menemukan cara untuk mengirim buffer Vim ke perintah eksternal. Terima kasih sebelumnya.

yasar
sumber
Pertanyaan terkait untuk menyediakan teks yang dipilih sebagai STDINperintah shell: Pipa ke shell dan menerima keluaran pada baris info dan Mengganti teks asli yang dipilih dengan keluaran
user1129682

Jawaban:

135

Anda dapat menggunakan :w !cmduntuk menulis buffer saat ini ke stdin dari perintah eksternal. Dari :help :w_c:

: [range] w [ritus] [++ opt]! {cmd}

Jalankan {cmd}dengan [range]garis sebagai input standar (perhatikan spasi di depan '!'). {cmd}dijalankan seperti dengan ":!{cmd}", apapun '!'diganti dengan perintah sebelumnya |:!|.

Perintah terkait adalah :%!cmdyang melakukan hal yang sama dan kemudian menggantikan buffer saat ini dengan output perintah. Jadi :%!sortakan memanggil perintah sortir eksternal untuk mengurutkan buffer saat ini di tempat.

John Kugelman
sumber
6
Ini berguna untuk memformat json seperti: :'<,'>!python -mjson.toolatau:%!python -mjson.tool
TrinitronX
1
Untuk memformat go, gunakan :%!gofmttanpa yang terakhir %, karena itu akan menyebabkannya menggunakan versi tersimpan (yang mungkin berbeda dari buffer saat ini)
thomasrutter
Apakah ada cara untuk mengganti buffer saat ini dengan output perintah hanya jika berhasil? Jika perintah mengembalikan bukan nol, jangan ganti buffer?
thomasrutter
@thomasrutter jika buffer diganti dengan pesan kesalahan alih-alih output yang diinginkan, Anda cukup menekan uuntuk undo
törzsmókus