Apakah ada jalan pintas untuk menggunakan kembali istilah pencarian untuk menemukan dan mengganti?

8

Saya pikir ada kemungkinan yang berbeda pertanyaan ini telah ditanyakan, tetapi saya tidak dapat menemukannya.

Jika saya melakukan sesuatu seperti :s/foo/bar/gdan kemudian saya ingin menyebutnya lagi di baris berikutnya tetapi dengan bazalih - alih bar, apakah ada cara yang lebih cepat untuk melakukan itu? Saya merasa &bazharus bekerja, tetapi tidak.

Eli Sadoff
sumber

Jawaban:

11

Bukan apa yang Anda minta, tetapi Anda bisa melakukannya:

:s/foo/bar/g

Lalu:

:s//baz/g

Anda dapat menggunakannya karena ketika Anda menggunakan :spola yang dicari disimpan dalam register pencarian. Yang bisa Anda lihat :reg /.


Pekerjaan dalam proses: Anda dapat mempercepat alur kerja Anda dengan:

nnoremap && :s<UP><C-F>F/cT/

Dan gunakan seperti ini:

:s/foo/bar/g

lalu

&&baz<CR>

Membusuk:

nnoremap &&         " define a new mapping
:s<UP>              " get the last :s command in the history
<C-F>               " use this command in the cmdline window
F/                  " go back to the last /
cT/                 " change back up to the last /

Beberapa catatan:

  • Ini tidak akan berfungsi jika Anda tidak memiliki bendera apa pun
  • Ini tidak akan berfungsi jika Anda tidak memiliki string pengganti
  • Ini harus bekerja sebaliknya

(beri tahu saya jika saya bisa memperbaikinya).

Beberapa bacaan:

  • :h cmdline-window
  • :h c_CTRL-F
nobe4
sumber
2
Itu jelas lebih baik daripada apa yang saya lakukan sebelumnya. Saya akan menerimanya bahwa sayangnya mungkin tidak ada cara yang lebih cepat :(.
Eli Sadoff
Bukan AFAIK, dan saya mencoba membuat pemetaan yang melakukan apa yang Anda inginkan, tetapi di luar kotak saya cukup yakin Anda terbatas untuk mengetik lagi ekspresi pengganti
nobe4
5

Selain jawaban @ nobe4, Damian Conway memiliki dua pemetaan yang cukup menarik untuk mempercepat pencarian dan mengganti tindakan. Mereka datang dari sini bagaimana saya wawancara yang benar-benar layak dibaca sepenuhnya.

Mengutipnya:

[...] Saya menemukan saya selamanya melakukan pencarian dan penggantian global (yaitu :%s/X/Y/g<CR>), jadi saya menghilangkan pengetikan berulang-ulang dengan mencuri perintah (oleh saya) yang tidak pernah digunakan S:

nmap  S  :%s//g<LEFT><LEFT>

Sekarang saya hanya perlu mengetik: SX / Y

Tapi kemudian saya mulai memperhatikan seberapa sering saya melakukan -saya untuk beberapa pola dan, setelah melihat melalui pertandingan, kemudian ingin secara global mengganti mereka semua. Bahkan dengan pemetaan S yang repetisi lebih menyebalkan: pertama lakukan pencarian: / pola kemudian lakukan penggantian: Spattern / replacement Jadi saya mencuri (juga tidak pernah digunakan oleh saya) perintah M untuk itu:

nmap <expr>  M  ':%s/' . @/ . '//g<LEFT><LEFT>'

Sekarang hanya: lakukan pencarian: / pola lalu ganti semua kecocokan: Mreplacement


Untuk menjawab pertanyaan Anda, saya kira Anda bisa sedikit memodifikasi pemetaan pertama untuk sesuatu seperti ini:

nmap  S  :s///g<LEFT><LEFT>

Dengan cara ini Anda dapat melakukan substitusi terlebih dahulu :s/foo/bar/g, pergi ke baris berikutnya, tekan Sdan Anda akan mendapatkan: di :s//|/gmana |kursor, sekarang Anda dapat mengetik subtitusi baru Anda.

statox
sumber