เป็นกลุ่มมาโครในทุกบรรทัดของการเลือกภาพ


86

ฉันต้องการเรียกใช้แมโครในทุกบรรทัดในการเลือกแทนที่จะรวมจำนวนบรรทัดในหัวของฉัน ตัวอย่างเช่นฉันอาจเขียนมาโครเพื่อแปลง:

Last, First

เป็น

First Last

และฉันต้องการให้มันทำงานในทุกบรรทัดเหล่านี้:

Stewart, John 
Pumpkin, Freddy
Mai, Stefan
...

ผู้เชี่ยวชาญด้านความคิดเป็นกลุ่มบ้างไหม?

แก้ไข: นี่เป็นเพียงตัวอย่างเห็นได้ชัดว่านี่เป็น regexable เล็กน้อย แต่มีอินสแตนซ์อื่น ๆ ที่เกิดขึ้นซึ่งไม่ง่ายเลยที่ฉันต้องการใช้มาโคร


1
พูดตามตรงฉันอาจจะทำงานนี้โดยเฉพาะกับ regex แต่คำถามยังคงใช้ได้สำหรับกรณีที่ซับซ้อนมากขึ้น
Jamie Wong

ทำไมเป็นกลุ่ม? ในความคิดของฉัน sed มีความเหมาะสมมากกว่า
kokosing

8
@kogut: ทำไมต้องออกจากโปรแกรมแก้ไขเพื่อแก้ไขข้อความของคุณด้วย regex บรรทัดเดียว
Stephen

1
โอเคคุณได้ประเด็นแล้ว;)
kokosing

คำตอบ:


154

สมมติว่าคุณมีมาโครqที่ทำงาน (และยังคงอยู่) ในบรรทัดเดียว จากนั้นคุณสามารถเรียกใช้ในทุกบรรทัดที่คุณเลือกด้วย:

:'<,'>normal @q

(หากคุณมีกลุ่มบรรทัดที่เลือกไว้แล้ว:ให้กดปุ่มสร้าง:'<,'>บนบรรทัดคำสั่ง)

ตัวอย่างเช่นมาโครต่อไปนี้ใช้อักษรตัวพิมพ์ใหญ่ทุกคำยกเว้นคำแรกในบรรทัด:

:let @q="^dwgU$P"

ดังนั้นเรียกใช้สิ่งต่อไปนี้ (โดยที่+เส้นจะถูกเลือก)

 0000: a long long time ago
 0001: in a galaxy far away
+0002: naboo was under an attack
+0003: and i thought me and qui-gon jinn
+0004: could talk the federation in
 0005: to maybe cutting them a little slack.

ด้วยnormal @qคำสั่งข้างต้นสร้าง:

 0000: a long long time ago
 0001: in a galaxy far away
 0002: naboo WAS UNDER AN ATTACK
 0003: and I THOUGHT ME AND QUI-GON JINN
 0004: could TALK THE FEDERATION IN
 0005: to maybe cutting them a little slack.

@ Roger Pate: ใช่ถ้าคุณต้องการเล่นกอล์ฟ :)
rampion

1
@rampion: มีการพิมพ์ผิดในคำสั่งของคุณหรือไม่? สำหรับฉันมันใช้ได้แค่นี้::'<,'>normal! @q
oliver

3
@oliver: ตรวจสอบการแมปของคุณ - คุณอาจจะได้ @qremapped จาก:help normal- "ถ้าได้รับ [!] การแมปจะไม่ถูกใช้"
rampion

2
@rampion: ด่ามัน ... ถูก! ฉันใช้ yankring และเห็นได้ชัดว่ามีปัญหากับสิ่งนี้: ... คุณไม่สามารถเรียกใช้มาโครด้วย ": normal @a" ได้ ยังไม่สามารถทำได้ แต่คุณสามารถดำเนินการได้ด้วย ": normal! @a" (จากเอกสารความช่วยเหลือของ yankring)
oliver

1
โดยส่วนตัวแล้วฉันชอบทำแผนที่@ในโหมดภาพเช่นนี้: vnoremap @ :normal @. วิธีการที่คุณยังสามารถทำ@aเหมือนที่คุณคาดหวัง (แม้ว่าคุณจะต้องกดปุ่ม Enter หลังจากนั้น :()
LondonRob

19

เลือกเส้นจากนั้นกด:เพื่อเข้าสู่โหมดคำสั่ง กลุ่มจะกรอกข้อมูลโดยอัตโนมัติ'<,'>ซึ่ง จำกัด ช่วงไว้เฉพาะบรรทัดที่เลือก สำหรับตัวอย่างของคุณคุณสามารถใช้:sคำสั่งเพื่อทำการสลับ:

:'<,'>s/\(\w\+\), \(\w\+\)/\2, \1/

สิ่งนี้จะสลับคำสองคำโดยคั่นด้วยเครื่องหมายจุลภาคในทุกบรรทัดในการเลือกภาพ

คุณยังสามารถใช้'<และ'>เช่นเดียวกับที่คั่นหน้าหรือตำแหน่งบรรทัดอื่น ๆ เช่นเป็นส่วนหนึ่งของคำสั่งการเคลื่อนไหวดังนั้นในโหมดปกติd'<จะลบจากตำแหน่งเคอร์เซอร์ปัจจุบันไปยังจุดเริ่มต้นของบรรทัดแรกในการเลือกภาพ เครื่องหมายจะยังคงมีผลแม้ว่าบล็อกจะไม่ถูกเน้นด้วยสายตาอีกต่อไป

หากคุณต้องการเล่นมาโครที่บันทึกซ้ำในทุกบรรทัดคุณจำเป็นต้องเรียกใช้แมโครด้วย:normalคำสั่ง น่าเสียดายที่:normalคำสั่งไม่ทำงานในช่วงของบรรทัด แต่คุณสามารถแก้ไขได้ด้วย:globalคำสั่ง สิ่งนี้เรียกใช้:exคำสั่งในทุกบรรทัดที่ตรงกับ regex ดังนั้นคุณสามารถทำได้:

:'<,'>g/^/ norm @a

คำอธิบาย:

:'<,'>       for every line in the visual block
g/^/         on every line that matches the regex /^/ - i.e. every line
norm         run in normal mode
@a           the macro recorded in a

สิ่งนี้ดีกว่าคำตอบที่ยอมรับเนื่องจากรองรับมาโครที่เพิ่มบรรทัดใหม่
Jan Warchoł

@Dave, Kirbyอาจจะดีกว่าที่จะแลกเปลี่ยน^กับ.เพื่อให้มาโครทำงานเฉพาะในบรรทัดที่มีข้อความบางส่วนใช่หรือไม่?
SergioAraujo

1

คุณสามารถเพิ่มฟังก์ชันด้านล่างลงใน~/.vimrcหรือเพียงแค่คัดลอกบนเบราว์เซอร์ของคุณและเรียกใช้:@+

fun! RunMacroOverSelection(macroname)
    execute "'<,'>normal @". a:macroname
endfun
com -nargs=1 Rover :call RunMacroOverSelection(<f-args>)
nnoremap <leader>r :Rover<space>

ข้อดีคือคุณสามารถใช้แมโครใดก็ได้ในการเลือกภาพ คุณต้องให้ตัวอักษรมาโครเป็นอาร์กิวเมนต์เช่น:

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