इंसर्ट मोड में अक्षरों का क्रम मैप करें


11

मैं पहले से ही सम्मिलित मोड में एक महत्वपूर्ण संयोजन को मैप कर सकता हूं:

:inoremap abc <do stuff>

हालाँकि, इसकी कुछ कमियाँ हैं:

  • अनुक्रम के एक आंशिक संस्करण को टाइप करते समय, जैसे कि ab, वर्ण वास्तव में थोड़े समय के लिए प्रदर्शित नहीं होते हैं, क्योंकि यह "प्रतीक्षा" है यह देखने के लिए कि क्या आप पूर्ण कमांड टाइप करने जा रहे हैं। यह अवांछनीय है; यदि श्रृंखला का एक आंशिक विकल्प डाला जाता है, तो मैं बिना रुके पत्रों की एक श्रृंखला को मैप करना चाहता हूं।

  • यदि मैं टाइप करता हूं ab, तो विराम दें (और प्रतीक्षा करें जब तक कि पात्रों को वास्तव में उपरोक्त बिंदु में वर्णित नहीं किया गया है), तब टाइप करें c, कमांड निष्पादित नहीं किया गया है। मैं चाहता हूं कि कमांड को क्रियान्वित किया जाए चाहे मैं कितनी भी प्रतीक्षा करूं।

मैं एक का उपयोग करेगा iab, लेकिन यह काम नहीं करता क्योंकि:

  1. यह स्ट्रिंग के बाद एक स्थान में प्रवेश करने की आवश्यकता है
  2. मैं इसके साथ मनमाना आदेशों को निष्पादित नहीं कर सकता, केवल पाठ की एक स्ट्रिंग सम्मिलित करता हूं।

क्या कमांड या कीस्ट्रोक्स को निष्पादित करने का कोई तरीका है यदि एक निश्चित स्ट्रिंग को डालने के मोड में डाला जाता है, बिना नक्शे का उपयोग किए (जो हर बार जब मैं टाइप करता हूं aऔर अगर मैं बहुत लंबा इंतजार करता हूं तो काम नहीं करता)?


ये कमियां भी सच हैं :cnoremap abc <do stuff>...
मार्टिन टूरनोइज

1
जब आप करते हैं तो कोई देरी नहीं होती है ab<any key>
romainl

जवाबों:


10

यहाँ ऐसा करने का एक तरीका है:

let s:inputBuffer = ''

augroup _silentInsertTrigger
    autocmd!
    autocmd InsertCharPre * call <sid>OnPreEnterChar()
    autocmd InsertLeave * call <sid>OnInsertLeave()
augroup END

function! s:OnPreEnterChar()
    let s:inputBuffer .= v:char

    if s:inputBuffer[-3:] ==# 'abc'
        echo '<do stuff>'
    endif

    return v:char
endfunction

function! s:OnInsertLeave()
    let s:inputBuffer = ''
endfunction
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.