Memotong output perintah shell (!) Ke dalam buffer baru di Vim

35

Bagaimana saya bisa menyalurkan output dari perintah shell ke buffer baru di Vim? Jelas berikut ini tidak akan berfungsi, tetapi Anda dapat melihat apa yang saya maksud:

:!echo % | :newtab
Richie Marquez
sumber
1
stackoverflow.com/questions/3826003/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

27

Anda tidak bisa menyalurkan output dari perintah shell ke perintah yang membuat buffer baru, tetapi Anda bisa membuat buffer baru dan membaca output dari perintah shell ke buffer itu dengan satu entri pada baris perintah Vim. Versi contoh kerja Anda akan menjadi

:tabnew | r !echo <c-r>=bufname("#")<cr>

Perhatikan bahwa simbol pipa dalam hal ini adalah pemisah antara perintah Vim ex, bukan pipa shell. Lihat juga

:help :tabnew
:help :r!
:help :bar
garyjohn
sumber
Itu hampir persis yang saya butuhkan, hanya sebaliknya sehingga saya dapat mengakses nama file buffer saat ini. Catatan: perbarui pertanyaan untuk mudah-mudahan menjelaskan hasil akhir yang diinginkan.
Richie Marquez
@ Richard Marquez: saya memperbarui jawaban ini. tab baru sekarang dibuka dengan nama file "lama", sehingga Anda dapat menghubungi
:!
Tapi bukan :r!echotanpa mengubah buffer.
Luc Hermitte
2
@garyjohn, akira: terima kasih atas bantuannya. Bagian "<cr> = ..." membuat Vim memuntahkan kesalahan, tetapi saya bisa membuatnya berfungsi dengan ": tabnew | r! Echo #".
Richie Marquez
1
Mungkin juga berguna untuk mencatat bahwa jika Anda ingin memetakan ini ke kunci di .vimrc Anda, Anda harus mengganti | karakter dengan <bar>.
Richie Marquez
16

Inilah yang saya lakukan. Itu disinggung dalam komentar di jawaban di atas.

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

Contoh 1 : Temukan semua file teks di/tmp

:new | r ! find /tmp -name '*.txt'

Contoh 2 : Anda sedang mengedit file foo.txt dan Anda ingin menjalankannyals -la foo.txt dan mendapatkan output dalam buffer:

:new | r ! ls -la #

The #diganti dengan nama file aslinya penyangga Anda mengedit sedang. Ini sangat berguna untuk perintah kontrol sumber ad-hoc misalnya

:new | r ! hg annotate -un #

:newmembuat pemisahan horizontal, gunakan :vnewjika Anda ingin pemisahan vertikal dan :tabnewuntuk tab baru.

terlalu banyak berpikir
sumber
Apakah Anda dapat menjawab pertanyaan ini di sini juga? ini tentang mencoba menggunakan buffer saat ini %untuk buffer berikutnya tetapi E499.
hhh
4
:tabnew | enew | r ! <your shell cmd>

bekerja untukku.

justrajdeep
sumber
2

Jika Anda benar-benar perlu menyimpan hasil dalam buffer baru, tetapi memerlukan info dari buffer saat ini yang lama, maka Anda dapat menggunakan system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

atau simpan nama buffer saat ini untuk nanti :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>
Luc Hermitte
sumber
lihat jawaban yang lain, Anda bisa melakukannya tanpa menyimpan nama dalam variabel. tapi tetap saja jawabannya bagus.
akira
Memang. Saya tidak yakin '#' akan memberikan hasil yang diharapkan dalam kasus itu - karena saya tidak pernah menggunakan tab
Luc Hermitte