: baca setelah kursor bukan setelah baris

11

Saya :r !uuidgensering menggunakan untuk memasukkan uuid baru ke buffer. Ini berfungsi, tetapi saya biasanya mencoba memasukkan uuid di antara tanda kutip, dan :r !uuidgenmencetak uuid di baris baru.

Untuk mengatasi masalah ini, saya saat ini menggunakan keymap sederhana:

nnoremap <C-u> mm:r!uuidgen<CR>dW"_dd`mp

Makro ini menetapkan tanda mm, memasukkan uuid r!uuidgen, menghapus uuid yang disisipkan dW, menghapus garis ekstra "_dd, kembali ke tanda BACKTICKm, dan akhirnya menempelkan uuid p.

Apakah ada cara untuk :rlangsung setelah kursor tanpa makro / keybinding ini yang membuang register?


sumber
1
Pertanyaan SU , juga dengan solusi seperti ini.
muru

Jawaban:

8

Anda dapat menggunakan register ekspresi "=dan system():

<C-r>=system("uuidgen | tr -d '\n'")<CR>

Akan terlihat seperti itu dalam pemetaan mode penyisipan:

inoremap <key> <C-r>=system("uuidgen | tr -d '\n'")<CR>

atau, dengan pemetaan ekspresi:

inoremap <expr> <key> system("uuidgen \| tr -d '\n'")
romainl
sumber
5

Dari mode penyisipan, Anda dapat menekan Ctrl-R, lalu ketik:

=system('uuidgen')

Perhatikan bahwa ini akan menambahkan baris tambahan, karena itulah yang uuidgendihasilkan; untuk memperbaiki ini, kita dapat menggunakan:

=system('uuidgen')[:-2]

Untuk menghapus baris baru.

Dari :help i_CTRL-R:

Masukkan konten register. Antara mengetik CTRL-R dan karakter kedua, '"' akan ditampilkan untuk menunjukkan bahwa Anda diharapkan memasukkan nama register.

[..]

'=' register ekspresi: Anda diminta untuk memasukkan ekspresi (lihat ekspresi)

Untuk mengikat ini agar Ctrl-umenyukai contoh Anda, Anda dapat menggunakan:

nnoremap <C-u> i<C-r>=system('uuidgen')[:-2]<CR><Esc>
Martin Tournoij
sumber
2

Satu lagi, dengan :python:

:py import uuid, vim; vim.command(':normal i' + str(uuid.uuid1()))

Anda dapat memetakan sebagai:

:inoremap <key> <esc>:py import uuid, vim; vim.command(':normal a' + str(uuid.uuid1()))<cr>a

UUID dihasilkan oleh modul Python UUID .

muru
sumber
1
Ini adalah cara yang agak bengkok untuk dilakukan.
muru
0

Ini mungkin kurang disukai daripada menggunakan solusi pure-vim, namun, jika Anda menggunakan manajer snippet seperti Ultisnips maka Anda bisa mencoba menambahkan snippet seperti berikut:

snippet uuid "insert new uuid" w
`uuidgen`
endsnippet

Dengan cara ini Anda bisa mengetik uuid dan menekan pemicu ekspansi Anda dalam mode insert dan uuidakan diganti dengan output dari perintah shell yang relevan. Ini, tentu saja, dapat dengan mudah diadaptasi untuk perintah lain dan diperluas dengan cara yang kuat seperti yang diuraikan dalam dokumen Ultisnips.

Simut
sumber