มีวิธีการตรวจสอบว่าฉันบันทึกใน vimscript หรือไม่?


11

มีอะไรที่เหมือนกันไหม

eval("is_recording()")

ฉันจะโทรหา vimscript ของฉันเพื่อดูว่าฉันกำลังบันทึกแมโครหรือไม่ ฉันจะคิดว่างานนี้:

eval("mode(1)")

แต่นั่นเพิ่งกลับ"n"มา

ไม่แน่ใจว่ามันสำคัญหรือไม่ แต่ฉันใช้ neovim ดังนั้นถ้าเป็นพิเศษกับ neovim มันก็ใช้ได้


3
IMHO มันจะเป็นความคิดที่ไม่ดี - "การบันทึก" ในกรณีนั้นจะกลายเป็นชื่อปลอม :) ไม่รู้ว่าคุณกำลังพยายามทำอะไร แต่บางทีการถามคำถามนั้นอาจมีวิธีที่แตกต่างกันในการแก้ปัญหา
VanLaser

@VanLaser คุณหมายถึงชื่อที่ผิด ๆ ?
James

1
หากแอคชั่น Vim นั้นแตกต่างกันเมื่อคุณทำการบันทึกนั่นหมายถึงกระบวนการบันทึกนั้นส่งผลกระทบต่อแอคชั่นเมื่อมันควร "จัดเก็บ" เพื่อการทำซ้ำในภายหลังเท่านั้น คุณคาดหวังอะไรจะเกิดขึ้นเมื่อคุณเรียกใช้แมโคร
VanLaser

คำตอบ:


4

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

ตอนนี้ที่นี่เป็นวิธีแก้ไขปัญหาอาจไม่เหมาะและแน่นอนไม่แข็งแกร่งมาก แต่คุณสามารถเพิ่มบรรทัดเหล่านี้ใน.vimrc:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

แนวคิดก็คือ "โหมดการบันทึก" จะสลับเฉพาะเมื่อคุณกดqในโหมดปกติ

ขึ้นอยู่กับว่าคุณสร้างตัวแปรg:isRecordingซึ่งจะถูกสลับในแต่ละครั้งที่คุณเริ่มหรือหยุดการบันทึก วิธีนี้เมื่อคุณเริ่มการบันทึกg:isRecordingจะถูกตั้งค่าเป็น1และ0เมื่อคุณหยุดการบันทึก จากนั้นคุณสามารถเข้าถึงสถานะการบันทึกผ่านค่าตัวแปร

ว่า "อุปสรรค" คือการที่จะหลีกเลี่ยงการทำแผนที่ recursive คุณจะต้องใช้ในการเริ่มต้นและหยุดการบันทึกแทนShit-q (โปรดทราบว่ามันไม่ใช่ปัญหาใหญ่เช่นนี้: ฉันเคยใช้เพื่อสลับโหมดบันทึกบางครั้งเพราะฉันไม่ชอบพฤติกรรมดั้งเดิม)qshift-qshift-q

ปัญหาหลักของการแก้ปัญหานี้คือถ้าคุณลืมมันและใช้qตัวแปรจะไม่ถูกสลับ แต่คุณไม่สามารถปิดการใช้งานq(เช่นด้วยnnoremap q <nop>) เพราะถ้าคุณทำมันshift-qจะไม่ทำงานอีกต่อไป


2

นี่เป็นคำขอที่ค่อนข้างน่าสนใจเนื่องจากไม่มี "โหมด" สำหรับการบันทึกแมโคร หลังจากขุดเอกสารบางฉบับฉันพบสิ่งต่อไปนี้usr_10

คุณเริ่มต้นด้วยการย้ายไปที่อักขระตัวแรกของบรรทัดแรก ถัดไปคุณดำเนินการคำสั่งต่อไปนี้:

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

^ ย้ายไปที่จุดเริ่มต้นของบรรทัด

i # สอดแทรก "สอดสตริง #include" ที่ด้านบนของบรรทัด

