Dalam vim, saya kadang-kadang memiliki kesempatan untuk mengganti beberapa kejadian pertama pertandingan pada satu baris, tetapi tidak semua orang seperti g
itu. misalnya:
a a a a a
untuk
b b b a a
Saya tahu saya bisa menggunakan :s/a/b/[enter]:[up][enter]:[up][enter]
, tapi itu cukup membosankan di tiga pengulangan, saya memiliki garis dengan berpotensi pengganti 10+.
Saya sudah mencoba:
:s/a/b/3g
: vim mengeluh tentang karakter yang tertinggal.:s/a/b/3
: mengubah kemunculan pertama pada ini dan dua baris berikut.3:s/a/b
: sama seperti sebelumnya.:s/a/b/g3
: mengubah semua kemunculan pada ini dan dua baris berikutnya.:3s/a/b
: mengubah kejadian pertama pada baris 3.:/a/,3/a/s/a/b
: mengubah kemunculan pertama pada setiap baris antara baris berikutnyaa
dan ketiga yang berisia
dalam file (diminta untuk membalikkan jika perlu).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: mengubah kemunculan pertama pada setiap baris antara ini dan berikutnya dengan 3a
detik di atasnya (dan ini tidak akan mudah diperluas ke pencarian multi-karakter).
Dan berbagai pola pengalamatan lainnya, tidak ada yang berhasil. Saya harus mengatakan, saya telah belajar cukup banyak tentang :s
perintah yang mencoba menemukan jawaban untuk masalah ini, tetapi saya masih belum menyelesaikannya.
Adakah yang tahu bagaimana melakukan ini?
(poin bonus untuk rentang tertentu, misalnya kejadian kedua hingga keempat)
n
dan.
, meskipun saya tidak berpikir untuk menggunakannya di sini. Tentu saja perbaikan, terima kasih.s/a/=something/
harus melakukan trik (:help sub-replace-=
). Saya tidak cukup lancar dalam Vim untuk menulissomething
langsung dari kelelawar.:[up][enter]
dapat diganti dengan&
, yang masih tidak ideal tetapi setidaknya kurang menyakitkan.Jawaban:
Membangun
:s/pattern/replacement/gc
ide dari Samus_ (yang tampaknya menjadi cara paling sederhana untuk memastikan operasi yang benar ketika pola terkandung dalam string pengganti), untuk mengganti kejadian 2 hingga 4 pada satu baris:feedkeys()
adalah fungsi yang memasukkan string input ke antrian input keyboard. Intinya adalah melakukan penghitungan dimuka sehingga Anda tidak perlu khawatir kehilangan hitungan atau terganggu.Untuk kasus yang lebih umum, untuk mengganti Mth hingga Nth kejadian pada satu baris untuk N lebih besar atau sama dengan M yang sangat besar :
Ganti M dan N dengan nilai yang Anda inginkan (Anda bahkan dapat membiarkan
vim
melakukan aritmatika mental sepele jika Anda tidak ingin melakukannya sendiri). Perhatikan bahwa.
adalah operator penggabungan string VimL. Jelas ini hanya menghemat penekanan tombol untuk M besar . Jika Anda sering menggunakan fungsi ini, mungkin akan menghemat waktu Anda untuk memasukkan perintah atau fungsi khusus semacam itu di atas, karena cukup sedikit untuk diketik.sumber
Untuk pertanyaan pertama yang akan saya lakukan:
Yang kedua lebih rumit, saya tidak tahu cara melakukannya secara otomatis tetapi Anda dapat membuat vim meminta Anda pada setiap pertandingan seperti ini:
Kemudian Anda menjawab "tidak" pada n yang pertama cocok dan "ya" kepada yang lain.
sumber
c
, itu mungkin solusi terbaik yang diusulkan. Saya masih harus menghitung, tapi saya pikir itu adalah opsi pertama yang akan bekerja dengan penggantian yang berisi string pencarian.sumber
Saya pikir ini mungkin berhasil, ganti dulu, lalu ulangi 2 kali:
sumber