Bagaimana cara mengganti lebih dari satu karakter tanpa memasuki mode insert

12

Saya memiliki file dengan garis yang terlihat seperti ini:

foofoo.xy.barbar

Saya ingin mengubah xyke gh. Saya mencoba melakukan 2r-> gh, tetapi jelas itu tidak berhasil, karena menggantikan xydengan ggdan kemudian memindahkan kursor saya satu tempat ke kiri.

Apakah ada cara untuk melakukan ini tanpa memasuki mode memasukkan, atau tanpa menggunakan lebih banyak penekanan tombol (misalnya :s/xy/gh/)?

durron597
sumber
2
Rmemasuki Mode Ganti. :help replace-modeuntuk informasi lebih lanjut.
alxndr
Saya mencoba vt.rgh. Tetapi hasilnya sama dengan milik Anda kecuali untuk posisi kursor.
Gonçalo Ribeiro
2
Mengapa Anda tidak ingin masuk ke mode penyisipan? Sesuatu seperti cwgh<esc>akan bekerja dengan baik.
Gagang pintu
1
@ durron597 Saya tidak yakin jika minimize-keystrokesadalah tag yang baik, itu biasanya tidak benar-benar apa pertanyaannya adalah tentang , seperti itu. (Saya menolak suntingan yang Anda sarankan) ... Mungkin Anda harus mendiskusikannya di meta?
Martin Tournoij

Jawaban:

19

Jika teks baru memiliki panjang yang sama dengan teks lama, mode ganti Vim adalah opsi. Dari mode normal, R(itu huruf besar "r") membawa Anda ke mode ganti. Ini mirip dengan "menimpa" di beberapa editor teks lain: alih-alih memasukkan karakter baru seperti dalam mode memasukkan, mengetik akan menggantikan karakter di bawah kursor, dan kemudian maju ke kursor berikutnya. (Anggap saja huruf kecil r, tetapi untuk lebih dari satu karakter pada satu waktu.) Temukan dokumentasi untuk mengganti mode dengan :help replace-mode.

Dalam kasus Anda: dengan kursor di antara .dan x, masuk untuk mengganti mode dengan menekan R. Sekarang ketika Anda mengetiknya gmenggantikan "x" dan pindah ke karakter berikutnya, sehingga Anda dapat mengetik huntuk mengganti "y". Suntingan Anda selesai sekarang, jadi Escapeuntuk kembali ke mode normal.

(Ini berfungsi ketika teks pengganti Anda memiliki panjang yang sama dengan teks yang lama, tetapi jika penggantian Anda lebih panjang atau lebih pendek, cmungkin itu yang Anda butuhkan: teks itu akan menggantikan 1 teks dalam suatu gerakan, dengan teks yang Anda ketik lalu ketik. banyak cara untuk melakukan penggunaan c, misalnya: dengan kursor antara .dan x, ct.ABCEscapemengatakan untuk c hange teks (up ' t il berikutnya .) dengan 'ABC').


1 Ini akan menarik teks dalam gerakan ke dalam "register / tidak disebutkan namanya dan kemudian beralih ke mode insert, sehingga Anda dapat mengetik sesuatu untuk menggantikannya, dan kemudian Escapekembali ke mode normal.

alxndr
sumber
2
Ini berfungsi untuk kasus ini. Bagaimana jika Anda ingin mengganti 2 karakter itu dengan mengatakan 3 karakter?
Gonçalo Ribeiro
1
Pertanyaan bagus; diubah untuk menyertakan cara untuk menangani teks panjang berbeda.
alxndr
Ya, saya tahu seperti itu. Tetapi dengan begitu Anda memasuki mode Sisipkan dan saya ingin tahu apakah ada cara untuk tidak menggunakan mode Sisipkan dalam kasus itu. Bukannya saya pikir itu sangat berguna (namun saya bisa saja salah).
Gonçalo Ribeiro
1
Awalan dengan angka nuntuk mengganti hingga nkemunculan-ke-10 dari karakter target. Ini berguna untuk mengganti bagian label dengan format w_x_y_zdan a-b-c-d. Gunakan falih-alih tuntuk menghapus karakter pembatas juga.
pkfm
5

Ada beberapa cara Anda bisa melakukan ini, tetapi yang paling sederhana yang dapat saya pikirkan adalah:

TL; DR

fxcw<REPLACEMENT TEXT>

Penjelasan

  • fxmelompat Anda ke x (lihat help *f*)
  • cwmengatakan untuk mengubah kata (lihat :h *c*,, :help *w*dan :help cwuntuk informasi lebih lanjut), menghapus teks "xy" dan memasuki mode sisipkan, membiarkan Anda meletakkan apa pun yang Anda inginkan di sana.
  • <REPLACEMENT TEXT> adalah apa pun yang ingin Anda gantikan dengan - "gh" pada contoh Anda.

Satu keuntungan dari pendekatan ini adalah ia menggunakan perintah manipulasi & navigasi teks yang sangat umum digunakan. Yang lain adalah "xy" bisa panjang, dan ini masih bekerja.

The cwkarya karena objek teks Anda dikelilingi oleh periode ( .), yang bertindak sebagai batas dengan kata.

Jika kursor Anda sudah pada karakter "y" (atau karakter apa pun dalam teks yang akan diganti), Anda bisa menggunakan ciw<REPLACEMENT TEXT>. Ini memberitahu vim untuk mengubah kata Anda, bahkan jika Anda tidak di awal. Lihat :help text-objectsuntuk informasi lebih lanjut tentang ciwdan objek teks secara umum.

Polling Cody
sumber
tidakkah ini akan menempatkannya dalam mode sisipan?
elyashiv
1
Ah - tidak menangkap bagian dari pertanyaannya. Dalam hal itu, ya - R adalah solusi yang paling tepat.
Polling Cody
3

Ganti mode:

Rgh<Esc>

adalah solusi yang paling jelas jika penggantiannya sama dengan yang asli tetapi Anda juga bisa melakukannya:

2sgh<Esc>

atau:

cegh<Esc>
romainl
sumber