`ESC` कर्सर को पीछे क्यों हिलाता है?


62

विम में, जब मैं ESCकमांड मोड पर लौटने के लिए मारा , तो कर्सर एक वर्ण को बाईं ओर ले जाता है। यह वह नहीं lहै जिसकी मैं उम्मीद करता हूं, कभी-कभार मैं तुरंत उस स्थान पर वापस जाने के लिए मारा , शायद एक चरित्र को हटाने के लिए।

क्या इस व्यवहार का कोई कारण है? क्या यह उपयोग के पैटर्न के लिए सुविधाजनक है जो मुझे याद आ रही है?


1
मैंने अभी तक इस पर कभी गौर नहीं किया है ... और मैं हर रोज विम का उपयोग करता हूं। मुझे पता नहीं क्यों, लेकिन मुझे जवाब सुनने में दिलचस्पी है।
गाबे

5
इंसर्ट मोड में वापस जाने पर, आप इंसर्ट के लिए 'i' के बजाय एपेंड के लिए 'a' दबा सकते हैं। फिर आप उस स्थिति में वापस आ जाएंगे जो भागने से पहले आप दबाए थे।
पेंग्विन 359

जवाबों:


40

सम्मिलित मोड में, कर्सर वर्णों के बीच या पहले या अंतिम वर्ण के पहले होता है। सामान्य मोड में, कर्सर एक चरित्र के ऊपर है (इस उद्देश्य के लिए नई वर्ण वर्ण नहीं हैं)। यह कुछ हद तक असामान्य है: अधिकांश संपादक हमेशा कर्सर को पात्रों के बीच रखते हैं, और अधिकांश कमांड कर्सर के बाद चरित्र पर कार्य करते हैं (नहीं, सख्ती से बोल रहे हैं, के तहत )। यह शायद आंशिक रूप से इस तथ्य के कारण है कि GUIs से पहले, टेक्स्ट टर्मिनलों ने हमेशा कर्सर को एक चरित्र (अंडरलाइन या ब्लॉक, शायद ब्लिंकिंग) पर दिखाया था। यह एब्सट्रैक्ट इन्सर्ट मोड में फेल हो जाता है क्योंकि इसके लिए एक और पोजिशन (पोस्ट बनाम फेंस) की आवश्यकता होती है।

मोड के बीच स्विच करने से कर्सर को एक आधे चरित्र से स्थानांतरित करना पड़ता है, इसलिए बोलने के लिए। iआदेश चाल छोड़ दिया, चरित्र यह खत्म हो गया था से पहले कर्सर डाल करने के लिए। aआदेश सही ले जाता है। इंसर्ट मोड से बाहर जाकर ( Escसंभव होने पर) कर्सर को ले जाता है (यदि यह लाइन की शुरुआत में है, तो इसके बजाय इसे सही स्थानांतरित किया जाता है)।

मुझे लगता है कि Escव्यवहार के प्रकार समझ में आता है। अक्सर, आप पंक्ति के अंत में टाइप कर रहे हैं, और Escकेवल बाईं ओर जा सकते हैं। तो सामान्य व्यवहार सबसे आम व्यवहार है।

अंतिम दिलचस्प चरित्र के रूप में कर्सर के तहत चरित्र के बारे में सोचो, और सम्मिलित करें कमांड के रूप में a। आप a Escकर्सर को हिलाए बिना दोहरा सकते हैं , सिवाय इसके कि यदि आप एक गैर-खाली लाइन की शुरुआत में शुरू करते हैं, तो आपको एक ही स्थान पर टक्कर दी जाएगी।


21

नेत्रहीन, यह gvim में अधिक समझ में आता है:

संपादन करते समय, आपका कर्सर पात्रों के बीच में है:
यहाँ छवि विवरण दर्ज करें

सामान्य मोड में होने पर, यह अंतिम वर्ण के शीर्ष पर होता है:
यहाँ छवि विवरण दर्ज करें

