Langsung ke kemunculan kata yang baru saja saya ubah

12

Jika saya memiliki yang berikut ini:

function foo(bar) {
    return bar + 1;
}

Dan saya menggunakan cwuntuk mengubah yang pertama baruntuk baz, bagaimana cara melompat ke pencocokan berikutnya bar, sehingga saya dapat menggunakan .untuk membuat perubahan yang sama?

Saya tidak dapat menggunakan *, karena itu mencari kata saat ini di bawah kursor, dan saya bodoh tidak mencari untuk barpertama kalinya, jadi ntidak akan berfungsi.

Adakah cara sederhana untuk mencari kemunculan kata berikutnya seperti sebelum saya mengubahnya?

Saya tidak ingin melakukan pencarian dan penggantian, karena ada kejadian lain bardalam file saya yang tidak ingin saya ubah, atau karena hanya ada dua contoh bar, dan saya lupa :%s/bar/baz/sebelum saya mulai dan itu juga banyak upaya untuk mengubah contoh yang tersisa.

Roger Lipscombe
sumber
2
Itu tidak sepenuhnya mengikuti alur kerja yang Anda jelaskan tetapi vim-oblique meningkatkan *pencarian. Terutama itu membuat *secara visual memilih kata saat ini tanpa menggerakkan kursor Anda. Setelah terinstal, Anda bisa melakukan *ciwuntuk memasukkan kata lama di register pencarian dan mengubah kata. Maka Anda bisa menggunakan ndan ..
statox
Menekan n akan memindahkan Anda ke pola berikutnya yang dicari terakhir. Kenapa kamu tidak mencobanya?
SibiCoder
... karena saya tidak mencari untuk sampai ke kejadian pertama, jadi ntidak akan berhasil.
Roger Lipscombe

Jawaban:

14

Teks yang baru saja Anda ubah dengan cwdipotong menjadi register yang tidak disebutkan namanya sehingga Anda dapat menggunakannya kembali dengan:

/<C-r>"<CR>

untuk beralih ke teks berikutnya yang tercakup oleh perubahan terakhir Anda.

romainl
sumber
5

Untuk memperluas romainl sebagai alur kerja yang lengkap ...

Jika Anda lebih suka melakukan pengeditan semacam ini dan kemudian menyadari bahwa Anda perlu menerapkan pengeditan yang sama pada paragraf / fungsi Anda dapat menggunakan "dan .mendaftar.

Dalam contoh Anda, Anda dapat melakukan pengeditan awal argumen. Jika Anda memasuki mode visual (saya akan menggunakan Visual Line hanya untuk memastikan Anda memilih semuanya dengan benar) dan kemudian menerapkan pencarian dan ganti.

V]] - Visual Line, hingga akhir paragraf / fungsi.

  • : - Karena Anda berada dalam mode visual ini menjadi :'<,'>
  • s/ - Temukan
  • CTRL+ "- terakhir mencabut / menghapus item (bilah pada contoh)
  • / - dan Ganti
  • CTRL+ .- sisipan terakhir (baz pada contoh)

Pola ini membutuhkan waktu agak lama untuk terbiasa karena Anda harus menggunakannya. Sebagian besar waktu Anda hanya ingin menerapkan menemukan dan mengganti ke seluruh fungsi termasuk argumen, tetapi itu cara yang bagus untuk tidak melakukan anti-pola "Kerjakan, sadarilah Anda seharusnya melakukannya dengan lebih baik, membatalkan dan mengulang benar."

jecxjo
sumber
2

Jika Anda tidak keberatan menekan kombinasi yang berbeda dari cw, maka saya yakin Anda bisa mendapatkan apa yang Anda inginkan dengan mudah, dengan menetapkan pintasan. Yang dapat Anda lakukan adalah menempatkan yang berikut ini

nmap <leader>a "1yiw:let @/=@1^Mciw

dalam .vimrcfile Anda . Perhatikan bahwa itu ^M adalah kunci ambil kembali, dan bukan karakter ^dan M. Anda mendapatkannya dengan menekan Ctrl+ Vdalam mode insert diikuti oleh Enter. Sekarang, dengan ini didefinisikan, menekan <leader>aakan melakukan hal yang sama cw, tetapi sekarang kata (sebelum perubahan) akan ada di "register pencarian terakhir" Anda (yaitu, /register), jadi menekan nsetelah Anda melakukan perubahan dan kembali ke mode normal akan membawa Anda ke kejadian berikutnya. Demikian juga, menekan Nakan membawa Anda ke kejadian sebelumnya.

Jalan pintas Anda tentu saja dapat memilih jalan pintas yang berbeda dari <leader>a, tetapi saya hanya menemukan bahwa ini adalah jalan pintas yang sangat mudah diakses. Secara pribadi saya telah menetapkan <leader>untuk ,sehingga saya hanya perlu pers ,diikuti oleh a, tapi ini karena saya tidak menggunakan keyboard Amerika, sehingga saya \tersembunyi agak (saya percaya \adalah default <leader>).

Penjelasan Idenya sangat sederhana. Tarik kata di bawah kursor ke register pencarian /lalu lakukan cw. Begitulah nmap <leader>a "/yciwyang saya tuju, tapi sayangnya saya tidak berpikir bahwa Anda dapat menarik ke register pencarian, jadi solusinya adalah untuk menarik kata di bawah kursor ke 1register, kemudian mengatur /register sama dengan itu, dan kemudian lakukan cw. Jadi "1yiwadalah bagian yang menarik kata dalam di bawah kursor ke register 1. Jika Anda tidak tahu kata-kata batiniah, Anda bisa melihatnya :help iw. Setelah itu, :let @/=@1diikuti dengan penangkapan Entermemasukkan isi 1register ke dalam /. Pada titik ini ndanNberfungsi sebagai kemunculan kata di bawah kursor berikutnya dan sebelumnya, dan kemudian ciwdilakukan agar kata di bawah kursor dihapus dan Vim dimasukkan ke dalam mode penyisipan.

kata versus kata dalam Saya baru menyadari bahwa saya berasumsi bahwa Anda menginginkan seluruh kata di bawah kursor, dan bukan hanya dari sudut kursor dan seterusnya. Inilah mengapa saya menggunakan iwbukannya di wmana - mana. Jika ini bukan masalahnya, maka Anda harus menggunakan

nmap <leader>a "1yw:let @/=@1^Mcw

sebagai gantinya. Jika kursor berada pada huruf pertama dari kata tersebut, tidak ada perbedaan.

disclaimer Solusi ini mungkin tidak akan bekerja dengan baik jika Anda mencoba untuk menggunakannya pada sesuatu yang mengandung hal-hal yang berbeda dari huruf, misalnya dengan memiliki berdiri kursor pada \atau dengan mengganti iwdengan iW, ib, isatau ipatau sesuatu (meskipun saya tidak tahu mengapa Anda ingin fitur ini dengan seluruh kalimat)

Kristian
sumber