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:
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
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.
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
Jawaban:
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
Perhatikan bahwa simbol pipa dalam hal ini adalah pemisah antara perintah Vim ex, bukan pipa shell. Lihat juga
sumber
:r!echo
tanpa mengubah buffer.Inilah yang saya lakukan. Itu disinggung dalam komentar di jawaban di atas.
Contoh 1 : Temukan semua file teks di
/tmp
Contoh 2 : Anda sedang mengedit file foo.txt dan Anda ingin menjalankannya
ls -la foo.txt
dan mendapatkan output dalam buffer:The
#
diganti dengan nama file aslinya penyangga Anda mengedit sedang. Ini sangat berguna untuk perintah kontrol sumber ad-hoc misalnya:new
membuat pemisahan horizontal, gunakan:vnew
jika Anda ingin pemisahan vertikal dan:tabnew
untuk tab baru.sumber
%
untuk buffer berikutnya tetapi E499.bekerja untukku.
sumber
Jika Anda benar-benar perlu menyimpan hasil dalam buffer baru, tetapi memerlukan info dari buffer saat ini yang lama, maka Anda dapat menggunakan
system()
:atau simpan nama buffer saat ini untuk nanti :
sumber