ฉันสามารถทำสิ่งที่มีการโต้ตอบ: การแทนที่ (การค้นหาและแทนที่) ได้หรือไม่?


17

บางครั้งฉันใช้:sกับ regexp ที่ซับซ้อนซึ่งอาจหรืออาจไม่ถูกต้องหรือไม่แน่ใจว่าฉันต้องการแทนที่การแข่งขันทั้งหมดหรือไม่

มีวิธีใดบ้างที่ฉันสามารถบอกให้ Vim ยืนยันการแข่งขันทุกครั้งที่พบก่อนที่จะแทนที่ข้อความจริงหรือไม่

คำตอบ:


20

ใช่ ใช้ธงc :substituteจาก: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}

ตัวอย่างการใช้งานง่ายเหมือนพาย:

%s/old/new/c

สิ่งนี้มีประโยชน์มาก แต่ไม่รู้เกี่ยวกับสิ่งนี้จนถึง 2 สัปดาห์ที่ผ่านมา :-) และยังมีให้บริการใน ol 'vi :-)

เคล็ดลับโบนัส: คุณอาจต้องการใช้:set nowrapscan; สิ่งนี้จะป้องกันไม่ให้ Vim ห่อขึ้นไปด้านบนเมื่อกระทบกับด้านล่าง ฉันพบว่าสิ่งนี้มีประโยชน์อย่างยิ่งเมื่อใช้cแฟล็ก


19

นอกจากสิ่งที่ Carpetsmoker พูดไว้:

การตั้งค่า&incsearch( set incsearch) ใน Vim มีประโยชน์จริง ๆ คุณสามารถใช้มันพร้อมกับเคล็ดลับที่มีประโยชน์และเป็นที่รู้จักน้อย

เคล็ดลับคือการลองใช้ regex ที่ซับซ้อนของคุณเพียงแค่ใช้คำสั่ง/หรือ ?เป็นกลุ่มจะใช้การ&incsearchตั้งค่าเพื่อแสดงการแข่งขันแบบโต้ตอบ เมื่อคุณพอใจกับ regex แล้วคุณสามารถใช้:%s//replacementเพื่อให้ vim ใช้การค้นหาก่อนหน้า

สังเกตว่าส่วนใน//นั้นว่างเปล่า (นั่นคือที่ที่คุณใส่ข้อความเพื่อค้นหา) หากคุณเว้นว่างไว้คุณกำลังบอกให้ Vim ใช้ regex การค้นหาก่อนหน้า ด้วยสิ่งนี้คุณสามารถพิมพ์ regex ที่ซับซ้อนด้วย/และมีประโยชน์ทั้งหมดset incsearchจากนั้นใช้%s//replacementคำสั่งเพื่อดำเนินการค้นหาและแทนที่จริง ๆ

หากคุณต้องการสิ่งที่คล้ายกับ incsearch สำหรับ:sคำสั่งลองใช้vim-overแต่ฉันชอบใช้วิธี Vim ดั้งเดิม


ฉันเคยใช้ตัวแปรนี้: เพียงแค่ใช้:%s/pattern/replace/แล้วกดuเพื่อเลิกทำคุณจะเห็นชิ้นส่วนที่ Vim เปลี่ยนหากคุณhlsearchเปิดใช้งาน ^Rและคุณสามารถแทนที่ข้อความนี้อีกครั้งกับ
Martin Tournoij

7

เปลี่ยนตัวโต้ตอบโปรดของฉันคือการค้นหาโดยใช้และผ่านการแข่งขันโดยใช้/n

จากนั้นเลือกจับคู่ใช้gnแล้วsเพื่อใช้แทนข้อความที่มีสิ่งที่ผมชอบ

และทำซ้ำโดยเลื่อนไปยังแมตช์ถัดไปและกด.


นี่คือเคล็ดลับที่ดีมากเพราะมันเป็น (1) การโต้ตอบและ (2) คุณสามารถไปแข่งขันก่อนหน้านี้ถ้าคุณตั้งใจข้ามมัน (บางสิ่งบางอย่างที่คุณไม่สามารถทำโดยใช้:s/old/new/gc)
Ayrat


1

เพื่อประโยชน์ของทุกคนincsearchได้รับการอัพเดตใน vim8 เพื่อแสดงตัวอย่างเมื่อคุณพิมพ์รูปแบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.