संक्षेप में:
- कीकोड एक कुंजी का प्रतिनिधित्व करने का एक तरीका है
- एक मैप किया गया कुंजी अनुक्रम एक क्रिया को ट्रिगर करने वाले कीकोड का उत्तराधिकार है
अब मुझे लगता है कि आपके सवाल का बीच अंतर के बारे में अधिक है timeoutlen
और ttimeoutlen
एक मैप की गई कुंजी अनुक्रम और एक कुंजी कोड के बीच अंतर करने के बजाय।
मेरा उत्तर इस विकिया लेख पर आधारित है, जिसे आपको वास्तव में पढ़ना चाहिए क्योंकि यह कुछ बिंदुओं को संबोधित करता है, जिनका उत्तर देने के लिए मैंने यहाँ उल्लेख नहीं किया है।
पहले मुख्य कोड के बारे में बात करते हैं। लेख दो प्रकार के कीकोड को परिभाषित करता है:
टर्मिनल कीकोड:
वे हैं कि कैसे टर्मिनल एक कुंजी का प्रतिनिधित्व करता है।
ये कोड जो टर्मिनल द्वारा विम को भेजे जाते हैं।
इन कीकोड की एक सूची प्राप्त करने के लिए आपको अपने टर्मिनल प्रलेखन का उपयोग करना चाहिए। आप cat
अपने टर्मिनल में कमांड टाइप करके और कीकोड को जानना चाहते हैं। मेरे टर्मिनल पर उदाहरण के लिए कुंजी कोड ShiftF1दिखता है:
^[[23~
विम कीकोड:
वे कैसे विम एक कुंजी का प्रतिनिधित्व करते हैं।
विम को कुंजियों का प्रतिनिधित्व करने के लिए एक सुसंगत तरीके की आवश्यकता है क्योंकि टर्मिनल के कीकोड एक टर्मिनल से दूसरे में बदलते हैं। विम कीकोड की एक सूची सुलभ है :h t_ku
। ShiftF1जैसे दिखने के लिए विम कीकोड :
<S-F1>
इस प्रकार जब मैं ShiftF1अपने कीबोर्ड पर प्रेस करता हूं, तो ड्राइवर और ओएस टर्मिनल को बताएंगे कि मैंने इन चाबियों को दबाया है कि यह व्याख्या करेगा ^[[23~
। टर्मिनल उस विम को भेजेगा जो यह समझेगा कि इसका मतलब है <S-F1>
और इस कुंजी कोड में मैप की गई कार्रवाई को ट्रिगर करेगा।
हम विम कुंजीकोड सेट कर सकते हैं, इसलिए यदि आपका टर्मिनल एक कुंजीकोड भेजता है जो विम को समझ में नहीं आता <S-F1>
है उदाहरण के लिए आप निम्नलिखित कमांड का उपयोग कर सकते हैं। यह विम को बताएगा कि कब आपको कीकोड मिलता है ^[[24~
, इसका अनुवाद करें <S-F1>
:
set <S-F1> ^[[24~
तो क्या एक मैप्ड कुंजी अनुक्रम है?
एक मैप किया गया कुंजी अनुक्रम मैपिंग का एक हिस्सा होगा और विम कुंजी कोड या टर्मिनल कुंजी कोड हो सकता है। उदाहरण के लिए:
:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>
पहला मैपिंग टर्मिनल कीकोड को मैप करेगा जबकि दूसरा मैप विम कोडकोड को मैप करेगा।
अब timeoutlen
और के बीच अंतर के लिए ttimeoutlen
?
ttimeoutlen
समय विम एक टर्मिनल कुंजी कोड के विभिन्न भागों के लिए प्रतीक्षा करेगा (हमारे पिछले उदाहरण में ^[
तब [
तब होगा 2
, आदि ...
चूंकि ये कीकोड टर्मिनल द्वारा भेजे जाते हैं इसलिए इन इनपुट के बीच देरी नहीं होनी चाहिए (क्योंकि उन्हें टर्मिनल द्वारा 'एक बार में सभी' भेज दिया जाता है)। यही कारण है कि डॉक्टर इस सेटिंग के लिए वास्तव में छोटे मूल्य की सिफारिश करते हैं।
timeoutlen
वह समय है जब विम क्रमिक Vim कीकोड के लिए प्रतीक्षा करेगा जो एक उपयोगकर्ता द्वारा मैन्युअल रूप से दर्ज किए जाते हैं और इस प्रकार एक टर्मिनल कीकोड की तुलना में इनपुट के लिए लंबा है।
एक उदाहरण का उपयोग करने के लिए मान लें कि:
- आपने
^[[1;6B
एक कार्रवाई के लिए मैप किया
^[1;6B
आपके टर्मिनल का कोडकोड है ctrlshiftdown
^[
आपके टर्मिनल का कोडकोड है Escape।
वह व्यवहार जिसकी आपको अपेक्षा करनी चाहिए:
- यदि आप एक बड़ा सेट करते हैं
ttimeoutlen
, तो हर बार जब आप टाइप करते हैं Escape, तो विम आपको देखने का इंतजार करेगा कि क्या आप ^[
(यानी Escape) या ^[1;6B
(यानी ctrlshiftdown)
- यदि आप एक छोटा सेट करते हैं
ttimeoutlen
, तो आपके पास टाइप करने में देरी नहीं होगी Escapeक्योंकि विम आपको पता चल जाएगा कि यह एक पूर्ण कीकोड है।
और timeoutlen
निम्न स्तर पर होने पर 'उच्च स्तर' पर कार्य करेगा:
inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>
जब आप jvim टाइप करेंगे तो इंतजार timeoutlen
नहीं करेंगे क्योंकि टर्मिनल कीकोड की शुरुआत jपूरी नहीं हुई है, लेकिन क्योंकि यह अगले विम कीकोड की प्रतीक्षा कर रहा है।
मुझे आशा है कि मेरी व्याख्या समझ में आती है, ध्यान दें कि मैंने जिन कुछ मैपिंग का उपयोग किया है, वे एक कार्यात्मक दृष्टिकोण से कोई मतलब नहीं रखते हैं लेकिन स्पष्टीकरण की सुविधा के लिए यहां हैं।