ฉันจะใช้โหมดเสร็จสิ้นการแทรกในแมโครได้อย่างไร


11

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

a
b
c
d
e

เป็นนี้

arezzo
bywords
czars
détente
eyrie

สิ่งที่ฉันมี:

  • วางเคอร์เซอร์บนจดหมาย a
  • เริ่มบันทึกมาโคร qq
  • a เข้าสู่โหมดแทรก
  • <C-x><C-k> - perform dictionary completion on the character before cursor - in this case the lettera`
  • <C-p>arezzoเลือกรายการสุดท้ายในรายการเสร็จสิ้นที่ปรากฏขึ้นในระบบของฉันคำของมัน (NB ฉันได้longestรวมอยู่ในของฉัน'completeopt'การตั้งค่าที่จำเป็นสำหรับ<C-p>การทำงานในลักษณะนี้ในระหว่างการดำเนิน: 'set completeopt=longest,menuone,preview')
  • <C-y> ยอมรับความสำเร็จ
  • ^[^[ ออกจากโหมดแทรก
  • j ย้ายลงไปที่บรรทัดถัดไปพร้อมที่จะทำการดำเนินการเดียวกันในบรรทัดถัดไป
  • q หยุดการบันทึก

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

กำลังสแกนไฟล์พจนานุกรม

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


ฉันไม่เข้าใจ<C-p>ขั้นตอนของคุณ... เมื่อฉันทำเช่นนั้นในเสียงเรียกเข้าของฉันมันแค่ให้ข้อความback at original- ไม่ได้เลือกรายการสุดท้าย .. ฉันใช้ปุ่มลูกศรขึ้นสองครั้งเพื่อเลือกคำสุดท้าย (กรณีของฉันazures) กด enter และ จากนั้นEsc+j+q.. มันทำงานได้ดีในการเรียกใช้แมโคร
Sundeep

1
จุดดีอา @spasic ฉันควรจะได้กล่าวถึง แต่ฉันใช้ set completeopt=longest,menuone,previewของlongestตัวเลือกซึ่งเป็นสาเหตุของ<C-p>การแทรกทันที ถ้าฉันลบออกlongestจากcompleteoptสตริงฉันจะได้รับพฤติกรรมเช่นเดียวกับคุณ ใช่ปุ่มลูกศรใช้งานได้! ขอบคุณ (ฉันลืมคุณสามารถใช้พวกเขาเพื่อนำทางรายการเสร็จสมบูรณ์)
the_velour_fog

บางทีเมนูป๊อปอัปกำลังรบกวน อาจลอง:set completeopt=และa<c-x><c-k><esc>jเป็นมาโครของคุณ
แอนโทนี

@tonton ฉันไม่แน่ใจว่าทำไม <Cp> ถึงไม่ทำงาน แต่ปุ่มลูกศรบอกทิศทางทำงานได้
the_velour_fog

คำตอบ:


2

แก้ไข : จริง ๆ แล้วคุณหลังจากเสร็จพจนานุกรม; คุณไม่จำเป็นต้องใช้โหมดแทรก (โหมด Ctrl + X) เพื่อทำสิ่งนี้ เมื่อคุณค้นพบมันทำให้การทำงานกับมาโครเป็นความเจ็บปวดที่แท้จริง สคริปต์ด้านล่างนี้สามารถใช้ในการทำพจนานุกรมให้สมบูรณ์โดยไม่ต้องใช้โหมดแทรกเพื่อให้คุณสามารถทำซ้ำภายในแมโครได้อย่างง่ายดาย

เพิ่มโค้ดด้านล่างลงใน.vimrcไฟล์ของคุณปิดและเปิด vim windows ใด ๆ อีกครั้งเพื่อหาฟังก์ชั่นใหม่แล้วบันทึกตัวเองสลับกัน<C-k>เพื่อเสร็จสิ้นและjเลื่อนลงไปที่บรรทัดถัดไป ฉันเพิ่มการตรวจสอบlongestตัวเลือกและถ้ามันถูกปิดใช้งานมันจะเลือกรายการแบบสุ่มโดยใช้เวลาแบบสุ่ม หากพบlongestตัวเลือกมันจะค้นหารายการที่ตรงกันที่ยาวที่สุดจากพจนานุกรมด้วยตนเองและแทรกเข้าไป

หากคุณไม่ชอบ<C-k>แผนที่คุณสามารถเปลี่ยนได้ตามที่เห็นสมควร ควรทำงานกับการทำแผนที่ใด ๆ ที่คุณชอบ

นอกจากนี้คำสั่งเพื่อส่งคืนนิพจน์สำหรับการแมปเพื่อประเมินเพิ่ม\<esc>อักขระไปยังจุดสิ้นสุดเพื่อให้เราออกจากโหมดแทรกโดยอัตโนมัติหลังจากการแทรกแต่ละครั้งและ0cwด้านหน้าที่จะเข้าสู่โหมดแทรกเพื่อเริ่มต้นด้วยและทำให้แน่ใจว่าเราเขียนทับทั้งคำ ได้อย่างถูกต้อง ขึ้นอยู่กับพฤติกรรมที่แน่นอนที่คุณต้องการ (หากคำพูดของคุณไม่ได้อยู่ที่ด้านหน้าของแต่ละบรรทัด) คุณสามารถใช้bcwแทนเพื่อหาคำเริ่มต้นที่แท้จริง อย่างไรก็ตามคุณจะเห็นสิ่งแปลกประหลาดบางอย่างเมื่อกลับไปที่คำที่เริ่มต้นบรรทัด อาจมีคำสั่งขั้นสูงกว่าที่จะเพิกเฉยต่อการสิ้นสุดบรรทัดและทำทั้งสองอย่างพร้อมกัน แต่ฉันไม่สามารถหาได้

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun

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


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

คุณลองsleepคำสั่งด้วยหรือไม่
ทิม

ใช่แม้ว่าจะมีค่าที่แนะนำของคุณ 5 วินาทีเท่านั้น คุณจัดการเพื่อให้ได้วิธีแก้ปัญหาทั้งการทำงานหรือไม่ คุณช่วยโพสต์รายชื่อขั้นตอนทั้งหมดได้ไหม
รวย

ฉันไม่ใช่คนที่เขียนคำถาม แต่ผมสามารถทำซ้ำปัญหา: คุณจะต้องเพิ่มที่ยาวที่สุดในการcompleteoptที่อธิบายไว้ในการแสดงความคิดเห็น (อีกครั้งไม่ได้โดยฉัน) แก้ไข : โอ๊ะ'longest'เป็นสิ่งจำเป็นสำหรับctrl-pขั้นตอน: ctrl-yไม่ ยังคงขั้นตอนที่อธิบายโดยผู้ถามคำถามทำงานให้ฉันvim -Nu NONEด้วยพร้อมcompleteoptแก้ไข
รวย

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