เล่นซ้ำมาโครกลุ่มจนกว่าจะสิ้นสุดบัฟเฟอร์


85

ฉันต้องการเรียกใช้มาโครที่เพิ่งบันทึกไว้ใน register "x " ในทุกบรรทัดของบัฟเฟอร์ที่เปิดอยู่ตั้งแต่เคอร์เซอร์ไปจนถึงจุดสิ้นสุดของบัฟเฟอร์เป็นกลุ่ม ฉันจะทำอย่างไร?

ฉันรู้ว่าฉันสามารถเล่นมาโครซ้ำได้ n ครั้ง:

15@x

... หรือแค่กดค้างไว้ @จนกว่าฉันจะถึงบรรทัดสุดท้าย แต่ฉันต้องการกดแป้นเพียงไม่กี่ครั้งและทำมันให้สำเร็จ

ขอบคุณล่วงหน้า.


15 @ x ไม่ทำงานบน Windows gVIM
Mingjiang Shi

คำตอบ:


102

โดยส่วนตัวฉันจะทำ

VG:normal @x

แก้ไข: เปลี่ยนการลงทะเบียนเป็นรายการที่คุณระบุ


ทำได้ดีนี่. ฉันชอบที่โซลูชันนี้ทำงานในพื้นที่ที่เลือกเท่านั้น
Kevin

ฉันแมปสิ่งนี้กับ nnoremap <C - @> VG: norm @ q <CR>
PAS

ฉันลองใช้มาโคร "1z =] s" แต่มันจะสะกดเฉพาะคำแรกของแต่ละบรรทัดโดยข้ามส่วนที่เหลือไป
เริ่ม

@elig คุณอาจต้องการสร้างมาโครแบบเรียกซ้ำซึ่งจะค้นหาคำที่หายไปในทุกบรรทัด
raman

67

คุณสามารถทำได้ (ในโหมดคำสั่ง)

:%normal @x

ฉันชอบวิธีนี้ แต่ il จะเรียกใช้มาโครในทุกบรรทัดของบัฟเฟอร์ OP ถามจากเคอร์เซอร์ไปยังจุดสิ้นสุดเท่านั้น
Porunga

24

สร้างมาโครแบบเรียกซ้ำ:

qa@aq

เช่น:

qa0gUwj@aq

มันจะ UPCASE คำแรกจากบรรทัดปัจจุบันไปยังจุดสิ้นสุดของไฟล์ด้วย single @a แต่ตรวจสอบให้แน่ใจว่า "การลงทะเบียนว่างเปล่า:

let @a=""

3
ยอดเยี่ยม. วิธีนี้มีประโยชน์มากกว่า%:normalวิธีการนี้เนื่องจากเป็นการให้เกียรติการเคลื่อนไหวของเส้นภายในมาโครดังนั้นจึงมีประโยชน์ในกรณีที่เส้นไม่เหมือนกันในรูปแบบ ฉันพบว่ามันง่ายกว่าที่จะสร้างมาโคร 'a' เพื่อกำหนดการกระทำจากนั้นให้มาโคร 'b' ทำบิตแบบเรียกซ้ำเช่น qb @ a @ bq
Paul Ruane

3
หลีกเลี่ยงสิ่งนี้หากมาโครของคุณเกี่ยวข้องกับการค้นหาเนื่องจากมาโครจะดำเนินการต่อจากด้านบน ctrl-cจะหยุดถ้ามันเกิดขึ้น!
Iain Ballard

3
@IainBallard :set nowrapscanทำให้ล้มเหลวและหยุดเมื่อถึงจุดสิ้นสุดของไฟล์
ericbn

1
เพื่อล้างลงทะเบียนเพียงแค่ทำก่อนแมโคร:qaq qaqqa0gUwj@aqนอกจากนี้หากคุณลืมที่จะใส่@qในตอนท้ายคุณสามารถทำเพื่อเริ่มต้นการผนวกการลงทะเบียนแล้วทำqA @qฉันมักจะบันทึกลงใน reg q ด้วยเหตุผลบางประการเพราะมันง่าย (โดยเฉพาะสำหรับมาโครแบบเรียกซ้ำ) และมักจะจบลงด้วยการทำqqqqqgUiwj@qqแทนสองมาโคร สามqวินาทีแรกชัดเจน reg q สองqวินาทีเริ่มบันทึก ดูvim.wikia.com/wiki/Record_a_recursive_macro
dylnmc

ฉันคิดว่าจะล้างaทะเบียนใครก็พิมพ์ง่ายๆqaq
Peter Perháč

12

999999@xเว้นแต่คุณจะมีบัฟเฟอร์ขนาดใหญ่มาก ...


6
ทำไมไม่เพียง%:normal @xหรือ1,$:normal @x?
Nathan Fellman

3
นี่เป็นวิธีแก้ปัญหาที่หรูหรากว่าแน่นอน - ฉันเดาว่า99999@xเป็นเพียงสิ่งธรรมดาที่คุณเกิดขึ้นเมื่อคุณกำลังเร่งรีบ :)
ปีเตอร์

2
9999999 @ x จะไม่รันหลาย ๆ ครั้งในบรรทัดสุดท้ายเว้นแต่คุณจะมี 999999 บรรทัด?
David Oneill

2
เพิ่งลองใช้. แฮงเซสชั่น อาจยังคงทำงานต่อไปเป็นล้าน ๆ ครั้งโดยไม่หยุดที่ท้ายบรรทัด
CDR

1
อย่างน้อยในบางกรณีสิ่งนี้จะไม่ทำงานตามที่คาดไว้ พิจารณาการมีมาโครด้วยfind next / find prevในนั้น ดังนั้นเมื่อการทำซ้ำมาโครถึงจุดสิ้นสุดของไฟล์มันจะดำเนินการต่อจากจุดเริ่มต้น doc เป็นกลุ่มในเรื่อง เพื่อป้องกันไม่ให้ตัดการค้นหาหนึ่งอาจต้องการใช้ชุด nowrapscan นี่เป็นตัวอย่างที่ฉันคิดได้ แต่ไม่ได้หมายความว่าจะไม่มีอีกแล้ว :% normal @xเป็นวิธีไปตามที่ @ryan_s แนะนำในคำตอบของเขาด้านบน
Sergey Markelov

-1

จาก vim wiki เวอร์ชันย่อ: qqqqq เพื่อบันทึกมาโคร @qq เพื่อสิ้นสุดการบันทึก @q เพื่อเรียกใช้งาน (และจะทำงานจนจบไฟล์)


1
กรุณาคุณเพิ่มข้อมูลอ้างอิงในเอกสารได้ไหม
aturegano

2
@aturegano ฉันคิดว่าผู้เขียนตั้งใจที่จะใช้มาโครแบบเรียกซ้ำ ดูVim Wiki: บันทึก Recursive Macroสำหรับข้อมูลเพิ่มเติม
dylnmc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.