किसी को सम्मिलित करते समय स्वचालित रूप से एक समापन "या 'जोड़ें, लेकिन केवल अगर कर्सर पहले से ही एक स्ट्रिंग के अंदर नहीं है


14

vimrcजब मैं अपने साथ खुलता हूं, तो मैं अपने आप को बंद कोष्ठक और ब्रेसिज़ में प्रवेश करने के लिए मैपिंग परिभाषित करता हूं inoremap ( ()<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?
मार्टिन टूरनोइज

@Carpetsmoker: Quouotix ईएक्सआईटी का समापन करता है।
रनियम

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>{
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.