तो यह वास्तव में एक चरित्र को वापस नहीं ले जाता है, बस बीच से r और sहोने पर r


1
बढ़िया फोटो। ईमानदार होने के लिए, मैं उस शिविर में हूं जो कहता है कि चरित्र mको सामान्य मोड पर लौटने पर हाइलाइट किया जाना चाहिए ...
स्टीवन लू

उफ़। तस्वीर लिंक अब मर चुके हैं।
स्टीवन लू

1
छवि लिंक अब मृत
स्टीवन लू

1
हाँ, आपकी छवियों को मैन्युअल रूप से होस्ट करना इस साइट पर मार्कडाउन संपादक में टूल का उपयोग करने की तुलना में अधिक काम और कम विश्वसनीय दोनों है।
स्टीवन लू

1
क्या उनके साथ फिर से सब कुछ ठीक है? यह "Cursor" है जो उन्होंने टाइप किया है और आपके पाठ में "j" का उल्लेख है
poige

15

यह व्यवहार यहां वर्णित के रूप में संपादन योग्य है , लेकिन रुकें और सोचें कि एक सेकंड के लिए क्या चल रहा है। जब आप इंसर्ट मोड में होते हैं, तो आप वास्तव में एक चरित्र से अधिक नहीं होते हैं लेकिन उन्हें बंद कर देते हैं। जब आप कुछ सम्मिलित करते हैं, तो कर्सर आपके द्वारा सम्मिलित किए गए अंत तक कूदता है ताकि सम्मिलित की गई अगली चीज़ उसके बाद होगी। अब इस बारे में सोचें कि क्या आपने अभी एक पत्र टाइप किया है, तो इसके लिए कुछ करना चाहते हैं। हिटिंग Escआपके द्वारा डाले गए अंतिम वर्ण पर सीधे चयनित कर्सर को रखेगा। यदि यह ऐसा नहीं करता है, तो यह वास्तव में अजीब होगा।

आप जिस स्थिति के बारे में सोच रहे हैं, वह तब है जब आप आवेषण मोड में घूम रहे हैं जैसे कि आप सामान्य मोड थे और फिर स्विच करें। उस स्थिति में कर्सर एक वर्ण पर वापस जाता दिखाई देता है, लेकिन अगर आपको लगता है कि इस तरह से यह पता चलता है कि आप सम्मिलित मोड में थे और आपके द्वारा किया गया अंतिम कार्य सम्मिलित नहीं था। शायद आपको सामान्य मोड में अधिक समय बिताना चाहिए?


15
यह मेरे लिए कोई मतलब नहीं है। आप बार-बार iऔर ESCकीपेस के चलने के पीछे के व्यवहार की व्याख्या कैसे करते हैं ?
वॉरेन यंग

4
इन्सर्ट मोड में जाना, कुछ भी इन्सर्ट नहीं करना, फिर उसे छोड़ना उचित परीक्षा नहीं है। अगर आप कुछ नहीं डालते हैं तो आप इन्सर्ट मोड में क्यों होंगे। यदि आप कुछ सम्मिलित करते हैं, तो सामान्य मोड में वापस जाने से आपको आपके द्वारा चुने गए चरित्र के साथ छोड़ दिया जाता है। बहुत सहज है।
कालेब

4
यह "निष्पक्ष" के बारे में नहीं है, यह व्याख्यात्मक शक्ति के बारे में है। यदि आपके ऑपरेशन का सिद्धांत सभी व्यवहार की व्याख्या नहीं करता है, तो यह अधूरा है या vi का व्यवहार असंगत है। मुझे विश्वास है कि vi हर तरह से परिपूर्ण है, और इसलिए सुसंगत है। :)
वॉरेन यंग

