ฉันจะดูและแก้ไขการบันทึกของฉัน (เช่นมาโครที่บันทึกไว้) ได้อย่างไร


38

ฉันใช้ซ้ำที่ซับซ้อนในการบันทึกการดำเนินงานของฉัน ( qqเพื่อบันทึกการดำเนินการบาง , qการหยุด) และฉันไม่ผิดพลาด

เป็นไปได้ไหมที่จะเห็นสิ่งที่ฉันบันทึกและแก้ไขข้อผิดพลาดแทนที่จะทำอีกครั้ง?

เรียกใช้ตัวละครที่บันทึกไว้ตาม@qผลงาน แต่ฉันไม่เห็นในการแม็พ ( :map q- No mapping found)

:help recordingและมีข้อมูลไม่มากในการช่วยเหลือโดยการพิมพ์:

คำตอบ:


41

หมายเหตุ: ฉันสมมติว่าคุณกำลังใช้การaลงทะเบียนทั้งหมดของคำตอบนี้ แต่คุณสามารถใช้การลงทะเบียนใด ๆ

Note2: <1b>คือEsc; คุณสามารถแทรกนี้กับแล้วCtrl+v Escมันอาจปรากฏขึ้นเป็น^[(ขึ้นอยู่กับการdisplayตั้งค่า)


มันไม่ใช่แผนที่ จึงทำให้รู้สึกว่า:mapไม่ทำงาน มันถูกบันทึกไว้ในการลงทะเบียนและคุณสามารถดูและแก้ไขเหมือนการลงทะเบียนใด ๆ

ทุกสิ่งที่qทำก็คือ"ล้างลงทะเบียนนี้และผนวกการกดแป้นพิมพ์ใด ๆ กับมัน"และสิ่งที่@จะเป็น"ประเมินผลการลงทะเบียนเป็นคำสั่ง"

ไม่มีอะไรที่ "แตกต่าง" เกี่ยวกับแมโครคุณสามารถเรียกใช้การลงทะเบียนใด ๆ เป็นแมโครได้


หากต้องการดูเพียงใช้:

:echo @a

เช่นเดียวกับการลงทะเบียนใด ๆ

คุณยังสามารถใช้:registersเพื่อดูการลงทะเบียนทั้งหมด


หากต้องการแก้ไขคุณสามารถทำได้หลายสิ่ง:

วิธีที่ง่ายที่สุดที่คุณจะกำหนดให้เป็น@aเช่น:

:let @a='iasd<1b>'

การดำเนินการนี้จะเริ่มโหมดแทรก ( i) แทรกasdและหลบหนีกลับสู่โหมดปกติ

สิ่งนี้ไม่เป็นประโยชน์สำหรับการแก้ไขอย่างกว้างขวาง คุณสามารถใช้ฟังก์ชั่น (เช่น. substitute()) หรืออาจจะต่อท้ายบางสิ่ง ( :let @a=@a . 'more') แต่การเปลี่ยนบางอย่างที่อยู่ตรงกลางนั้นไม่ใช่เรื่องง่าย

ฉันพบว่าวิธีที่ดีที่สุดสำหรับสิ่งนี้คือการเริ่มบัฟเฟอร์ใหม่ด้วย:splitหรือ:tabnewและแก้ไขการลงทะเบียนโดยการใส่ลงไปที่นั่นแก้ไขจากนั้นคัดลอกกลับ

คุณสามารถใช้"apซึ่งจะแทรกข้อความในบัฟเฟอร์ (ที่aลงทะเบียนของคุณ):

iThis is A<1b>

ตอนนี้ฉันสามารถเปลี่ยนบรรทัดเป็นบางที:

iThis is an edited macro<1b>

จากนั้นฉัน^v$"ayจะดึง (คัดลอก) บรรทัดนี้ไปยังการaลงทะเบียน:

  • ^ สำหรับการเริ่มต้นของบรรทัด
  • v สำหรับโหมดภาพ
  • $ สำหรับจุดสิ้นสุดของบรรทัด
  • "ay ดึงส่วนที่เลือกเพื่อลงทะเบียน a

^"ay$หากคุณต้องการคุณสามารถทำเช่นนี้ได้โดยไม่ต้องใช้โหมดภาพกับ

ตอนนี้คุณสามารถใช้@aราวกับว่านี่คือสิ่งที่คุณบันทึกไว้ในตอนแรก

คุณยังสามารถใช้yyและจากนั้น@"ซึ่งเร็วขึ้นเล็กน้อย สิ่งนี้จะคัดลอกบรรทัดใหม่ที่ต่อท้ายแม้ว่าและอาจทำให้เกิดผลข้างเคียง ... อีกวิธีหนึ่งในการทำให้สิ่งนี้เร็วขึ้นคือการใช้แมโคร :-)


2
ฉันจะทราบว่าการลากเส้นการเคลื่อนไหว linewise ในการลงทะเบียนของคุณจะมีผลข้างเคียงของการรวมอักขระขึ้นบรรทัดใหม่ราวกับว่าคุณได้กดEnterเมื่อสิ้นสุดการบันทึกของคุณ ในหลายกรณีสิ่งนี้อาจไม่เป็นอันตราย แต่ในสถานการณ์ที่คุณสร้างตำแหน่งเคอร์เซอร์อย่างระมัดระวังในตอนท้ายของการบันทึกอาจส่งผลกระทบต่อความสามารถในการทำซ้ำ
tommcdo

@tommcdo ถูกต้อง; คุณสามารถใช้vและเลือกทั้งบรรทัด (โดยไม่ต้องขึ้นบรรทัดใหม่)
Martin Tournoij

@Carpetsmoker " v^$"ayเพื่อดึง (คัดลอก) บรรทัดนี้เพื่อaลงทะเบียน" ไม่ควร^มาก่อนvและ$คุณยังไม่ได้คัดลอกบรรทัดใหม่หรือไม่ ฉันคิดว่ามันควรจะ: 0v$h"ay(ใช่นานเจ็บปวด!)
joeytwiddle

2
@jotwiddle ไม่$ย้ายไปยังจุดสิ้นสุดของบรรทัด แต่ไม่รวมถึงการขึ้นบรรทัดใหม่ มันเป็นความแตกต่างระหว่างและ0y$ yyการทำhตาม$จะหมายถึงว่าคุณจะพลาดตัวละครตัวสุดท้าย
evilsoup

สิ่งหนึ่งที่คุณสามารถทำได้เพื่อแก้ไข: ให้คำสั่ง @ a = type แก้ไขได้ง่ายขึ้นคือพิมพ์: <Ctrl-f> เลือกและแก้ไขบรรทัดที่เกี่ยวข้อง (บรรทัดสุดท้ายซึ่งเป็นค่าเริ่มต้นหากคุณกำลังแก้ไข บรรทัดสุดท้ายที่คุณป้อน) ใช้เป็นกลุ่มตามปกติ กดปุ่ม Return เมื่อคุณดำเนินการบรรทัดหรือ <Ctrl-c> เพื่อออก

9

เพื่อให้ได้งานกับ ...

qajjjq

จะเริ่มบันทึกแมโครลงในการaลงทะเบียน

คุณสามารถเห็นรีจิสเตอร์ปัจจุบันของคุณ (ใช้สำหรับแมโคร, yanking, การลบ, ฯลฯ ) ด้วย:regคำสั่งหรือคุณสามารถระบุรีจิสเตอร์ที่จะแสดงโดยระบุชื่อ ตัวอย่างเช่นเพื่อแสดงการลงทะเบียนa:

:reg a

อัตราผลตอบแทน

--- Registers ---
"a   jjj

คุณสามารถต่อท้ายทะเบียนที่มีชื่ออยู่ได้โดยใช้อักษรตัวใหญ่ที่ตรงกัน การทำงานนี้ไม่ได้มีไว้สำหรับการบันทึกมาโครเท่านั้น แต่ใช้สำหรับการบันทึกด้วยเช่นกัน ตัวอย่างเช่น:

qAkkkq
:reg a

อัตราผลตอบแทน

--- Registers ---
"a   jjjkkk

หากคุณต้องการใช้ไวยากรณ์ let เพื่อแก้ไขแมโครที่มีอยู่คุณสามารถทำได้:

let @a='<C-r>a'

ซึ่งจะขยายไปสู่

let @a='jjjkkk'

และจากนั้นคุณสามารถเปลี่ยนการกดแป้นแต่ละตัว

โปรดทราบว่าคุณสามารถใช้<C-r>(นั่นคือควบคุม + r) เพื่อวางจากการลงทะเบียนใด ๆ ในโหมดบรรทัดคำสั่ง (หรือในโหมดแทรกสำหรับเรื่องนั้น)

นอกจากนี้เมื่อคุณอยู่ในโหมดบรรทัดคำสั่งหากคุณพิมพ์<C-f>สิ่งนี้จะปรากฏขึ้นหน้าต่างบรรทัดคำสั่งซึ่งคุณสามารถดู / แก้ไขคำสั่งที่ผ่านมาออกและคุณสามารถแก้ไขคำสั่งปัจจุบันของคุณก่อนที่จะเรียกมัน กด Enter บนคำสั่งที่คุณต้องการส่ง

ประโยชน์ของสิ่งนี้คือคุณสามารถใช้คำสั่งการเคลื่อนไหว / การทดแทนปกติภายในบัฟเฟอร์นี้เพื่อแก้ไขแมโครของคุณ ตัวอย่างเช่น:

let @a='<C-r>a'<C-f>

จะนำขึ้น:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

หากคุณใช้คำสั่ง 120 คุณสามารถทำสิ่งต่อไปนี้

s/kkk/}
<return>
:reg a

อัตราผลตอบแทน

--- Registers ---
"a   jjj}

แน่นอนคุณสามารถวางเนื้อหาของการลงทะเบียนลงในบัฟเฟอร์ของคุณและเปลี่ยนมันได้ แต่คุณสามารถทำทุกสิ่งที่คุณต้องการโดยไม่ทำให้บัฟเฟอร์การทำงานของคุณสกปรก

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