ฉันจะหยุดการบันทึกในบรรทัดคำสั่งได้อย่างไร


19

เมื่อฉันบันทึกแมโครด้วยqและฉันก็เสร็จฉันสามารถพิมพ์:

  • q เพื่อหยุดการบันทึกถ้าฉันอยู่ในโหมดปกติหรือมองเห็น
  • <c-o>q เพื่อหยุดการบันทึกถ้าฉันอยู่ในโหมดแทรก
  • ..

    ฉันจะหยุดการบันทึกได้อย่างไรถ้าแมโครของฉันสิ้นสุดในโหมดคำสั่ง


กรณีการใช้งานของคุณสำหรับสิ่งนี้คืออะไร? ฉันจริงๆอยากรู้เพียง :)
PhilippFrank

2
@PhilippFrank ฉันมักจะค้นหาและแทนที่รูปแบบเดียวกันด้วยรูปแบบที่แตกต่างกันในบล็อกข้อความต่างๆ ด้วยมาโครดังกล่าวการเลือกบล็อกการเขียนรูปแบบการค้นหาจริงและวางเคอร์เซอร์บนตำแหน่งที่ดีสำหรับการพิมพ์เชนการเปลี่ยนสามารถทำได้โดยอัตโนมัติ เมื่อฉันเล่นมันจะเลือกบล็อกเข้าสู่โหมดคำสั่งพิมพ์:'<,'>s/toBeReplaced//gจากนั้นวางเคอร์เซอร์ระหว่างทั้งสอง//เพื่อให้สิ่งที่ฉันต้องทำคือพิมพ์newString<cr>และฉันเสร็จแล้ว :)
iago-lito

มันเหมือนกับแมโครที่มีพารามิเตอร์ เป็นความคิดที่ดีมากขอบคุณ!
PhilippFrank

@PhilippFrank ชนิดของใช่ ฉันดีใจที่คุณชอบมัน :)
iago-lito

คำตอบ:


12

วิธีแก้ไขอื่นคือเมื่ออยู่ในโหมดบรรทัดคำสั่งใช้Ctrl-fและกดqเพื่อหยุดการบันทึก

Ctrl-fอนุญาตให้คุณเปิดหน้าต่างบรรทัดคำสั่งซึ่งคุณสามารถแก้ไขคำสั่งในโหมดปกติ เพื่อตรวจสอบคำสั่งเพียงใช้ป้อน


ดังนั้นหลังจากเพิ่มบางสิ่งเช่น:

cnoremap <c-q> <c-f>i<c-o>q

ในของ.vimrcคุณคุณสามารถใช้<c-q>เพื่อหยุดการบันทึกแมโครขณะอยู่ในโหมดคำสั่ง


Florent


คุณยังต้องลบอักขระ <Cf> ( ^F) ออกจากส่วนท้ายของแมโครด้วยใช่ไหม อย่างน้อยนั่นคือสิ่งที่ฉันเห็น
VanLaser

เกือบจะมี! มีประโยชน์จริงๆ (ฉันไม่รู้เกี่ยวกับหน้าต่างบรรทัดคำสั่ง แต่มันเยี่ยมมาก) แต่ .. aargh! ดูเหมือนว่าการเข้าสู่หน้าต่างนี้จากโหมดแทรกจะทำให้พื้นที่ที่คุณเลือกว่าง มีวิธีทำให้คำสั่งที่คุณเรียกใช้จากหน้าต่างบรรทัดคำสั่งทำงานในพื้นที่ที่เลือกหรือไม่?
iago-lito

@VanLaser ไม่เนื่องจากคุณสามารถดำเนินการต่อโดยพิมพ์คำสั่งในหน้าต่างบรรทัดคำสั่ง แมโครของคุณจะเป็นเช่นqqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qนั้นและการบันทึกหยุดลงจริง ๆ ในขณะที่คุณกำลังพิมพ์ส่วนคำสั่ง วิธีใช้มาโคร: @qFINISHYOURCOMMAND<cr>เสร็จแล้ว: ไม่จำเป็นต้องแก้ไข น่าเสียดายที่นี่ดูเหมือนจะไม่ทำงานจากโหมดภาพ (หรือมันสูญเสียการเลือก) .. หรือฉันได้พลาดอะไรบางอย่าง?
iago-lito

อ่าขวา :) BTW ฉันสามารถเลือกช่วงภาพจากนั้นทำ@qและเพิ่มช่วงที่คำสั่งเริ่มต้น'<,'>- ตราบใดที่แมโครเริ่มต้นด้วย:....
VanLaser

@ lago-lito ที่จริงแล้วดูเหมือนว่าแม้ว่าคุณจะไม่เห็นสิ่งที่คุณเลือกช่วงที่ระบุ (เช่น'<,'>) ยังคงตรงกับการเลือกเมื่อตรวจสอบคำสั่ง
fflorent

17

วิธีหนึ่งในการทำ:

  • เริ่มแมโครของคุณตามปกติ (เช่นqq... ตัวอักษรอื่น ๆ )
  • เมื่อคุณมาถึงโหมด cmdline ให้เขียนตัวอักษรทั้งหมดที่คุณต้องการ
  • คุณต้องการสิ้นสุดแมโครที่นี่ กดESCเพื่อออกจาก cmdline-mode qเพื่อจบแมโครของคุณ
  • ลบESCจากqการลงทะเบียน (*): คุณสามารถวางไว้ในบัฟเฟอร์เอา^[ตัวละครให้เลือกสิ่งทั้งหมดอีกครั้ง (ตัวละครที่ชาญฉลาด) qและงัดมันกลับไปที่ลงทะเบียน
  • ที่มัน: @qเรียกใช้แมโครของคุณ:

โดยพื้นฐานแล้วคุณ "post-process" แมโครของคุณเล็กน้อยเนื่องจากมันถูกเก็บไว้ใน register :)

