Etkileşimli yapabilir miyim: yedek (arama ve değiştirme)?


17

Bazen :sdoğru olabilecek veya olmayabilecek karmaşık bir normal ifade ile veya tüm eşleşmeleri değiştirmek isteyip istemediğimden emin değilim .

Vim'e, metnin yerini almadan önce bulduğu her eşleşmeyi onaylamasını söyleyebilmemin bir yolu var mı?

Yanıtlar:


20

Evet! İçin cişaretini kullanın :substitute. Gönderen :help substitute:

[c]     Confirm each substitution.  Vim highlights the matching string (with
        hl-IncSearch).  You can type:                           :s_c
            'y'     to substitute this match
            'l'     to substitute this match and then quit ("last")
            'n'     to skip this match
            <Esc>   to quit substituting
            'a'     to substitute this and all remaining matches {not in Vi}
            'q'     to quit substituting {not in Vi}
            CTRL-E  to scroll the screen up {not in Vi, not available when
                        compiled without the +insert_expand feature}
            CTRL-Y  to scroll the screen down {not in Vi, not available when
                        compiled without the +insert_expand feature}

Örnek kullanım pasta gibi basit:

%s/old/new/c

Bu çok faydalı, ancak 2 hafta öncesine kadar bunu bilmiyordum :-) Ve hatta 'vi :-)' da bile mevcut

Bonus ipucu: Ayrıca kullanmak isteyebilirsiniz :set nowrapscan; bu, Vim'in dibe vurduğunda üste sarılmasını önler. Bayrağı kullanırken özellikle yararlı buldum c.


19

Carpetsmoker'in söylediklerine ek olarak:

&incsearch( set incsearchVim) ayarı gerçekten yararlıdır. Yararlı ve az bilinen bir numara ile birlikte kullanabilirsiniz.

İşin püf noktası sadece /veya ?komutunu kullanarak karmaşık normal ifadenizi denemektir . Vim, &incsearcheşleşmeleri etkileşimli olarak göstermek için ayarı kullanacaktır . Normal ifadeden memnun olduğunuzda, vim'in :%s//replacementönceki aramayı kullanmasını sağlamak için kullanabilirsiniz.

İçindeki parçanın //boş olduğuna dikkat edin (metni aramaya koyduğunuz yer budur). Boş bırakırsanız, Vim'e önceki arama normal ifadesini kullanmasını söylersiniz. Bununla, karmaşık bir regex yazabilir /ve tüm avantajlarından yararlanabilir set incsearchve daha sonra %s//replacementaramayı yürütmek ve değiştirmek için komutu kullanabilirsiniz .

:sKomutlar için incsearch'e benzer bir şey istiyorsanız , vim- over'e bakın , ancak sadece yerel Vim yolunu kullanmayı tercih ediyorum.


Eskiden bunun bir varyantını kullanıyordum: Sadece geri al için :%s/pattern/replace/tuşuna basın ve sonra tuşuna basın u, hlsearchetkinleştirdiyseniz Vim'in değiştirdiği parçaları görebilirsiniz . Ve bu metni tekrar ile değiştirebilirsiniz ^R.
Martin Tournoij

7

Benim favori etkileşimli ikame etmektir arama kullanarak /ve kullanmadan maçları geçmesi n.

Ardından metni istediğimle değiştirmek için ve tuşlarını kullanarak eşleştir'i seçin .gns

Ve bir sonraki maça geçip tuşuna basarak tekrarlayın ..


Bu çok güzel bir hile, çünkü: (1) interaktif, (2) yanlışlıkla atladıysanız önceki maça gidebilirsiniz (kullanarak yapamayacağınız bir şey :s/old/new/gc).
Ayrat


1

Herkesin yararına incsearch, deseni yazarken önizlemeyi göstermek için vim8'de güncellendi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.