วิธีรับตัวอย่างสำหรับคำสั่งการแทนที่?


9

บ่อยครั้งที่ฉันพบว่าตัวเองต้องการทำการทดแทนที่จะมีการจับคู่แยกกันทั่วทั้งไฟล์ขนาดใหญ่และด้วยการค้นหาที่ไม่สำคัญและการแสดงออกแทน

okFunction(arg1, arg2 arg3)ตัวอย่างเช่นสมมติว่าฉันมีบางฟังก์ชั่นการโทรเช่น args จะแตกต่างกันไปกับการเรียกใช้ทุกฟังก์ชั่นแน่นอน arg2ตอนนี้บอกว่าผมได้ค้นพบการทำงานที่ดีกว่าที่ไม่จำเป็น ฉันสามารถปรับไฟล์ทั้งหมดได้อย่างง่ายดายด้วย

:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc

แม้ว่าแนวคิดง่าย ๆ ฉันไม่แน่ใจว่าฉันมีไวยากรณ์ในรูปแบบที่ค่อนข้างยาวนี้ การcตั้งค่าสถานะช่วยได้ที่นี่จริงๆ แต่ปัญหาคือเมื่อขอการยืนยันเสียงเรียกเข้าจะไม่แสดงว่าการแข่งขันจะถูกแทนที่ด้วยอะไร ฉันหมายความว่ามันจะแสดงการแสดงออกแทน แต่ไม่ได้ผลการประเมิน หากฉันยืนยันการเปลี่ยนตัวด้วยyเสียงเรียกเข้าจะข้ามไปยังนัดถัดไปทันทีและฉันจะไม่ยอมแพ้เพื่อดูว่าฉันทำผิดพลาดหรือไม่

ฉันได้พบปลั๊กอินvim-overที่แก้ปัญหาได้เพียงบางส่วน แต่ก็ต่อเมื่อคณิตศาสตร์ทั้งหมดปรากฏบนหน้าจอเมื่อคุณพิมพ์คำสั่ง เมื่อคุณกด Enter พฤติกรรมจะเหมือนกับที่ฉันได้อธิบายไว้ข้างต้นและฉันไม่ได้รับหน้าตัวอย่าง

ดังนั้นมีวิธีรับ vim ประเมินนิพจน์การแทนที่เมื่อขอการยืนยันคำสั่งทดแทนหรือไม่?


2
นั่นคือรายการที่มีรายละเอียดในตัวติดตาม vim-bug (ขออภัยไม่พบในขณะนี้)
Christian Brabandt

2
สำหรับสิ่งที่คุ้มค่าผมมักจะใช้ทดแทนในบรรทัดแรกจะเข้ามาแทนที่โดยไม่ต้อง%ตรวจสอบว่าผลที่ได้คือสิ่งที่ผมคาดหวังว่าแล้วใช้ทดแทนด้วย%(มันเพียงไม่กี่กดแป้นพิมพ์: :<up><c-b>%) เห็นได้ชัดว่าตัวเลือกการแสดงตัวอย่างจะมีประสิทธิภาพมากกว่านั้น ในขณะที่ไม่มีแพทช์อาจมีใครสามารถแทนที่การแทนที่ในฟังก์ชัน vimscript ด้วยตัวเลือกชนิดนี้ แต่ฟังดูเหมือนจะเป็นงานที่ต้องทำมากมาย ...
statox

2
@ChristianBrabandt พบมัน มันยังเป็นของที่มีความสำคัญไม่เป็นความลับ ...
Vitor อิจิ

2
@VitorEiji ที่ไม่ใช่คนที่ฉันคิด แต่มันก็ไม่สำคัญเพราะมันเป็นไปไม่ได้ในปัจจุบัน Neovim มีตัวเลือก 'inccommand' ซึ่งอาจใช้งานได้ (หรือไม่ฉันไม่ได้จริงๆตอนนี้)
Christian Brabandt

Evilแสดงตัวอย่างการเปลี่ยนตัว; ฉันไม่รู้ว่ามันทำได้อย่างไร
Geremia

คำตอบ:


2

วิธีแก้ปัญหาหนึ่งอย่างคือแมโคร ไฮไลต์พื้นที่ปัญหาทั้งหมดและทำการทดแทนในหนึ่งบรรทัดในแต่ละครั้ง จากนั้นตัดสินใจว่าคุณต้องการหรือไม่ เมื่อคุณทำnไปยังพื้นที่ถัดไป

สำหรับกรณีของคุณโดยเฉพาะ:

  1. ค้นหาพื้นที่: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. qqเริ่มการบันทึกแมโคร
  3. ใช้ :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. หยุดการบันทึกมาโคร q
  5. เลิกทำ ( u) หรือไปที่ผลการค้นหาถัดไป ( n)
  6. @qสมัครแมโคร
  7. ทำซ้ำขั้นตอนที่ 5 และ 6 ตามต้องการ

เห็นได้ชัดว่าไม่ใช่สิ่งที่คุณกำลังมองหา แต่นี่คือสิ่งที่ฉันทำ


นั่นมันเจ๋ง! ฉันไม่เคยรู้เลยว่าเมื่อคุณทำการค้นหาด้วย/มันจะทำหน้าที่เป็นตัวเลือกภาพ - ดี
the_velour_fog

@the_velour_fog " /... ประพฤติเป็นการเลือกภาพ" จริงๆแล้วมันไม่ได้ เหตุผลที่ทำให้งานนี้เป็นเพราะ:s//การกระทำในบรรทัดปัจจุบันและการใช้nนำคุณไปสู่การเกิดขึ้นต่อไป
Tumbler41

1
หากคุณไม่ได้ระบุรูปแบบของ:s/pattern/replacementมันจะใช้สตริงการค้นหาล่าสุดดังนั้นในขั้นตอนที่ 3 คุณสามารถนำ:s//betterFunction(\1, \3)/gไปใช้จริงเพื่อบันทึกการพิมพ์บางอย่าง
Haegin

@ Tumbler41 อาขอบคุณสำหรับการชี้แจง ใช่ฉันยังใช้เทคนิคพื้นฐานในการค้นหาจากนั้นใช้แมโครฉันมักจะใส่อาร์กิวเมนต์ก่อนและใช้:vimgrep /pattern/ ##จากนั้นใช้แมโครเพื่อที่ว่าหากรูปแบบของฉันตรงกันจริง ๆ แล้วเป็นสิ่งที่น่าเบื่อฉันสามารถทำได้อย่างรวดเร็ว ย้อนกลับ:argdo %s/.../..../gcและเริ่มบินผ่านการปฏิบัติการ
the_velour_fog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.