ข้อความจะถูกย้ายจากการลงทะเบียนหนึ่งครั้งไปยังจำนวนการลงทะเบียนได้อย่างไร?


10

มีวิธีใดที่จะทำให้ข้อความ 'ไพพ์' จากรีจิสเตอร์เป็นรีจิสเตอร์อื่นหรือรีจิสเตอร์อื่น ยกตัวอย่างเช่นย้าย"qไปลงทะเบียนผ่าน"1"5

ฉันมักจะต้องการสร้างมาโครรุ่นที่แตกต่างกันเล็กน้อยดังนั้นมันจึงมีประโยชน์ที่จะสามารถคัดลอกมาโคร 'เทมเพลต' ไปยังรีจิสเตอร์หลาย ๆ รีจิสเตอร์แล้วปรับเปลี่ยนแต่ละอัน

เพื่อให้เป็นตัวอย่างในทางปฏิบัตินี่คือปัญหาที่ทำให้ฉันมีคำถามนี้

ฉันต้องเปลี่ยนบรรทัดต่อไปนี้จากภาษาคำอธิบายฮาร์ดแวร์เป็นบล็อกซ้ำหลาย ๆ

RAM64(in=in, load=load0, address=address[0..5], out=out1);

ถึง

RAM64(in=in, load=load1, address=address[0..5], out=out2);
RAM64(in=in, load=load2, address=address[0..5], out=out3);
RAM64(in=in, load=load3, address=address[0..5], out=out4);
RAM64(in=in, load=load4, address=address[0..5], out=out5);

ฉันมีแมโครที่มีประสิทธิภาพนี้โดยใช้ฟังก์ชั่นที่เพิ่มขึ้นเป็นที่ฉันเก็บไว้ในการลงทะเบียนyypW^At)^A"a

บางครั้งฉันต้องการรูปแบบของการเพิ่มขึ้นที่จะแตกต่างกันเล็กน้อยเช่น

RAM512(in=in, load=load1, address=address[0..8], out=out2);
RAM512(in=in, load=load2, address=address[0..8], out=out4);
RAM512(in=in, load=load3, address=address[0..8], out=out6);
RAM512(in=in, load=load4, address=address[0..8], out=out8);

ที่แมโครในการลงทะเบียนจะเป็น"byypW^At)^A^A

ฉันต้องการลงทะเบียนเพื่อทำสิ่งนี้ แต่เพิ่มขึ้นทีละ 1-5 ลงทะเบียน"aสามารถ (อย่างใด) ถูกคัดลอกไปลงทะเบียนผ่านทาง e ข จากนั้นฉันจะวางการลงทะเบียนแต่ละครั้งลงในบัฟเฟอร์ทำการแก้ไขที่ต้องการ (เพิ่มเงื่อนไขเพิ่มเติมเปลี่ยนอักขระที่ตามหลังtการเคลื่อนไหว ฯลฯ ) และดึงการแสดงออกที่ถูกดัดแปลงกลับไปที่การลงทะเบียน โดยหลักการแล้วขั้นตอนสุดท้ายนี้อาจรวมอยู่ในคำสั่งเพื่อคัดลอกการลงทะเบียน

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


5
นอกจากนี้ฉันไม่แนะนำให้ใช้การลงทะเบียนหมายเลข การลงทะเบียน "ปลอดภัย" เท่านั้นคือการลงทะเบียนตัวอักษร การลงทะเบียนอื่น ๆ ทั้งหมดจะถูกตั้งค่าโดยอัตโนมัติโดย Vim
jamessan

คำตอบ:


7

มาโครเป็นเพียงข้อความ

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

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

- แก้ไข -

คำถามของคุณง่ายต่อการเข้าใจในขณะที่คุณเพิ่มคำอธิบาย

เมื่อปรากฎว่าคุณต้องเปลี่ยนการบันทึกเริ่มต้นเพื่อให้บรรลุเป้าหมายโดยไม่ต้องเล่นกับการลงทะเบียนราวกับว่าพวกเขาเป็นตัวแปร:

:let i = 1                     " define variable i
qa                             " start recording in register a
yy                             " yank the line
p                              " paste it
W                              " move to next WORD
<C-v><C-a>                     " increment number
t)                             " jump to the other number to increment
:norm <C-r>=i<CR><C-v><C-a>    " increment the number by i
q                              " stop recording

วิธีสร้าง 5 บรรทัดของบรรทัดปัจจุบันด้วยจำนวนสุดท้ายที่เพิ่มขึ้น 2:

:let i = 2|norm 5@a

หรือ 12 สำเนาโดยมีจำนวนสุดท้ายเพิ่มขึ้น 23:

:let i = 23|norm 12@a

