เพิ่มการปิด "หรือ" โดยอัตโนมัติเมื่อแทรกเข้าไป แต่เมื่อเคอร์เซอร์ไม่ได้อยู่ในสตริงแล้ว


14

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

ฉันต้องการทำแบบเดียวกันกับ"และ'แต่เฉพาะเมื่อเคอร์เซอร์ไม่อยู่ในสตริง - เนื่องจากภายในสตริง'นั้นอาจเป็นเครื่องหมายอะโพสโทรฟีแทนที่จะเป็นตัวคั่นสตริง ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


5

วิธีการหนึ่งอาจใช้syn*ฟังก์ชั่น สิ่งที่ต้องการ:

fun! Qtx(qt)
    let x = synIDattr(synIDtrans(synID(line("."), col("."), 1)), "name")
    if x != "String" && x != "Comment" && x != "Constant"
        return a:qt . a:qt
    endif
    return a:qt
endfun


inoremap <silent> <expr> ' Qtx("'")
inoremap <silent> <expr> " Qtx('"')

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


เหตุผลเบื้องหลังชื่อฟังก์ชั่นQtxคืออะไร?
Martin Tournoij

@Carpetsmoker: Quouotix ยุติ eXitus
Runium

2

ตามที่ได้มีการกล่าวไว้คุณจะต้องตรวจสอบไวยากรณ์ - บริบท เก่าวงเล็บ-lh API ให้ฟังก์ชั่นเพื่อวัตถุประสงค์ที่: ฟังก์ชั่นMap*Context() ตั้งแต่นั้นมาคำจำกัดความของวงเล็บได้รับการห่อหุ้ม:Bracketซึ่งจะนำบริบท (สตริงหรือความคิดเห็น) มาประกอบการพิจารณา

โดยดีฟอลต์การแม็พการรับรู้บริบทถูกกำหนดไว้สำหรับคู่ของวงเล็บทั่วไปเช่นนี้:

  :Brackets! ( )
  :Brackets! [ ] -visual=0
  :Brackets! [ ] -insert=0 -trigger=<leader>[

  :Brackets! " " -visual=0 -insert=1
  :Brackets! " " -visual=1 -insert=0 -trigger=""
  :Brackets! ' ' -visual=0 -insert=1 -but=function('lh#ft#is_text')
  :Brackets! ' ' -visual=1 -insert=0 -trigger=''

  :Brackets! < > -visual=1 -insert=0 -trigger=<localleader><

  :Brackets! { }
  :Brackets! { } -visual=1 -insert=0 -nl -trigger=<leader>{
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.