मैं केवल प्रश्न (1) को संबोधित करने जा रहा हूं।
आपकी समस्या KEYTIMEOUT है। मैं zshzle (1) से बोली:
जब ZLE टर्मिनल से एक कमांड पढ़ रहा होता है, तो यह एक अनुक्रम पढ़ सकता है जो कुछ कमांड के लिए बाध्य होता है और एक लंबे समय तक चलने वाले स्ट्रिंग का एक उपसर्ग भी होता है। इस मामले में ZLE यह देखने के लिए एक निश्चित समय प्रतीक्षा करेगा कि क्या अधिक वर्ण टाइप किए गए हैं, और यदि नहीं (या वे किसी भी लंबे स्ट्रिंग से मेल नहीं खाते हैं) तो यह बाध्यकारी निष्पादित करेगा। यह टाइमआउट KEYTIMEOUT पैरामीटर द्वारा परिभाषित किया गया है; इसका डिफ़ॉल्ट 0.4 सेकंड है। कोई समयबाह्य नहीं है यदि उपसर्ग स्ट्रिंग स्वयं एक कमांड के लिए बाध्य नहीं है।
ईएससी से टकराने के बाद आपको जो देरी हो रही है, वह 0.4s है। फिक्स को शेल स्टार्टअप स्टार्टअप फ़ाइलों में से एक में 0.01% तक सही सेट करना है:
export KEYTIMEOUT=1
दुर्भाग्य से यह एक दस्तक पर प्रभाव है: अन्य चीजें गलत होने लगती हैं ...
सबसे पहले, vi कमांड मोड में अब एक समस्या है: टाइपिंग ESC कर्सर को लटका देता है, और फिर आप जो भी टाइप करते हैं, वह अगले निगल जाता है। ऐसा इसलिए है क्योंकि ESC vi कमांड मोड में डिफ़ॉल्ट रूप से किसी भी चीज़ के लिए बाध्य नहीं है, फिर भी बहु-वर्ण विजेट हैं जो ES (कर्सर कुंजी!) से शुरू होते हैं। इसलिए जब आप ESC से टकराते हैं, तो ZLE अगले चरित्र की प्रतीक्षा करता है ... और फिर उसका उपभोग करता है।
ईएससी को कमांड मोड में किसी चीज़ से बाँधने के लिए यह फिक्स है , इस प्रकार यह सुनिश्चित करना कि $ KEYTIMEOUT सेंटीसेकंड के बाद कुछ ZLE को पास हो जाए। अब हम बिना इन प्रभावों के कमांड मोड में ईएससी से शुरू होने वाली बाइंडिंग को चालू रख सकते हैं। मैं ईएससी को घंटी के पात्र से बांधता हूं, जो मुझे आत्म-सम्मिलन की तुलना में कम दखल देने वाला लगता है (और मेरा खोल चुप हो जाता है):
bindkey -sM vicmd '^[' '^G'
अपडेट 2017:
मैंने तब से ESC - undefined-key
विजेट को बांधने के लिए एक और बेहतर समाधान ढूंढ लिया है । मुझे यकीन नहीं है कि जब यह मूल रूप से मैंने यह उत्तर लिखा था, तो यह विजेट zsh में उपलब्ध था या नहीं।
bindkey -M vicmd '^[' undefined-key
अगली समस्या: डिफ़ॉल्ट रूप से ^ एक्स वि इन इन्सर्ट मोड में शुरू होने वाले कुछ दो-कुंजी विजेट हैं; अगर $ KEYTIMEOUT सभी तरह से नीचे सेट है तो ये बेकार हो जाते हैं। मैं क्या करता हूं, निर्गमन ^ X को vi आवेषण मोड में (यह डिफ़ॉल्ट रूप से स्व-सम्मिलित है); यह उन दो-कुंजी विजेट को काम जारी रखने की अनुमति देता है।
bindkey -rM viins '^X'
आप सेल्फ-इंसर्ट के लिए बाइंडिंग खो देते हैं, लेकिन आप इसे किसी और चीज़ से बाँध सकते हैं। (मैं नहीं, क्योंकि मेरे पास इसका कोई उपयोग नहीं है।)
आखिरी समस्या (मैंने अब तक पाया है): कुछ शेष डिफ़ॉल्ट कीबाइंडिंग हैं, जिन्हें हम सही रूप से $ KEYTIMEOUT सेट करने के कारण "खो" देते हैं, बुद्धि के लिए: जो ESC के साथ vi आवेषण मोड में शुरू होते हैं जो कर्सर कुंजी नहीं हैं । मैं व्यक्तिगत रूप से उन्हें ^ X के साथ शुरू करने के लिए विद्रोह करता हूं:
bindkey -M viins '^X,' _history-complete-newer \
'^X/' _history-complete-older \
'^X`' _bash_complete-word
अपडेट 2018:
यह ऊपर पूरे खंड को बदल देता है ("अपडेट 2017" के बाद) आवश्यक नहीं है। कीबोर्ड मैपिंग में ESC के बराबर होने के लिए META कुंजी को सेट करना संभव है:
bindkey -mv
इसलिए यह संभव है कि ^ X को अनबाइंड न किया जाए और इसके बजाय एक लीडर के रूप में META दबाकर ESC में शुरू होने वाली कीबाइंडिंग को एक्सेस किया जाए (आधुनिक कीबोर्ड पर ALT या OPT)।
यदि आपके पास पुस्तक से बैश से जेड शेल तक कील्ड एट अल।, कीबाइंडिंग में ईएससी और मेटा की समानता अध्याय 4 साइडबार में पीपी 78-79 पर चर्चा की गई है।
i
मोड डालने के लिए दो बार हिट करना पड़े, तो मैं इस फिक्स की अत्यधिक अनुशंसा करूंगा !