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


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

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.


Apakah Anda dapat menjawab pertanyaan ini di sini juga? ini tentang mencoba menggunakan buffer saat ini %untuk buffer berikutnya tetapi E499.
hhh


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>

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.