Masukkan output dari perintah sistem di lokasi saat ini di vim

33

Dalam vim, ketika saya gunakan

:r !ls somefilename

itu menyisipkan output dari perintah itu pada baris baru di bawah baris saat ini.

Jika aku melakukan

let @a = system("ls")

dan kemudian

"ap

masih menyisipkan output pada baris baru di bawah baris saat ini.

Apakah ada cara untuk membuat keluaran memasukkan vim di lokasi saat ini?

deshmukh
sumber
Lihat jawaban yang bermanfaat ini. Eksekusi baris saat ini dalam bash dari vim
Rohan Ghige

Jawaban:

14

Anda dapat menempelkan konten buffer clipboard antara karakter dengan Ctrl-R * dalam mode insert (dan pendekatan serupa untuk buffer lainnya). Jadi jika Anda bisa mendapatkan perintah sistem ke buffer, Anda harus mengaturnya. (Sumber: https://stackoverflow.com/questions/1491135/paste-multi-line-string-into-gvim-at-cursor-position ).

:let @a=system("ls -l")akan memasukkan output ls -lke register a. Anda kemudian dapat menempelkannya (dalam mode sisipan) dengan ^R-a.

Steve Kroon
sumber
Juga, pada sebagian besar platform, clipboard disinkronkan dengan register (biasanya *) jadi jika Anda menyalurkan output perintah Anda ke clipboard Anda, itu akan ada di dalam "*untuk Anda gunakan.
Bruno Bronosky
39
:r !command 

akan membaca output dari perintah dan memasukkannya ke dalam baris di bawah baris saat ini. Ini adalah bagaimana vi diprogram Anda tidak dapat mengubah perilaku.

Tetapi katakan jika Anda berada di nomor baris 3. Jika Anda mencoba :r !date. Ini akan memasukkan nilai tanggal ke dalam nomor baris 4.

Jika Anda ingin nilai tanggal ditampilkan pada nomor baris 3, maka Anda :2r !dateakan mencoba memasukkan nilai tanggal pada nomor baris 3.

devav2
sumber
4
Itu menyisipkan pada garis yang berbeda, tetapi masih pada garisnya sendiri. Saya ingin memasukkannya di lokasi saat ini!
deshmukh
13

Berikut adalah cara alternatif untuk menempelkan output dari perintah eksternal sebelum kursor:

:exe 'norm i' . system("ls -l")

atau gunakan register ekspresi ( :help @=):

"=system('ls -la')

lalu tekan P. Atau cara yang lebih singkat dengan:

<CTRL-R>=system('ls -la')<CR>
kenorb
sumber
4
Ini jawabannya.
Jacob
1
Sepakat! Ini harus benar-benar jawaban yang benar, karena itu mencakup solusi yang lebih terprogram (dengan :exe) yang dapat dimasukkan dalam perintah.
metasoarous