Jawaban:
Dengan " :read
" Vim akan selalu memasukkan output pada baris baru. Solusinya sayangnya tidak sederhana.
Anda dapat memasukkan output dari perintah pada posisi kursor saat ini ketika Anda dalam mode memasukkan dengan menekan ControlRlalu mengetik =system('command')
Enter. Sayangnya, jika output perintah memiliki trailing newline (seperti kebanyakan kehendak) yang juga akan dimasukkan, maka baris Anda akan rusak.
Itu bisa diperbaiki dengan menambahkan substitute()
panggilan untuk menghapus baris baru, tetapi itu membuat perintah lebih sulit daripada layak untuk mengetik dengan tangan.
Solusi utama adalah membuat semacam pemetaan, tetapi itu menjadi lebih kompleks karena cara Vim menangani apa yang disebutnya "ketik di depan"; sementara Anda dapat melakukan sesuatu seperti:
:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>
Di mana perintah "terprogram" dalam pemetaan, Anda tidak dapat melakukan sesuatu seperti:
:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>
Di mana Anda mencoba untuk meminta pengguna untuk menjalankan perintah, karena Vim hanya akan bingung, berbunyi bip, dan masuk ke mode insert.
Jadi, Anda harus meminta perintah untuk menjalankan terlebih dahulu, menyimpannya dalam variabel, dan kemudian memasukkan output yang diproses. Pada titik ini fungsi pembantu mungkin diperlukan untuk menjaga pemetaan itu sendiri agar tidak berantakan, jadi kami berakhir dengan sesuatu seperti ini:
function InlineCommand()
let l:cmd = input('Command: ')
let l:output = system(l:cmd)
let l:output = substitute(l:output, '[\r\n]*$', '', '')
execute 'normal i' . l:output
endfunction
nmap <silent> \e :call InlineCommand()<CR>
Catatan yang nmap
membuat pemetaan yang hanya mengeksekusi ketika diketik dalam mode normal.
Kebetulan, jika Anda hanya ingin memasukkan tanggal atau direktori kerja saat ini, jawaban awal yang saya berikan layak. Cukup masukkan mode dan ketik masukkan ControlR=strftime('%c')
Enteratau ControlR=getcwd()
Enter.
Jika Anda menginginkannya di baris saat ini Anda coba saja, tetapi perlu diingat konten lama dari garis tersebut akan dihapus:
:.!date
Jika Anda menginginkan posisi kursor yang tepat, Anda dapat:
:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b
Singkat cerita: Anda harus mengganti sebab Anda ingin menyingkirkan ^ @ (karakter nol) yang juga dapat Anda ganti dengan .s / \% x00 // g. Ini adalah versi yang lebih pendek dengan lebih sedikit pipa:
:exec 'normal i'.substitute(system("date"),"[\n]*$","","")
Dan Anda juga dapat mengatur tag jika Anda ingin mengganti di berbagai titik pada baris yang sama:
Diberikan Baris 1 ini:
1 Date: <datehere> and also <datehere>
Menjalankan:
:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g
Setelah Penggantian:
1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012
Diuji pada Vim 7.2
Anda dapat menambahkan hal semacam ini di .vimrc Anda:
" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
me
menandai posisi saat ini.:r !date +\%F<CR>
menempatkan tanggal pada baris berikutnya dalam format YYYY-MM-DD (Anda dapat mengubah ini sesuka Anda, lepas saja %
dengan masing - masing \
).A <Esc>
menambahkan ruang ke akhir output tanggal.0D
menghapus tanggal, `e
membawa Anda kembali ke posisi yang ditandai, dan PJx
menempatkan tanggal sebelum kursor, bergabung dengan garis (untuk menghilangkan yang kosong di bawah) dan membunuh ruang trailing. Ubah pemetaan sesuai keinginan Anda.Jika Anda ingin melakukannya dari mode insert, saya membaca permata ini hari ini di https://vimways.org/2018/the-mapping-business/
inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>
Anda dapat memodifikasi output tanggal sesuai dengan kebutuhan Anda ( man date
dapat membantu dengan ini).
Dalam mode normal (mode escape / bleep) tempel
:exec 'normal i'.system("date \| tr '\n' ' '")
untuk memasukkan tanggal pada posisi saat ini. Jika Anda menyalin garis itu dengan carriage-return maka Shift + Insert menjadi perintah DateTime-Here Anda.
Selain itu Anda dapat mengikat F12 ke perintah dengan
:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>
maka Anda dapat memasukkan tanggal dengan Function-key-12 saat mode insert aktif. saya menggunakan
:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>
(Saya berubah dari DHERE setelah menemukan bahwa pasta ADHERE terpicu) karena saya sudah menggunakan F12 untuk hal-hal lain.
saya menggunakan
grep -iE "dhere" /usr/share/dict/words
untuk memeriksa bentrokan yang jelas dengan kata-kata yang ada, yang menunjukkan bahwa Anda relatif aman untuk digunakan:
:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>
(kecuali jika Anda menulis dokumentasi tertentu.)