ตกลงกันเกี่ยวกับการลงทะเบียนตัวเลข - แต่ถ้าคุณต้องการใช้สิ่งนี้ในคำสั่งและคุณต้องลงทะเบียนที่เริ่มต้นเหมือนกัน แต่จะแตกต่างกันอย่างไร
wchargin

@WChargin โปรดอธิบาย
romainl

ในขณะที่บางทีผมต้องการที่จะทำอะไรบางอย่างกับสำเนาหมุนของสตริงดังนั้นหากabcdeอยู่ใน@qแล้วฉันต้องการ@x="bcdea", และ@y="abcde" @z="eabcd"ผมอาจจะเริ่มต้นด้วยการให้@x, @yและ@zทั้งหมดเท่ากับ@qแล้วปรับเปลี่ยนได้ตามต้องการ เห็นได้ชัดว่าฉันเพิ่งทำขึ้น แต่ดูเหมือนว่าอาจมีบางกรณีที่สิ่งที่คล้ายกันอาจมีประโยชน์
wchargin

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

1
@Kit นั่นเป็นหนึ่งในหลาย ๆ ปัญหาเกี่ยวกับการแก้ไขปัญหา XY คำตอบที่ได้รับการโหวตมากที่สุดคือคำตอบที่ตรงกับคำถามของคุณที่มีคุณภาพสูง แต่ท้ายที่สุดแล้วก็ไร้ประโยชน์ในบริบทของปัญหาที่แท้จริงของคุณ ทั้งสองคำตอบนั้นถูกต้อง แต่พวกเขาตอบคำถามต่าง ๆ ซึ่งทำให้คุณตัดสินใจยาก ถ้าเป็นฉันฉันจะยอมรับคำตอบที่ตอบปัญหาหลักของฉัน… แต่นั่นเป็นเพียงฉัน
romainl

6

การใช้getregและsetreg

วิธีคัดลอกจากqไปยังการลงทะเบียน1- 5:

let src=getreg('q', 1)
for i in range(1, 5)
    call setreg(i, src)
endfor

หากต้องการคัดลอกไปยังรายการทั่วไปมากขึ้น:

let src=getreg('q', 1)
for i in ['a', 'c', 'e']
    call setreg(i, src)
endfor

การใช้ execute

วิธีคัดลอกจากqไปยังการลงทะเบียน1- 5:

for i in range(1, 5)
   execute 'let @' . i . '=@a'
endfor

หากต้องการคัดลอกไปยังรายการทั่วไปมากขึ้น:

for i in ['a', 'c', 'e']
    execute 'let @' . i . '=@a'
endfor

คำอธิบาย คำสั่งที่letสามารถใช้เป็นlet @x=@yที่ลงทะเบียนสำเนาการลงทะเบียนy xโดยพื้นฐานแล้วเราเพิ่งสร้างคำสั่งเหล่านี้ในลูป (เปลี่ยนค่าของxในรูปแบบข้างต้น) และexecuteไอเอ็นจีพวกเขา


1
ไม่จำเป็นต้องใช้:exeที่นี่ getreg()และsetreg()ฟังก์ชั่นจะทำความสะอาด
jamessan

@jamessan คำแนะนำที่ดีขอบคุณ - ฉันใช้สิ่งเหล่านี้ถูกต้องหรือไม่
wchargin

ฉันได้แก้ไขเพื่อเพิ่มอาร์กิวเมนต์ตัวเลือกที่สองเพื่อ getreg () เนื่องจากที่ส่งคืนเนื้อหาของการลงทะเบียนมากกว่าการประเมินที่เป็นไปได้
jamessan

1

หากต้องการตอบคำถามโดยตรงหากคุณต้องการคัดลอกเนื้อหาของการลงทะเบียนหนึ่งไปยังอีกอย่างรวดเร็วและง่ายดายคุณสามารถใส่สิ่งต่อไปนี้ใน. vimrc ของคุณ จากนั้นคุณสามารถดำเนิน<leader>rcabการคัดลอกเนื้อหาของการลงทะเบียนในการลงทะเบียนa bตัวอย่างฉันเลือกที่<leader>rcจะยืนสำหรับ 'สำเนาการลงทะเบียน'

function! s:CopyRegister()
    let sourceReg = nr2char(getchar())

    if sourceReg !~# '\v^[a-z0-9]'
        echo "Invalid register given: " . sourceReg
        return
    endif

    let destinationReg = nr2char(getchar())

    if destinationReg !~# '\v^[a-z0-9]'
        echo "Invalid register given: " . destinationReg
        return
    endif

    call setreg(destinationReg, getreg(sourceReg, 1))
    echo "Replaced register '". destinationReg ."' with contents of register '". sourceReg ."'"
endfunction

" rc = register copy
nnoremap <leader>rc :call <sid>CopyRegister()<cr>

1
getreg(sourceReg, 1)ผมอยากแนะนำให้
jamessan

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