2012-03-14 9 views
5

को जोड़ता है मुझे समझ में नहीं आता कि ये आदेश अलग-अलग चीजें क्यों करते हैं।विम: "बार" से बचने वाले जो पूर्व आदेश

vimrc फ़ाइल में चिपकाया गया है, सामान्य में t दबाकर सक्रिय:

nnoremap t :call search('\m\(a\|b\)', 'W')<CR> 
nnoremap t :call search('\m\(a\\|b\)', 'W')<CR> 

कमांड लाइन में सीधे टाइप:

:call search('\m\(a\|b\)', 'W') 
:call search('\m\(a\\|b\)', 'W') 

विशिष्ट होने के लिए: "इरादा" व्यवहार में \\| की आवश्यकता है nnoremap उदाहरण, लेकिन call खोज उदाहरण में \| की आवश्यकता है।

मुझे पता है कि बार (:help :bar) का विशेष उपचार उन जाल में से एक है जो विम ने मेरे लिए रखा है, लेकिन यह अभी भी समझ में नहीं आता है। दस्तावेज़ीकरण स्पष्ट रूप से कहता है "आदेशों की यह सूची बार को उनके तर्क के हिस्से के रूप में देखेगी" लेकिन इनमें से कोई अपवाद यहां लागू नहीं होता है। इस उदाहरण में शामिल सभी आदेश मेटा कॉन्सटेनेट चरित्र के रूप में बार का इलाज करते हैं। इसके अलावा इस स्थिति में बार एक स्ट्रिंग के अंदर है और (मुझे लगता है?) स्ट्रिंग के हिस्से के रूप में पार्स किया जा रहा है मेटा कॉन्सटेनेट सिंटैक्स पर प्राथमिकता लेता है।

उत्तर

11

वास्तव में, यह समस्या बार वर्ण के विशेष उपचार मैपिंग-निर्माण आदेशों के कारण होती है।

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

क्योंकि बार चरित्र अगले पूर्व आदेश से एक मानचित्रण आदेश अलग करने के लिए, और इस प्रकार मानचित्रण के दाएँ हाथ की ओर से न खत्म होने वाली सीमा को परिभाषित करने के लिए किया जा सकता है, यह के रूप में है नहीं किया जा सकता एक महत्वपूर्ण अनुक्रम। :help map_bar के अनुसार, सेटिंग के आधार पर, एक बार चरित्र भाग निकले हो सकता है <bar>, \|, या ^V| के रूप में (जहां ^V को दर्शाता है शाब्दिक Ctrl +वी कुंजी कोड)।

ध्यान में रखते हुए कि, हमें विचाराधीन मैपिंग ( \|/\\| भाग के आसपास) जिस तरह से वे डिफ़ॉल्ट कॉन्फ़िगरेशन में व्याख्या कर रहे हैं अनुसरण करने दें। में पहली मैपिंग, \| अनुक्रम को एक | वर्ण के रूप में माना जाता है। इसलिए, के बाद कि मानचित्रण आदेश निष्पादित किया जाता है, दबाने t ही टाइपिंग

:call search('\m\(a|b\)', 'W')दर्ज

जब दूसरे मानचित्रण आदेश चला जाता है, \\| स्ट्रिंग के रूप में व्याख्या की है के रूप में किया जाएगा एक शाब्दिक बैकस्लैश चरित्र ( में मैपिंग के दाएं हाथ की तरफ, नेस्टेड वाले को छोड़कर) से बचने की आवश्यकता नहीं है) \| विनिर्देशक एक बार चरित्र का प्रतिनिधित्व करता है। तो, यह आदेश नक्शे को t निम्नलिखित:

:call search('\m\(a\|b\)', 'W')मैपिंग में

हालांकि, दर्ज करें जब एक प्रकार मैप की खोज कमांड लाइन मोड में कहता है, कुंजी दृश्यों के विपरीत, वे तुरंत पूर्व आदेश के रूप में व्याख्या की जाती है। उन बार वर्ण स्ट्रिंग अक्षर में होते हैं, इसलिए की संभावना नहीं है कि उन्हें पूर्व आदेशों के लिए विभाजक के रूप में गलत व्याख्या करें। जब सीधे टाइप किया गया, आदेशों को निष्पादन के रूप में भेजा जाता है जैसा कि वे लिखे गए हैं। इस प्रकार, अंतर उनके बीच काम में नियमित अभिव्यक्ति \m\(a\|b\) और \m\(a\\|b\) के अर्थ के कारण हैं, कुछ बचने के व्यवहार के कारण नहीं।

+0

इसे साफ़ करने के लिए धन्यवाद। मैंने निश्चित रूप से अनदेखा किया कि कैसे:: map' आदेशों को उनके तर्कों को बिना किसी सामग्री के देखे बिना उनके तर्कों को पार्स करना है। – Ein

7

आप vim के *map और command कमांड का उपयोग करते, vimscript इंजन आदेश की व्याख्या नहीं करता है - यह इसी रूप में इसका संग्रहीत करता है, एक कीस्ट्रोक अनुक्रम के रूप में (*map के मामले में) या एक स्ट्रिंग (command के मामले में) के रूप में। आदेश का उपयोग केवल तभी किया जाता है जब आप इसका उपयोग करते हैं।

उस वजह से, जब आप कमांड को मैप करते हैं, तो वीम वास्तव में नहीं जानता है कि आपका पाइप चरित्र स्ट्रिंग के अंदर है, क्योंकि वह कमांड में स्ट्रिंग्स नहीं है या नहीं, कम से कम उस चरण में नहीं है ।

यदि आप |*map में उपयोग करना चाहते हैं, तो आपको इसके बजाय <bar> का उपयोग करना होगा।

संबंधित मुद्दे