मैं d [काउंट] d को कैसे मैप कर सकता हूं?


18

NB यह "d3fg" कमांड कैसे काम करता है, इसका कोई डुप्लिकेट नहीं है ? बंद करने से पहले कृपया इसे पढ़ें!

मैं अपनी खोज में थोड़े से आवेग में आया हूं कि छोटे विलोपन को बड़े लोगों की तरह काम कर सकें । मेरे पास जो समस्या है वह यह है कि मैं यह पता नहीं लगा सकता कि कैसे कमांड को फिर से तैयार करना है d3d। वास्तव में, मैं यह भी नहीं समझ सकता कि वे पहली जगह में कैसे काम करते हैं, न ही विम की मदद में उनका कोई उल्लेख मिलता है। *

d3jसीधा है: यह dऑपरेटर को 3jगति पर लागू करता है,

3ddसीधा भी है: यह dd3 की "गिनती" के साथ कमांड चलाता है ।

d3d ऐसा लगता है कि यह सीधा होना चाहिए, यह dऑपरेटर को लागू करता है ... लेकिन क्या है 3d? यह एक गति नहीं है। यदि आप 3dअपने दम पर टाइप करते हैं, तो विम इसे एक ऑपरेटर द्वारा पीछा की गई गिनती के रूप में मानता है, और आगे के इनपुट के लिए धैर्यपूर्वक प्रतीक्षा करता है।

और आप अन्य ऑपरेटरों के लिए ऑपरेटरों को लागू नहीं कर सकते। ddदो ऑपरेटरों के अनुक्रम के रूप में मदद में वर्णित नहीं है। यह एक अलग, दो-कीस्ट्रोक कमांड है। (cf. dc, जो कुछ नहीं करता है।)

यह भी ऐसा प्रतीत नहीं होता है कि गिनती की स्थिति दो कीस्ट्रोक्स की आवश्यकता वाले कमांड के लिए लचीली है: 2gjकर्सर को दो स्क्रीन-लाइनों को नीचे ले जाता है, लेकिन g2jपहले दो कीबोर्ड को पूरी तरह से हटा देता है और कर्सर को एक लाइन से नीचे ले जाता है।

तो यह कैसे काम करता है? क्या यह विम के आंतरिक कोड में सिर्फ एक विशेष मामला है? क्या कोई तरीका है जिससे मैं d[count]dमैपिंग बना सकता हूँ ?

संपादित करें : यह एक पाठ वस्तु है? :h text-objectsइसे "टेक्स्ट ऑब्जेक्ट सिलेक्शन कमांड्स" की सूची में शामिल नहीं करता है, लेकिन फिर यह "छोटे से बड़े ऑब्जेक्ट्स में समूहीकृत" डिलीट की सूची में dd को शामिल करता है । और d2awकर्सर और नीचे दिए गए शब्द को हटा देता है। दूसरी ओर, c2dकुछ नहीं करता है।

* मुझे यकीन है कि उनमें से कुछ का अस्तित्व होना चाहिए, लेकिन मुझे यह नहीं मिल रहा है। मैंने 1-9 से एन के सभी मूल्यों के लिए पढ़ा है :help deleting, :help motion.txtऔर कोशिश की है:helpgrep dNd


2
मुझे लगता है कि अंतिम dपुष्टि के रूप में कार्य करता है; तो यह भी ऐसा ही है d3<CR>y3yऔर c3cसमान काम करें ... मैं इस पर कोई डॉक्स नहीं पा सकता हूँ हालांकि या तो विम: हेल्प, vi (1), nvi (1), या POSIX स्पेक ... यह इन viऔर nvibtw के समान व्यवहार करता है ।
मार्टिन टूरनोइज

1
एक तरह से, ddके समान है d__कर्सर को ( [count]-1) वें लाइन पर पहले गैर-रिक्त स्थान पर लाता है , लेकिन यह अलंकृत है, इसलिए जब इसे ऑपरेटर के साथ जोड़ा जाता है, तो यह पूरी लाइनों पर काम करता है। उस कारण से, यह समझ में आता है कि दोनों के बीच एक गिनती दिखाई दे सकती है d
तोमदो

जवाबों:


28

ऑपरेटर-लंबित मोड

एक ऑपरेटर (जैसे टाइपिंग के बीच d, cया gU) और एक प्रस्ताव (जैसे w, i}, या /foo<CR>), विम ऑपरेटर-लंबित मोड में है। आप इस का उपयोग करने के लिए मैपिंग बना सकते हैं :omapऔर :onoremap

मेरे उदाहरण में, मैं ऑपरेटर को लंबित dकरने जा रहा हूँ w। यह एक यादृच्छिक विकल्प है, क्योंकि मुझे नहीं पता कि आप वास्तव में इसके लिए क्या उपयोग करना चाहते थे।

एक थप्पड़ बनाएँ

चलो dऑपरेटर लंबित मोड के लिए एक मानचित्रण बनाएं । मैं मान रहा हूँ कि हम यहाँ (जैसे आपके .vimrc) VimScript लिख रहे हैं , इसलिए मैं अग्रणी :s को छोड़ दूँगा ।

onoremap d w

