บางครั้งฉันใช้:sกับ regexp ที่ซับซ้อนซึ่งอาจหรืออาจไม่ถูกต้องหรือไม่แน่ใจว่าฉันต้องการแทนที่การแข่งขันทั้งหมดหรือไม่
มีวิธีใดบ้างที่ฉันสามารถบอกให้ Vim ยืนยันการแข่งขันทุกครั้งที่พบก่อนที่จะแทนที่ข้อความจริงหรือไม่
บางครั้งฉันใช้:sกับ regexp ที่ซับซ้อนซึ่งอาจหรืออาจไม่ถูกต้องหรือไม่แน่ใจว่าฉันต้องการแทนที่การแข่งขันทั้งหมดหรือไม่
มีวิธีใดบ้างที่ฉันสามารถบอกให้ Vim ยืนยันการแข่งขันทุกครั้งที่พบก่อนที่จะแทนที่ข้อความจริงหรือไม่
คำตอบ:
ใช่ ใช้ธง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แฟล็ก
นอกจากสิ่งที่ Carpetsmoker พูดไว้:
การตั้งค่า&incsearch( set incsearch) ใน Vim มีประโยชน์จริง ๆ คุณสามารถใช้มันพร้อมกับเคล็ดลับที่มีประโยชน์และเป็นที่รู้จักน้อย
เคล็ดลับคือการลองใช้ regex ที่ซับซ้อนของคุณเพียงแค่ใช้คำสั่ง/หรือ ?เป็นกลุ่มจะใช้การ&incsearchตั้งค่าเพื่อแสดงการแข่งขันแบบโต้ตอบ เมื่อคุณพอใจกับ regex แล้วคุณสามารถใช้:%s//replacementเพื่อให้ vim ใช้การค้นหาก่อนหน้า
สังเกตว่าส่วนใน//นั้นว่างเปล่า (นั่นคือที่ที่คุณใส่ข้อความเพื่อค้นหา) หากคุณเว้นว่างไว้คุณกำลังบอกให้ Vim ใช้ regex การค้นหาก่อนหน้า ด้วยสิ่งนี้คุณสามารถพิมพ์ regex ที่ซับซ้อนด้วย/และมีประโยชน์ทั้งหมดset incsearchจากนั้นใช้%s//replacementคำสั่งเพื่อดำเนินการค้นหาและแทนที่จริง ๆ
หากคุณต้องการสิ่งที่คล้ายกับ incsearch สำหรับ:sคำสั่งลองใช้vim-overแต่ฉันชอบใช้วิธี Vim ดั้งเดิม
เปลี่ยนตัวโต้ตอบโปรดของฉันคือการค้นหาโดยใช้และผ่านการแข่งขันโดยใช้/n
จากนั้นเลือกจับคู่ใช้gnแล้วsเพื่อใช้แทนข้อความที่มีสิ่งที่ผมชอบ
และทำซ้ำโดยเลื่อนไปยังแมตช์ถัดไปและกด.
:s/old/new/gc)
ใน Neovim ยังมี'inccommand'ตัวเลือกที่ให้คุณดูตัวอย่างผลลัพธ์ของ:sคำสั่งในขณะที่คุณพิมพ์
เพื่อประโยชน์ของทุกคนincsearchได้รับการอัพเดตใน vim8 เพื่อแสดงตัวอย่างเมื่อคุณพิมพ์รูปแบบ
:%s/pattern/replace/แล้วกดuเพื่อเลิกทำคุณจะเห็นชิ้นส่วนที่ Vim เปลี่ยนหากคุณhlsearchเปิดใช้งาน^Rและคุณสามารถแทนที่ข้อความนี้อีกครั้งกับ