$ ย้ายไปที่ท้ายบรรทัด

"ผนวกเครื่องหมายอัญประกาศคู่อักขระ (") ต่อท้ายบรรทัด

j ไปที่บรรทัดถัดไป

หยุดบันทึกแมโคร

สิ่งที่ยอดเยี่ยมสำหรับฉันคือบรรทัดเกี่ยวกับ "เริ่มการบันทึกแมโครในการลงทะเบียน a"

เนื่องจากแต่ละแมโครจะถูกบันทึกลงทะเบียนโดยค่าเริ่มต้นฉันหวังว่าเราจะสามารถดูได้ใน:regรายการ ปรากฎว่ามันใช้งานได้เหมือนมีเสน่ห์!

ตัวอย่าง:

ในโหมดปกติ: qaisomething<Esc>

และภายในของ:regเราเห็นรายการ!

"a   isomething^[

ด้วยความรู้ที่ว่าคุณควรจะสามารถ "สอดแนม" บนรีจิสเตอร์เพื่อยืนยันว่าแมโครถูกบันทึกไว้ (ใช้การลงทะเบียนที่มีชื่อในทุกการบันทึก [แผนที่qจะใช้การลงทะเบียนเดียวกันเสมอ (หรืออะไรทำนองนั้น)]

หากคุณพบปัญหาโปรดแจ้งให้เราทราบและฉันจะพยายามช่วยคุณ (เนื่องจากการทำงานนี้เป็นสิ่งใหม่สำหรับฉันเช่นกัน: D)

แก้ไข เพื่อแก้ไขปัญหาของการลงทะเบียนที่ใช้ในระหว่างการงัดฉันขอแนะนำให้ดูลงทะเบียนพิเศษชนิดที่คุณสามารถใช้เฉพาะสำหรับการที่vimLคุณกำลังเขียน (ไม่งัดจะเคยมีส่วนร่วมในการลงทะเบียน ( "ay))

นี่คือข้อมูลบางส่วนจาก:help registersการลงทะเบียนที่มีอยู่

การลงทะเบียนมีสิบประเภท: ลงทะเบียน E354

  1. การลงทะเบียนที่ไม่มีชื่อ ""

  2. 10 หมายเลขทะเบียน "0 ถึง" 9

  3. ทะเบียนลบขนาดเล็ก "-

  4. 26 ชื่อลงทะเบียน "a ถึง" z หรือ "A ถึง" Z

  5. การลงทะเบียนแบบอ่านอย่างเดียวสามรายการ ":,"., "%

  6. บัฟเฟอร์สำรองทางเลือก "#

  7. นิพจน์รีจิสเตอร์ "=

  8. การเลือกและการลงทะเบียน "*," + และ "~

  9. หลุมดำลงทะเบียน "_

  10. รูปแบบการค้นหาล่าสุดลงทะเบียน "/

สมมติว่าคุณมีการลงทะเบียนที่คุณจะใช้ตอนนี้ปัญหาจะกลายเป็น "ฉันจะรู้ได้อย่างไรว่าเมื่อการบันทึกหยุดลง" ในการดูแลของผมนี้จะใช้เวลาดูที่autocmd-eventสำหรับCursorHold; หมายเหตุในเอกสารความช่วยเหลือมีแนวโน้มที่ค่อนข้างดี (ฉันพยายามที่จะเข้าใจว่าฉันสามารถแยกเคอร์เซอร์ปกติกับเหตุการณ์ที่ไม่ได้ใช้งาน / ไม่มีอยู่จริงที่เกิดขึ้นเมื่อลงทะเบียนของคุณเพื่อวัตถุประสงค์ของมาโครได้อย่างไร)

CursorHold

เมื่อผู้ใช้ไม่ได้กดปุ่มสำหรับเวลาที่ระบุด้วย 'updatetime' ไม่ทริกเกอร์อีกครั้งจนกว่าผู้ใช้กดปุ่ม (เช่นจะไม่ยิง 'updatetime' ms ทุกครั้งถ้าคุณปล่อยให้ Vim ทำกาแฟ :) ดู | CursorHold-example | สำหรับดูตัวอย่างแท็ก เหตุการณ์นี้เกิดขึ้นในโหมดปกติเท่านั้น มันจะไม่ทริกเกอร์เมื่อรอการอาร์กิวเมนต์ของคำสั่งที่จะพิมพ์หรือการเคลื่อนไหวหลังจากผู้ประกอบการ ในขณะที่บันทึกเหตุการณ์ CursorHold จะไม่เปิดขึ้น | Q |


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

ความหวังของฉันคือการที่คุณจะสามารถใช้บางอย่างเช่นทะเบียน blackhole (การลงทะเบียนที่จะไม่ถูกดึงไปตลอดกาล) หากคุณมีการลงทะเบียนที่ถูกล็อคคุณสามารถเช็คเอาต์ CursorHold ซึ่งมีพฤติกรรมพิเศษเมื่ออยู่ในโหมดบันทึก (จะอัปเดตคำตอบของฉันพร้อมข้อมูลเพิ่มเติมเพื่อดูว่ามันช่วยคุณได้หรือไม่)
Dan Bradbury

เพิ่มข้อมูลบางอย่างเกี่ยวกับรีจิสเตอร์อื่น (วิธีหลีกเลี่ยงความขัดแย้งกับงัด) และคำแนะนำเกี่ยวกับวิธีที่เราสามารถจับ "การบันทึก" ด้วย CursorHold ไม่ได้ใช้งานในระหว่างการบันทึกแมโคร หากคุณยังคงต่อสู้ต่อไปหลังจากบันทึกย่อเหล่านั้นแจ้งให้เราทราบและฉันสามารถลองใช้งานได้หลังจากเลิกงานแล้ว ในฐานะที่เป็นโน้ตที่blackhole registerถูกกล่าวถึงเป็นเพียงคำใบ้และชิ้นอันธพาลที่น่าสนใจซึ่งอาจนำไปสู่บางสิ่งบางอย่าง (มันจะไม่เป็นประโยชน์ในการใช้งานเมื่อบันทึกมาโคร; เนื่องจาก @_ ไม่สามารถใช้งานได้) ในความเป็นจริง ไป .. ..
แดนแบรดบูรี่

เมื่อคืนนี้ฉันใช้เวลาไปหนึ่งชั่วโมง (โพสต์แป้นพิมพ์เบียร์ทุบอย่างแรง) และพบว่ามันยากที่จะเข้าใจได้อย่างชัดเจนว่าเกิดอะไรขึ้นเมื่อการบันทึกเกิดขึ้นและสิ้นสุดลง ลางสังหรณ์ของฉันCursorHoldดูเหมือนจะเป็นความฝันที่เป็นไปไม่ได้เนื่องจากความล่าช้าของCursorHold เหตุการณ์ที่เกิดขึ้นจริง (ทำให้เพิ่มขึ้นทั่วโลกที่เรียบง่ายที่จะเกิดขึ้นทุกครั้งที่ดูนี้) ยังคงมีความสนใจอย่างไม่น่าเชื่อที่จะเกิดขึ้นกับวิธีการทำเช่นนี้และจะทุบใบหน้าของฉันกับกุญแจต่อไปจนกว่าเราจะได้วิธีแก้ปัญหา ..
Dan Bradbury

ในความคิดของฉันคุณไม่มีตัวเลือกต่าง ๆ นับพัน: คุณต้องแทนที่การทำงานของqมันและทำให้มันสลับตัวแปรและเริ่ม / หยุดการบันทึก autocomand ไม่สามารถเชื่อถือได้ที่นี่เนื่องจากไม่มีทริกเกอร์ autocmd ในการกดปุ่มและมันเป็นไปไม่ได้ที่จะสร้างฟังก์ชั่นการเลือกตั้งเนื่องจากลักษณะ monothread ของ Vim ขอให้โชคดีกับการทดลองในอนาคตของคุณ :-)
statox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.