यह ddएक्ट जैसा बनाता है dw। यह भी d[count]dअधिनियम की तरह बनाता है d[count]w। लेकिन मुझे यकीन है कि आप dd(यानी, कोई [count]आपूर्ति नहीं ) के व्यवहार को प्रभावित नहीं करना चाहते थे ।

अभिव्यक्ति मैपिंग

अभिव्यक्ति मैपिंग आपको मैपिंग के दाईं ओर के निर्माण के लिए एक VimScript अभिव्यक्ति का मूल्यांकन करने देती है। अभिव्यक्ति को एक स्ट्रिंग का मूल्यांकन करना चाहिए। एक्सप्रेशन मैपिंग को <expr>कीवर्ड द्वारा दर्शाया जाता है ।

विम के कुछ अंतर्निहित वैरिएबल भी हैं जो विभिन्न समय पर आबादी वाले होते हैं, और अक्सर मैपिंग के दौरान उपयोगी होते हैं। उनमें से एक है v:count, जिसे [count]एक ऑपरेटर या गति को आपूर्ति की जाती है।

आइए डालते हैं सबको एक साथ। यदि [count]आपूर्ति नहीं की गई है, तो v:countहोगी 0। हम अपनी मैपिंग को dउस स्थिति में उपयोग करने के लिए कह सकते हैं ।

onoremap <expr> d v:count == 0 ? 'd' : 'w'

अब ddडिफ़ॉल्ट की तरह व्यवहार करता है (एक पंक्ति को हटाता है), लेकिन d[count]dजैसा व्यवहार करता है d[count]w। ठंडा!

dऑपरेटर के बाद उपयोग करने के लिए इसे प्रतिबंधित करें

आप कुछ नोटिस कर सकते हैं, हालांकि। अब cdजैसा बर्ताव करते हैं cw। यह एक समस्या नहीं हो सकती है, लेकिन पूर्णता के लिए, इसे प्रतिबंधित करें ताकि यह केवल dऑपरेटर के बाद काम करे ।

विम का एक और चर है, v:operatorजिसमें ऑपरेटर हाल ही में उपयोग किया गया है। कुछ भी करने से पहले, वह भी देख लें।

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : 'w'

नोट: चूँकि :mapकमांडों के साथ जंजीर हो सकती है |, इसलिए हमें यहाँ अपनी अभिव्यक्ति में इनसे बचना होगा। तो तार्किक या ऑपरेटर ||बन जाता है \|\|

कूल, इसलिए cdऔर c[count]dकुछ भी नहीं कर रहे हैं, जैसे वे करते थे। यह अच्छा है ताकि अन्य प्लगइन्स परिभाषित कर सकें cd

मैं कुछ अन्य प्रस्ताव को हटाना नहीं चाहता

यदि आप d[count]dकुछ अलग करने के लिए मैप करना चाहते हैं , तो टेक्स्ट को हटाने से कोई लेना-देना नहीं है, हम वह काम भी कर सकते हैं।

जब आप सामान्य मोड में कमांड टाइप कर रहे हों, और आप गलती से कमांड टाइप करना शुरू कर <Esc>दें , तो आप उस कमांड को रद्द करने के लिए हिट कर सकते हैं । वही आपके मैपिंग पर लागू होता है।

आइए d[count]dवर्तमान रेखा को जो कुछ भी [count]है उसे बदलते हैं ।

onoremap <expr> d (v:count == 0 \|\| v:operator != 'd') ? 'd' : '<Esc>cc' . v:count . '<Esc>'

मैपिंग का अंतिम भाग एक विमस्क्रिप्ट अभिव्यक्ति है <Esc>cc' . v:count . '<Esc>':। यह <Esc>लंबित dकमांड को रद्द करने के लिए , फिर ccवर्तमान लाइन को बदलने के लिए, (इंसर्ट मोड में) v:countका मान टाइप करने के लिए [count], और <Esc>सामान्य मोड पर लौटने के लिए है। ध्यान दें कि हम एक स्ट्रिंग यहाँ का निर्माण कर रहे VimScript संयोजन ऑपरेटर का उपयोग, .


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

हैप्पी विमिंग!


बहुत बढ़िया जवाब! Upvoted। मैंने सवाल के शुरू में अपने उपयोग के मामले (vi.SE पर भी) से लिंक किया था, लेकिन मुझे लगता है कि आप इसे याद कर रहे होंगे। मुझे मूल रूप से :omap d d(!) करने की आवश्यकता है , लेकिन दुर्भाग्य से ऑपरेटर-लंबित मोड वास्तव में डी के लिए मेरी मैपिंग की वजह से कभी नहीं पहुंचता है जो कस्टम नियामक फ़ंक्शन सेट करता है। उम्मीद है कि चीजों को बनाने के लिए d3dकाम करना संभव है, हालांकि यह कैसे होना चाहिए। (मुझे पता है कि क्या आपके पास कोई विचार है, या यदि आप चाहें तो दूसरे प्रश्न का पूर्ण समाधान पोस्ट करने के लिए स्वतंत्र महसूस करें।) यदि मैं जल्द ही इसका पता नहीं लगा सकता हूं, तो मैं इसे स्वीकार करूंगा और दूसरा, अधिक विशिष्ट प्रश्न पोस्ट करूंगा। धन्यवाद!
रिच

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