शेल में वी कीबाइंडिंग का उपयोग करते समय वर्तमान वीआई मोड कैसे दिखाएं?


15

मैं अपने tcsh शेल में vi कीबाइंडिंग का उपयोग करता हूं।

अब, मुझे नहीं पता कि मैं किस वि मोड में हूं ( insertमोड या commandमोड), जिससे बहुत निराशा होती है।

क्या किसी को शेल में वर्तमान vi मोड दिखाने का कोई तरीका पता है? (प्रॉम्प्ट या कुछ में शामिल करके)

जवाबों:


4

मुझे विश्वास नहीं है कि नेत्रहीन रूप से यह निर्धारित करने का कोई तरीका है कि आप किस मोड में हैं, लेकिन यदि आप अपने व्यवहार को थोड़ा संशोधित करते हैं तो इससे कोई फर्क नहीं पड़ेगा।

यदि आप कमांड मोड में रहना चाहते हैं, तो कमांड टाइप करने से पहले ESC दबाएं।

अगर आप इन्सर्ट मोड में रहना चाहते हैं, तो टाइप करने से पहले ESC और i दबाएं।

आप ईएससी को बहुत अधिक दबाएंगे, लेकिन मैं कभी भी मिला प्रत्येक vi उपयोगकर्ता वैसे भी करता है।


1
समस्या यह है कि, शेल में, अतिरिक्त ESCs को नजरअंदाज नहीं किया जाता है - जब मैं एक अतिरिक्त ESC देता हूं, तो एक कमांड टाइप करें (बाएं को हिलाने के लिए h), यह बस एक बीप देता है और कुछ भी नहीं करता है।
सूंदर -

2
"अतिरिक्त ईएससी" से मेरा मतलब है कि जब मैं पहले से ही कमांड मोड में हूं तो ईएससी दबा रहा हूं - जो कि मैं बहुत कुछ करता हूं क्योंकि मुझे नहीं पता कि मैं किस मोड में हूं।
सूंदर -

तुम सही हो। मैंने इसे इतने लंबे समय तक इस्तेमाल किया है कि मैं उस व्यवहार को अब नोटिस भी नहीं करता। फिर, सबसे आसान जवाब। यदि आप ESC और h को हिट करते हैं और कुछ भी नहीं होता है, तो h को फिर से हिट करें। मुझे लगता है कि इससे एक और सवाल खुलता है। Vi कीबाइंडिंग के 'कमांड' मोड में ESC को दबाने पर अगला वर्ण सही ढंग से व्याख्या नहीं होने का कारण बनता है? vi स्वयं ऐसा नहीं करता है। मैं 10 बार ESC टाइप कर सकता हूं और अगला कमांड अभी भी प्रत्याशित है।
बॉब वेबर

एक और टिप, घंटी बंद करें। यह केवल आपके द्वारा वर्णित कारण के लिए अविश्वसनीय रूप से कष्टप्रद है - और क्योंकि यह टैब पूरा होने पर बीप करता है। आपके पर्यावरण के आधार पर ऐसा करने के विभिन्न तरीके हैं।
बॉब वेबर

1
ठीक है, मैं वर्तमान में इस समाधान की कोशिश कर रहा हूँ। कैप से बचने के लिए कैपिंग मैपिंग ने इसे आसान बना दिया है, लेकिन मुझे डालने के मोड के लिए ESC-i का उपयोग करना बाकी है। मुझे उम्मीद है कि मैं जल्द ही > यदि आप ईएससी और एच से टकराते हैं और कुछ नहीं होता है, तो हिट एच फिर से समस्या यह है, यह काफी निराशाजनक है और प्रवाह को बहुत अधिक तोड़ देता है। यह एक अतिरिक्त बात है जो मुझे उस आदेश के अलावा सोचना है जो मैं बना रहा हूं। मैं बहुत ही इस कारण से वाय कीबाइंडिंग पसंद करता हूं कि वे मेरी मांसपेशियों की स्मृति में हैं और इस बारे में सोचने के लिए एक कम चीज देते हैं - इस तरह से उस उद्देश्य को तोड़ता है ...
सूंदर -

3

मुझे प्रलेखन के माध्यम से एक नज़र मिली है, और मुझे कहना होगा कि मुझे वर्तमान vi- मोड का पता लगाने और प्रदर्शित करने का कोई तरीका नहीं मिला। मुझे आशा है कि आपके पास एक सुखद आश्चर्य है और कोई व्यक्ति एक समाधान के साथ आता है, लेकिन मैं निश्चित रूप से आपके द्वारा पूछे जाने वाले तरीके को नहीं देख सकता।

मुझे लगता है कि ऐसा करने का एक तरीका है, लेकिन यह एक छोटी सी झुंझलाहट के लिए बड़े पैमाने पर ओवरकिल है, और मुझे नहीं लगता कि जब आपने इस सवाल को रखा था तो आपके मन में क्या था। अगर यह सच है, तो अभी पढ़ना बंद करो और अपने जीवन का आनंद लो।

OTOH, अगर यह वास्तव में आपका पालतू पशु है, और यह आपको पागल कर रहा है, और आप वास्तव में पूरी तरह से इस समस्या को दूर करना चाहते हैं, तो यहां इसके बारे में जाने का मेरा विचार है:

  1. डब्ल्यू। रिचर्ड स्टीवंस द्वारा UNIX (R) पर्यावरण में उन्नत प्रोग्रामिंग की एक प्रति प्राप्त करें ।
  2. धाराओं और टर्मिनल I / O पर अध्याय पढ़ें ।
  3. स्रोत कोड को उपरोक्त पुस्तक में डाउनलोड करें , जिसमें एक धारा का एक उदाहरण शामिल है जिसे एक टर्मिनल पर स्तरित किया जा सकता है।
  4. Esc कुंजी संयोजन (या दोनों मोड परिवर्तन कुंजी) के लिए अपनी हैंडलिंग को लागू करें, और इसे वर्तमान लाइन की घंटी या पृष्ठभूमि हेरफेर के माध्यम से इंगित करें।

