Memetakan dengan gerakan

12

Saya mencoba memahami bagaimana saya bisa menggunakan operator dengan gerakan selanjutnya di dalam pemetaan. Sebagai contoh:

nmap /c c{here we pending for a motion}/<C-r>"<CR>

Peta harus melakukan hal berikut:

  1. Aktifkan coperator dan dengarkan gerakan selanjutnya;
  2. Misalnya, saya bisa mengetik di sini t,untuk mengubah semuanya sebelum koma berikutnya;
  3. Pergi ke mode insert menghapus semua antara kursor dan koma;
  4. Teks yang dihapus secara otomatis dicari sebagai suatu pola

Jadi sederhananya, setelah teks gerak dihapus, saya meninggalkan dalam mode memasukkan dengan kejadian yang disorot dari teks yang dihapus. Saya akan sangat berterima kasih jika seseorang membantu saya untuk memecahkan kasus ini.

MEMPERBARUI

Jawabannya hampir seperti yang saya inginkan. Tapi! Saat saya menekan /cw, ketikkan sesuatu sebagai ganti kata, lalu tekan <Esc>. Setelah saya berharap untuk melakukan hal yang sama dengan kejadian selanjutnya. Tetapi setelah presing n(pergi ke kejadian berikutnya) dan .(ulangi perintah terakhir) hanya menambahkan teks yang terakhir diketik alih-alih menggantinya. Tujuan utama pemetaan adalah menggunakannya dengan n/Ndan .mengulangi. Apakah saya melewatkan sesuatu?

Timur Fayzrakhmanov
sumber

Jawaban:

9

vim mendukung pemetaan operator :h map-operator.

Yang Anda butuhkan adalah operatorfunc, dan pemetaan. untuk kebutuhan Anda, kode berikut berfungsi. Yah itu hanya sebuah contoh, Anda memperbaiki lebih lanjut.

nmap  <silent> /c :set opfunc=SpecialChange<CR>g@
function! SpecialChange(type)
    silent exec 'normal! `[v`]d'    
    silent exec 'let @/=@"' 
    startinsert
endfunction

Perhatikan bahwa exec 'let @/=@"'hanya untuk menyorot kode dalam buffer. Jika Anda tidak ingin melihat sorotan langsung, Anda bisa sajalet @/=@"

Kent
sumber
Saya sudah memperbarui pertanyaan saya. Sepertinya jawaban Anda adalah yang paling dekat dengan kebutuhan saya, tetapi tidak melakukan hal yang sama dengan kejadian berikutnya, jadi saya sudah menjelaskan momen itu dalam pertanyaan.
Timur Fayzrakhmanov
Anda memiliki dua operator ( /cdan i) yang .baru saja mengulang yang terakhir. Jika Anda ingin memperpanjangnya, periksa repeatplugin. @TimurFayzrakhmanov juga ada :gdan :sperintah, dapat membantu Anda juga.
Kent
Apakah ada yang aneh "dalam kode Anda 'let @/=@""'? Saya pikir itu mungkin, misalnya silent exec 'normal! [v ]c', karena coperator melakukan apa yang saya harapkan, kecuali itu tidak menambahkan teks yang diubah ke pola pencarian.
Timur Fayzrakhmanov
1
@TimurFayzrakhmanov "" adalah kesalahan ketik .. memperbaiki .. Saya datang dengan cjuga, namun menambahkan spasi, karena ada perubahan mode n-i-n-isaya kira ... melakukan beberapa tes yang akan Anda lihat.
Kent
@TimurFayzrakhmanov Anda dapat membuatnya berulang tanpa plugin dengan mengubah dke ydan startinsertke call feedkeys("cgn", 'n')(lihat jawaban saya di bawah ini)
Jerome Dalbert
4

Lebih mudah untuk mengimplementasikan (dan mendokumentasikan) pemetaan kompleks dengan menggunakan fungsi:

function! DoMagic()
   execute "normal! d".input("enter motion: ")
   let @/=@"
   startinsert
endfunction

Kemudian buat panggilan pemetaan Anda fungsi itu:

nmap /c :call DoMagic()<CR>

Edit:

Jika tujuan Anda adalah untuk melakukan pencarian & mengganti di sejumlah besar tempat Anda harus mencoba perintah pengganti: :s. Anda dapat mengubah pemetaan Anda untuk menyalin pilihan visual ke pola pencarian:

function! DoMagic2()
   normal! gv"ay
   return @a
endfunction

vmap /c :<c-w>%s/<C-r>=DoMagic2()<CR>//gc<left><left><left>
mMontu
sumber
1
ini bahkan dengan UI "baik", berfungsi untuk kebutuhan OP, dan bisa "lebih" dari yang diharapkan, tergantung pada apa yang Anda masukan. Misalnya ketika orang melihat enter motion:, dia memberi: t,ggVGJZZ ^ _ ^ Ini adalah masalah umum untuk penggabungan perintah
Kent
Itu hampir apa yang saya inginkan. Misalnya: Saya menekan /cwlalu mengetikkan sesuatu sebagai ganti kata, lalu tekan <Esc>. Setelah saya ingin melakukan hal yang sama dengan kejadian selanjutnya. Tetapi setelah presing n(pergi ke kejadian berikutnya) dan .(ulangi perintah terakhir) hanya menambahkan teks yang terakhir diketik alih-alih menggantinya. Tujuan utama pemetaan adalah menggunakannya dengan n/Ndan .mengulangi. Apakah saya melewatkan sesuatu?
Timur Fayzrakhmanov
1
Fungsi ini untuk memperjelas ide menggunakan fungsi saat Anda mengalami masalah dengan pemetaan yang kompleks. Anda harus mengubahnya untuk memenuhi kebutuhan Anda; coba ikuti saran Kent untuk .mengulangi perintah Anda.
mMontu
Terima kasih atas jawabannya. Ini berguna juga, tetapi saya menerima @Ken satu, karena itu bergerak segera setelah saya mengetiknya (tanpa menunggu <CR>dari input()).
Timur Fayzrakhmanov
1
@TimurFayzrakhmanov Anda juga dapat mencoba penggantinya, seperti yang dijelaskan dalam pembaruan.
mMontu
1

Solusi ini bekerja dengan "repeat the last command" (alias .):

nmap <silent> /c :set opfunc=ChangeOccurence<CR>g@

function! ChangeOccurence(type)
  exec 'normal! `[v`]y'
  let @/ = @"
  call feedkeys('cgn', 'n')
endfunction

Saat mengulang, Anda bahkan tidak perlu menggunakan n, Anda bisa .langsung mengambil dan mengganti kejadian berikutnya jika Anda ingin lebih cepat.

Secara opsional, jika Anda suka memiliki highlight dari kata-kata yang cocok, Anda dapat menggantinya 'cgn'dengan 'n``cgn'.

Jerome Dalbert
sumber