การทำแผนที่ด้วยการเคลื่อนไหว


12

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

nmap /c c{here we pending for a motion}/<C-r>"<CR>

แผนที่ควรทำดังนี้:

  1. เปิดใช้งานcโอเปอเรเตอร์และฟังการเคลื่อนไหวครั้งต่อไป
  2. เช่นฉันสามารถพิมพ์ที่นี่t,เพื่อเปลี่ยนแปลงทุกอย่างก่อนเครื่องหมายจุลภาคถัดไป
  3. ไปที่โหมดแทรกเพื่อลบทุกอย่างระหว่างเคอร์เซอร์และเครื่องหมายจุลภาค;
  4. ข้อความที่ถูกลบจะถูกค้นหาโดยอัตโนมัติในรูปแบบ

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

UPDATE

คำตอบคือสิ่งที่ฉันต้องการ แต่! เมื่อฉันกดพิมพ์สิ่งที่แทนคำนั้นกด/cw <Esc>หลังจากที่ฉันคาดว่าจะทำเช่นเดียวกันกับเหตุการณ์ที่เกิดขึ้นต่อไป แต่หลังจากนำเสนอn(ไปที่เหตุการณ์ถัดไป) และ.(ทำซ้ำคำสั่งสุดท้าย) เพียงแค่เติมข้อความที่พิมพ์ล่าสุดแทนการแทนที่ เป้าหมายหลักของการทำแผนที่คือใช้กับn/Nและ.เพื่อทำซ้ำ ฉันพลาดอะไรไปหรือเปล่า

คำตอบ:


9

:h map-operatorสนับสนุนกลุ่มผู้ประกอบการทำแผนที่

สิ่งที่คุณต้องการคือoperatorfuncและแผนที่ สำหรับความต้องการของคุณรหัสต่อไปนี้ทำงาน มันเป็นเพียงแค่ตัวอย่างเท่านั้น

nmap  <silent> /c :set opfunc=SpecialChange<CR>g@
function! SpecialChange(type)
    silent exec 'normal! `[v`]d'    
    silent exec 'let @/=@"' 
    startinsert
endfunction

โปรดทราบว่า exec 'let @/=@"'เพียงเพื่อเน้นรหัสในบัฟเฟอร์ หากคุณไม่ต้องการเห็นไฮไลท์ทันทีคุณสามารถทำได้let @/=@"


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

คุณมีตัวดำเนินการสองตัว ( /cและi) เป็นกลุ่ม.เพียงทำซ้ำตัวสุดท้าย หากคุณต้องการขยายให้ตรวจสอบrepeatปลั๊กอิน @TimurFayzrakhmanov ยังมี:gและ:sคำสั่งอาจช่วยคุณได้เช่นกัน
Kent

มี"รหัสแปลก ๆในของคุณ'let @/=@""'? ฉันคิดว่ามันเป็นไปได้เช่นsilent exec 'normal! [v ]c'เพราะcตัวดำเนินการทำตามที่ฉันคาดไว้ยกเว้นว่าจะไม่เพิ่มข้อความที่เปลี่ยนแปลงไปยังรูปแบบการค้นหา
Timur Fayzrakhmanov

1
@ TimurFayzrakhmanov "" เป็นตัวพิมพ์ผิด .. แก้ไข .. ฉันมาด้วยcเช่นกัน แต่มันเพิ่มช่องว่างเพราะมีการเปลี่ยนแปลงโหมดn-i-n-iฉันเดาว่า ... ทำแบบทดสอบบางอย่างที่คุณจะเห็น
Kent

@TimurFayzrakhmanov คุณสามารถทำให้มันทำซ้ำโดยไม่ใช้ปลั๊กอินใด ๆ โดยการเปลี่ยนdไปyและstartinsertจะcall feedkeys("cgn", 'n')(ดูคำตอบของฉันด้านล่าง)
เจอโรม Dalbert

4

เป็นการง่ายกว่าที่จะใช้การแมปที่ซับซ้อน (และเอกสาร) โดยใช้ฟังก์ชัน:

function! DoMagic()
   execute "normal! d".input("enter motion: ")
   let @/=@"
   startinsert
endfunction

จากนั้นทำการเรียกการแมปของคุณไปที่ฟังก์ชัน:

nmap /c :call DoMagic()<CR>

แก้ไข:

:sหากเจตนาของคุณคือเพื่อดำเนินการค้นหาและแทนที่ในจำนวนมากในสถานที่ที่คุณควรลองคำสั่งแทน: คุณสามารถเปลี่ยนการแมปของคุณเพื่อคัดลอกส่วนที่เลือกเป็นรูปแบบการค้นหา:

function! DoMagic2()
   normal! gv"ay
   return @a
endfunction

vmap /c :<c-w>%s/<C-r>=DoMagic2()<CR>//gc<left><left><left>

1
นี่คือแม้จะมี UI "ดี" ทำงานได้สำหรับความต้องการของ OP และสามารถ "มากกว่า" กว่าที่คาดไว้ขึ้นอยู่กับสิ่งที่คุณป้อน เช่นเมื่อมีคนเห็นenter motion:เขาให้: t,ggVGJZZ ^ _ ^ มันเป็นปัญหาที่พบบ่อยสำหรับการต่อข้อมูลคำสั่ง
Kent

นั่นคือสิ่งที่ฉันต้องการ เช่นผมกดแล้วพิมพ์สิ่งที่แทนคำนั้นกด/cw <Esc>หลังจากที่ฉันต้องการทำเช่นเดียวกันกับเหตุการณ์ที่เกิดขึ้นต่อไป แต่หลังจากนำเสนอn(ไปที่เหตุการณ์ถัดไป) และ.(ทำซ้ำคำสั่งสุดท้าย) เพียงแค่เติมข้อความที่พิมพ์ล่าสุดแทนการแทนที่ เป้าหมายหลักของการทำแผนที่คือใช้กับn/Nและ.เพื่อทำซ้ำ ฉันพลาดอะไรไปหรือเปล่า
Timur Fayzrakhmanov

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

ขอบคุณสำหรับคำตอบ มันมีประโยชน์มากเกินไป แต่ฉันยอมรับ @ Kent 'หนึ่งเพราะมันทำเคลื่อนไหวทันทีหลังจากที่ผมพิมพ์ (โดยไม่ต้องรอดำเนินการ<CR>จากinput())
Timur Fayzrakhmanov

1
@TimurFayzrakhmanov คุณสามารถลองทดแทนตามที่อธิบายในการอัปเดต
mMontu

1

วิธีนี้ใช้ได้กับ "คำสั่งสุดท้ายซ้ำ" (aka .):

nmap <silent> /c :set opfunc=ChangeOccurence<CR>g@

function! ChangeOccurence(type)
  exec 'normal! `[v`]y'
  let @/ = @"
  call feedkeys('cgn', 'n')
endfunction

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

เลือกถ้าคุณชอบมีไฮไลท์ของการจับคู่คำที่คุณสามารถแทนที่โดย'cgn''n``cgn'

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