9
@Warren "पीछे की ओर चलना" के iबाद का व्यवहार ESCएक समारोह है iऔर पूरी तरह से स्वतंत्र है ESC; विशेष रूप से, जब आप हिट iकरते हैं , तो आप एक चरित्र डालने के लिए विम से पूछ रहे हैं , जिसका अर्थ है "मैं जिस पर हूं उससे पहले एक चरित्र सम्मिलित करता हूं", aजिसका विरोध "एक के बाद एक चरित्र को जोड़ना" है।
Kromey

3
सामान्य तौर पर, प्रत्येक परिवर्तन के बाद, जब मैं उस परिवर्तन को छोड़ता हूं, तो मैं उस परिवर्तन के साथ किया जाता हूं, और अगली चीज जो मैं करना चाहता हूं, उसमें संभवतः एक अलग परिवर्तन करना शामिल होगा। इस प्रकार, मेरे लिए, आवेषण मोड छोड़ने पर (कोई फर्क नहीं पड़ता कि मैंने इसे कैसे दर्ज किया), मैं आम तौर पर कर्सर को अगले चरित्र पर होना पसंद करता हूं, इसलिए मैं अपने अगले बदलाव के लिए तैयार हूं , बजाय इसके कि मैं सिर्फ बदलने के लिए तैयार हूं। सम्मिलित किया गया।
काइल स्ट्रैंड

6

टाइप Alt+ Lआदेश मोड पर लौटने के।

इसके लिए किसी रीमैपिंग या विम कॉन्फिग चेंज की आवश्यकता नहीं है। यह काम करता है सबसे टर्मिनल emulators पर क्योंकि Alt+ KEYएक भेजता है Escके बाद KEY(टर्म आप एक जोड़ने की जरूरत हो सकती है पर Xterm*metaSendsEscape: trueअपने ~ / .Xdefaults फ़ाइल में लाइन)। यह व्यवहार आपको अन्य इंसर्ट मोड संयोजनों को "बनाने" की अनुमति देता है जो बॉक्स को सही तरह से काम करता है - जैसे Alt+ Sको Backspace

वैसे, आपके द्वारा अभी-अभी लिखे गए वर्ण के शीर्ष पर कर्सर होने से बहुत असुविधा हो सकती है। उदाहरण के लिए, Escdwआपके द्वारा अभी-अभी डाले गए पाठ के बाद शब्द को नहीं हटाया जाएगा।


आपके द्वारा उल्लिखित असुविधा को भागने से पहले हमेशा सम्मिलित मोड में एक स्थान टाइप करके टाला जा सकता है। फिर इंसर्ट मोड छोड़ने वाले कर्सर को स्पेस में डाल दिया जाता है, और आप Esc d eसामने वाले शब्द को हटाने के लिए टाइप कर सकते हैं । मैं डिफ़ॉल्ट व्यवहार पर वापस लौट आया क्योंकि मुझे लगा कि इसने मेरे सिर में पहले से ही एनकोडेड अन्य व्यवहार बदल दिए हैं।
mljrg

4

यहाँ मेरा समाधान है।

यह इस बारे में विकिया पेज पर पेश किए गए समाधान का एक अधिक संक्षिप्त संस्करण है ।

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

+1 यहाँ भी, विकी पेज का हवाला देते हुए, भले ही उपयोगकर्ता वास्तव में इस व्यवहार को बदलने का तरीका नहीं पूछ रहा था।
काइल स्ट्रैंड

यदि आप विम में बहुत दूर खोदते हैं, तो आप ध्यान देंगे कि कई प्लगइन्स डिफ़ॉल्ट (थोड़े unintuitive) व्यवहार पर भरोसा करते हैं, इसलिए यदि आप किसी सामान को अनियमित रूप से खाते हैं या एकल चरित्र को देखते हैं, तो इसका कारण हो सकता है। मैं स्वयं इस ऑटोकेमैंड का उपयोग नहीं करता; हालांकि यह अच्छा काम करता है।
स्टीवन लू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.