(*) วิธีที่รวดเร็วในการลบอักขระตัวสุดท้ายออกจากมาโครที่เก็บไว้ใน register qคือ:

:let @q = @q[:-2]

ฮ่าฮ่า! นี่เป็นแฮ็คของฉันจริง ๆ = D ไม่มีวิธี "ยอมรับ" ในการทำเช่นนั้น? ( เร็วขึ้น )
iago-lito

ฉันไม่รู้จัก แต่ฉันไม่ได้ใช้แมโครมากเกินไป (ฉันชอบเขียนฟังก์ชันเล็ก ๆ แทน) มาโครรู้สึกอยากรู้อยากเห็นสำหรับฉันเมื่อฉันดูพวกเขาในภายหลัง
VanLaser

@VanLaser: คุณช่วยให้รายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับบรรทัดได้:let @q = @q[:-2]ไหม? โดยเฉพาะอย่างยิ่ง[:-2]ทำงานอย่างไร :-)
statox

มันคือ "การแบ่ง" และทำงานกับรายการและสตริง (ซึ่งเป็นวิธีที่ฉันเข้าถึง / ตั้งค่า@qด้านบน) ตัวอย่างบางส่วนที่นี่
VanLaser

@VanLaser พวกเขาดูมีความลับอย่างแท้จริง มีประโยชน์อย่างไรสำหรับการทำซ้ำสิ่งเล็ก ๆ ที่ซับซ้อนที่คุณต้องการในกรณีที่เฉพาะเจาะจง .. คุณรู้ปัญหาประเภทนี้ที่ปรากฏเพียงครั้งเดียวและครั้งสุดท้ายเพียงไม่กี่นาที ความสามารถในการจัดการกับพวกเขาโดยการสร้างมาโครได้ทันทีโดยไม่ต้องเขียนและแก้ไขข้อบกพร่องฟังก์ชั่นเฉพาะนั้นเป็นเพียงแค่ .. แสวงหาที่ยอดเยี่ยมมาก! ^ ^
iago-lito

3

เมื่ออ่านความคิดเห็นของคุณเกี่ยวกับกรณีการใช้งานแล้วดูเหมือนว่าคุณสามารถใช้การจับคู่คีย์แทนมาโครได้

ฉันมีบรรทัดนี้ใน. vimrc ของฉัน (จำไม่ได้ว่าอยู่ที่ไหนฉันพบ):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

มันมีผลคล้ายกับกรณีการใช้งานที่คุณอธิบายวางคุณลงบนบรรทัดคำสั่งดังนั้นสิ่งเดียวที่คุณต้องทำคือพิมพ์การแทนที่และกด Enter แต่ในกรณีนี้การแทนที่คำที่อยู่ใต้เคอร์เซอร์ของคุณทั้งหมด .

หากต้องการแทนที่ภายในบล็อกปัจจุบันฉันคิดว่าสิ่งต่อไปนี้ควรใช้งานได้:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

แน่นอนคุณสามารถแมปกับสิ่งที่สำคัญที่คุณต้องการ

สิ่งที่ด้านบนทำ: ทำเครื่องหมายตำแหน่งปัจจุบันโดยใช้เครื่องหมายที่ไม่มีชื่อเลือกภาพบล็อกปัจจุบันออกจากโหมดภาพและกลับเคอร์เซอร์ไปยังตำแหน่งที่บันทึกไว้ (เครื่องหมายการเลือกภาพยังคงตั้งอยู่) เข้าสู่โหมดคำสั่งและพิมพ์คำสั่งแทน แทรกคำที่อยู่ใต้เคอร์เซอร์ด้วย<C-r><C-w>และวางเคอร์เซอร์ของคุณเพื่อพิมพ์การแทนที่


ใช่ฉันมีสิ่งนี้เช่นกัน ในกรณีการใช้งานเฉพาะของฉันtoBeReplacedรูปแบบนั้นไม่ง่ายเท่ากับ "คำใต้เคอร์เซอร์" ซึ่งเป็นสาเหตุที่ฉันต้องการแมโครขนาดเล็กเฉพาะที่ฉันสามารถสร้างได้ทุกที่ และอีกครั้ง: เฉพาะเจาะจงมากเกินไปสำหรับแผนที่: \ ขอบใจคุณ :) :)
iago-lito

2
บางทีวางรูปแบบในการลงทะเบียนจากนั้นปรับการแมปข้างต้นเพื่อรับเนื้อหาการลงทะเบียนโดยอัตโนมัติเป็นtoBeReplacedส่วนหนึ่ง (แทนคำปัจจุบันภายใต้เคอร์เซอร์ซึ่งเป็นข้อ จำกัด มากขึ้น)
VanLaser

1
@VanLaser Right ที่จะช่วยให้การทำแผนที่ทั่วไปและทำให้มันง่ายขึ้นเช่นกัน: va{:s/<C-r>0//g<Left><Left>ด้วยวิธีนี้คุณสามารถดึงรูปแบบใดก็ได้ที่คุณต้องการมาก่อนแล้วกดปุ่มแมปเพื่อแทนที่รูปแบบนั้นด้วยอะไรบางอย่างในปัจจุบัน บล็อก.
dhakimian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.