संक्षेप में, यूनिक्स उपकरण चालक और उपयोगकर्ता प्रक्रिया के बीच एक पूर्ण-द्वैध I / O धारा के रूप में टर्मिनल I / O को लागू करता है, जिसमें मॉड्यूल डाले जा सकते हैं। यह एक स्टैक के रूप में आयोजित किया जाता है, इसलिए आप जितनी चाहें उतनी धाराओं को परत कर सकते हैं। इंजेक्शन की धाराओं का योग आपके टर्मिनल I / O व्यवहार को बनाता है।

जब एक चरित्र में प्रवेश किया जाता है, तो पहला मॉड्यूल इसे निरीक्षण करने और इसे पास करने के लिए मिलता है (यदि यह चाहता है)। जब प्रतिक्रिया विपरीत दिशा में आती है, तो उसे फिर से निरीक्षण करने और इसे पारित करने का मौका मिलता है। यह कैसे एक सामान्य चरित्र कुंजी के लिए एक उच्च स्तर पर एक Ctrl-C हो जाता है।

आप एक स्ट्रीम मॉड्यूल को लागू करने के लिए एक द्विआधारी बना सकते हैं, कि जब अग्रभूमि में चुपचाप चलता है, तो सभी कीस्ट्रोक्स पर निरीक्षण करना और गुजरना, आपके द्वारा कीस्ट्रोक्स पर आपकी पसंदीदा कार्रवाई का प्रदर्शन करना। सभी इरादों और उद्देश्यों के लिए, यह प्रकट होगा जैसे कि आप शेल पर काम कर रहे हैं। ओह। आप इस बाइनरी को अपने .tcshrc की अंतिम (या पहली या किसी भी) लाइन पर लगा सकते हैं और आपको पता भी नहीं चलेगा कि यह वहां है।

यहां एक अच्छा प्राइमर है , लेकिन मैं इस विषय पर बहुत कुछ नहीं पा सका, शायद इसलिए कि यह इसके प्रमुख से अतीत है।


2

इस पृष्ठ में एक काफी विस्तृत स्क्रिप्ट है जो सेट करता है कि आप क्या चाहते हैं (और अधिक) zsh में । शायद इसे tsh के साथ काम करने के लिए अनुकूलित किया जा सकता है (मैं उस शेल से बहुत परिचित नहीं हूं)।


मैं tcsh से परिचित नहीं हूँ, लेकिन मुझे लगता है कि आपने जो पृष्ठ दिखाया है, वह zsh विजेट्स (zle के साथ) का उपयोग करता है। मुझे नहीं लगता कि अन्य गोले हैं, लेकिन अगर वे करते हैं, तो वह निश्चित रूप से चाल चलेगा।
ब्रायनएच

1

इस सटीक समस्या (अपने आप की तरह) होने किसी को भी करने के लिए: मैं एक समाधान नहीं मिला stackoverflow । जाहिरा तौर पर रीडलाइन में इसके लिए मूल समर्थन है, इसलिए आप बस निम्नलिखित को अपने साथ जोड़ सकते हैं ~/.inputrc:

set show-mode-in-prompt on

और वास्तविक चरित्र उपयोग को अनुकूलित करने के लिए:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"

0

कमांड लाइन संपादन tcsh के साथ

कमांड लाइन के संपादन के लिए दो मुख्य मोड हैं,
दो सबसे अधिक इस्तेमाल किए जाने वाले टेक्स्ट एडिटर्स, Emacs और vi पर आधारित है।

साथ vi बाइंडिंग, आप के बीच स्विच करना चाहिए डालने और आदेश मोड;
प्रत्येक मोड में विभिन्न कमांड उपयोगी होते हैं।

vi मोड में दो सबमोड, इन्सर्ट और कमांड मोड होते हैं।

  • डिफ़ॉल्ट मोड सम्मिलित है
  • आप दबाकर मोड के बीच टॉगल कर सकते हैंEsc
  • वैकल्पिक रूप से, कमांड मोड में,
    'a' (एपेंड) या 'i' (इन्सर्ट) टाइप करने से आप मोड डालने के लिए वापस आ जाएंगे

पहले से लिंक किए गए tcshअनुकूलन पृष्ठ पर अधिक नोट ।


2
आपके लिंक कॉपीराइट वाली ओ'रिली किताबों पर जाते हैं ...
ब्रायनएच

0

मुझे वही सटीक समस्या थी और दुर्घटना से समाधान मिल गया है। हालाँकि यह धागा पुराना है, मुझे कोई अन्य वेबसाइट नहीं मिली, जो एक समाधान प्रस्तुत करती है, इसलिए मुझे लगता है कि इस धागे पर पोस्ट करना ठीक है।

बस अपने टर्मिनल प्रोग्राम या शेल की सेटिंग्स को रीसेट करें। मैं वर्तमान में PuTTY का उपयोग कर रहा हूं, और मैंने अपने सहेजे गए कनेक्शन के लिए अपनी सहेजी गई सेटिंग्स को हटा दिया है, और एक सहेजे गए सत्र को फिर से बनाया है। एक जादू की तरह काम किया।

उम्मीद है की यह मदद करेगा!


0

कृपया एसओ पर मेरा जवाब देखें । बैश 4.4 / रीडलाइन 7.0 इस कार्यक्षमता के लिए समर्थन जोड़ देगा, और अंतरिम में मैंने बैश 4.3 / रीडलाइन 6.3 के पैच संस्करणों को github में प्रकाशित किया है ।

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